今天学习手tp3.2.3的sql注入漏洞
先从github下载下thinkphp3.2.3的代码 https://github.com/top-think/thinkphp/archive/refs/tags/3.2.3.zip
接下来去ThinkPHP\conf\convention.php配置数据库,这里我直接拿sqli-labs的表了
接下来在home文件夹底下新建个文件
接着访问一下
接下来就开始正式的来走了,建议各位审计的时候搭配上XDEBUG便于分析流程。 先跟进I()其指向ThinkPHP\Common\functions.php 在经过这里时,存在处过滤
filters = isset(filter) ?
接着会往下进行参数过滤
将会把下图中函数置换为空
/^(EXP|NEQ|GT|EGT|LT|ELT|OR|XOR|LIKE|NOTLIKE|NOT BETWEEN|NOTBETWEEN|BETWEEN|NOTIN|NOT IN|IN)$/i
I()的过滤就到这了。接下来往下跟find() 其指向\ThinkPHP\Library\Think\Model.class.php 下面这个比较关键
$options = $this->_parseOptions($options);
若是正常用?id=0%20union%20select%201,database(),3的话,会进入这个if
然后会进入到this->_parseType(
若我们采用id[where]的形式,则不会进入到if()之中也就绕过了此处过滤。
接着就返回到find()被select()调用,其在ThinkPHP\Library\Think\Db\Driver.class.php
然后进入buildSelectSql()再到parseSql()
然后进parseWhere()
最后走query()执行。就over了