今天学习手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的表了
接下来在home文件夹底下新建个文件
接着访问一下
0x01正文
接下来就开始正式的来走了,建议各位审计的时候搭配上XDEBUG便于分析流程。
先跟进I()其指向ThinkPHP\Common\functions.php
在经过这里时,存在处过滤
$filters = isset($filter) ? $filter : C('DEFAULT_FILTER');这里将会获得常量
'DEFAULT_FILTER' => 'htmlspecialchars'
//htmlspecialchars() 函数会把预定义的字符转换为 HTML 实体
接着会往下进行参数过滤
将会把下图中函数置换为空
/^(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($options['where'], $key);
这个地方就对参数进行了强转。由于id是int类型的所以说会被intval()强制转换成数字
若我们采用id[where]的形式,则不会进入到if()之中也就绕过了此处过滤。
接着就返回到find()被select()调用,其在ThinkPHP\Library\Think\Db\Driver.class.php
然后进入buildSelectSql()再到parseSql()
然后进parseWhere()
最后走query()执行。就over了