今天学习手tp3.2.3的sql注入漏洞

0x00预先准备

先从github下载下thinkphp3.2.3的代码
https://github.com/top-think/thinkphp/archive/refs/tags/3.2.3.zip

接下来去ThinkPHP\conf\convention.php配置数据库,这里我直接拿sqli-labs的表了
90387-fgemiv2910a.png

57270-s61erstl8k9.png

接下来在home文件夹底下新建个文件
43112-4zpzv0wdhvl.png

接着访问一下
69094-3ftjv4i5q9i.png

0x01正文

接下来就开始正式的来走了,建议各位审计的时候搭配上XDEBUG便于分析流程。
先跟进I()其指向ThinkPHP\Common\functions.php
在经过这里时,存在处过滤
19938-3ivv7d05zbj.png

$filters = isset($filter) ? $filter : C('DEFAULT_FILTER');这里将会获得常量
'DEFAULT_FILTER' => 'htmlspecialchars'
//htmlspecialchars() 函数会把预定义的字符转换为 HTML 实体
13283-j5yznw56iib.png

91743-ut1i1vdodt.png

接着会往下进行参数过滤
13857-swqksrgxtb.png

将会把下图中函数置换为空

/^(EXP|NEQ|GT|EGT|LT|ELT|OR|XOR|LIKE|NOTLIKE|NOT BETWEEN|NOTBETWEEN|BETWEEN|NOTIN|NOT IN|IN)$/i

87732-3hhya85kba9.png

I()的过滤就到这了。接下来往下跟find()
其指向\ThinkPHP\Library\Think\Model.class.php
下面这个比较关键

 $options = $this->_parseOptions($options);

30618-zhv4gtbq2e.png

若是正常用?id=0%20union%20select%201,database(),3的话,会进入这个if
53563-7yx33780w7n.png

然后会进入到$this->_parseType($options['where'], $key);
这个地方就对参数进行了强转。由于id是int类型的所以说会被intval()强制转换成数字
48754-zrf1ke0p25q.png

92571-163hdbqx1cy.png

21400-kr8bwipe7u.png

若我们采用id[where]的形式,则不会进入到if()之中也就绕过了此处过滤。
80058-nvwwni0rq4s.png

接着就返回到find()被select()调用,其在ThinkPHP\Library\Think\Db\Driver.class.php
34783-gfogq0ifaw.png

98074-e0g591nobwb.png

然后进入buildSelectSql()再到parseSql()
74732-c8bejzlfiqg.png

然后进parseWhere()

78294-3d4oq8p04sl.png

68831-7ilbgjkii0y.png

最后走query()执行。就over了

发表评论