ZZCMS201910审计——存储XSS漏洞
- 在函数集成文件…/inc/function.php中发现如下代码:由此猜测若存在调用此函数的地方,可能会出现sql或者xss注入的存在;下一步应该全局查找存在调用此函数,且第二个参数为true的地方;(shift+ctrl+F)
function stripfxg($string,$htmlspecialchars_decode=false,$nl2br=false) {
//去反斜杠
$string=stripslashes($string);//去反斜杠,不开get_magic_quotes_gpc 的情况下,在stopsqlin中都加上了,这里要去了
if ($htmlspecialchars_decode==true){
$string=htmlspecialchars_decode($string);//转html实体符号
}
if ($nl2br==true){
$string=nl2br($string);
}
return $string;
}
/*如上stripfxg函数需要三个参数:
1、首先将参数string进行剥离反斜杠,目的是传入传入变量参数处的addslashes函数对sql的一些字符添加了反斜杠进行转义;例如传入id=1' 服务器接收的是id=1\'
若传入的变量id的值再被该函数过滤,那么恢复原状 id=1
2、若函数调用第参数为true,则进入第一个if语句用htmlspecialchars_decode函数对数据进行过滤,目的和上面一样,为了将xss注入的一些字符转义后恢复原状,例如 < 被转回原状 <
3、第三个参数对应换行功能,不重要;最后函数返回值为恢复过的字符串;
例如url中: " zzcms/inc/test.php?id=<script>1'' "
服务器接收为: " <xss>1\'\ "
若调用该函数:服务器接收为: " <script>1'' "
*/
2.在文件…/zt/show.php中:逻辑是找到对应变量是否可控和被打印输出。这一步找到了gsjj变量是可以被打印的;content值是来自于一句sql查询里面某个字段的值,且通过url传入参数id可以被打印出来;
$gsjj=$gsjj. stripfxg($content,true);
//全局发现上面语句(验证了content可能可控和gsjj可打印);同时变量gsjj视乎都是具体html字符串变量;
//之后要判断gsjj是否可打印输出;ctrl+f逐个搜索gsjj,几乎跳到本文件的最下方:出现以下代码:
$strout=str_replace("{#gsjj}",$gsjj,$strout);
echo $strout;
//可见变量strout若存在 " {#gsjj} "字符串,该字符串会被变量gsjj所覆盖; 至于旧的strout变量视乎很多,但是感觉有点是集成化的html字符串,所以可以假设这里大概率会被覆盖; 最后echo出变量strout;由此可见该变量可以被输出。
//之后找变量content:本文件没有,但是在include文件里找到了在top.php文件中:
$rs=query($sql);
$row=num_rows($rs); //获取行数
if (!$row