Thinkphp 3.2.3 parseWhere设计缺陷导致的exp注入 (二)

继续上面的内容,那么所以我们知道了I方法是不可以进行注入的,其实肯定还会有疑惑,为什么加了空格就不可以进行注入了,那么继续分析

这里代码为:用原生的接收方式来进行接收,这里用GET传参的方式来接收

$id = $_GET['id'];
$data = M('user')->where(array('id'=>$id))->find();

payload:http://tp32.com/index.php/home/index/test01?id[0]=exp&id[1]==1%20and%20updatexml(1,concat(0x7e,database(),0x7e),1)

继续下断点分析

继续跟,首先在M方法里面就做了一件事情,就是触发自动加载机制给我们返回一个实例化了一个数据库类的对象来提供我们之后的查询操作

紧接着进入where方法中,上面进行了对传入参数$where类型的判断,然后将$where合并到了options['where']中,然后进行返回

紧接着,进入到find方法中

经过两个判断类型之后来到 _parseOptions 方法中,_parseOptions中主要进行的就是 字段的验证,这里字段是id 所以没有进行类似的过滤操作

最后跳出 parseOptions 然后来到 db类中的 select 方法,传入的参数为 options 数组

跟进 select方法中,再进入 parseBind 方法中,没有啥影响

再接着进入到 buildSelectSql 的方法

buildSelectSql 方法中 继续进到 parseSql

接着进入到parseWhere方法中

上面的判断都不符合,继续进到 parseWhereItem 的方法中,这里就称为该函数为 where子单元分析

最后到了对exp的表达式的处理,这里进行了拼接,我们的payload id[0]=exp&id[1]==1 and updatexml(1,concat(0x7e,database(),0x7e),1),那么就会拼接为:id=1 and updatexml(1,concat(0x7e,database(),0x7e),1)

继续走,这里还会继续在后面拼接AND,但是后面就有截断掉

这些流程全部都是在parseWhere中进行处理的,最后进行返回处理完的字符串

最后进行query查询操作,完成注入!

原文地址:https://www.cnblogs.com/zpchcbd/p/12546004.html