记一次堆叠注入

首先,方法是取巧得,并不适用所有情况

有源码,晓得数据库数据表结构

首先有这个一个注入,目标框架ThinkPHP 3.2.3

注入参数pid

1617873494300

但是后面添加)之后,直接被拦截

1617873589460

可以看到就是百度rasp

测试拦截规则

待检测得字符串长度

在不超过八个字符长度时,不做拦截,此条件优先级应该较高

情况如下

1617873711413

大于等于八个字符时,字符串会进入到else语句进行正则匹配

1617873784517

这种应该属于,类似正则如下'(.*)\(,即会被拦截

测试规则

跟随单引号同时出现的

比如select、insert into updatexml

不会被拦截

1617874073473

但是,会拦截完整语法

比如 select 1 from

1617874148786

当完整的语句不跟随单引号出现时,并不会受到拦截

所以单引号是一个很关键的点

1617874228988

其实应该存在不少其他fuzz绕过的方法

这里不做测试

回到漏洞本身

看以看到,sql语句中引用了两次我们传入的参数

1617874343904

这就很容易的想到一个方式,就是不输入单引号,通过反斜杠转义,逃逸一个单引号即可

现在橙色部分就是一个参数,所以会爆后面的88888位置的错误

1617874767520

其实这个时候还是检测函数的

1617875470743

所以这个时候要测试一下,是过滤了所有的[a-zA-Z0-9](.*)\(还是仅仅过滤了常见的函数

可以看到,过滤的是常见的函数

1617875506920

那么就可以构造语句了,堆叠注入的语句

发现继续被拦截

猜测可能是0x被拦截

1617875610241

可以换其他的函数,比如char

成功绕过

1617875646608

end

最主要的还是存在两个条件,其实跟rasp没啥关系