存储型XSS审计
如何引发的 Xss漏洞
🎈在一个项目中寻找XSS漏洞,个人认为需要找到一个用户的输入点,且这个输入点会在客户端返回一个输出,其实就是用户输入一个JS标签alert(1)在浏览器中直接执行了(后台没有进行过滤)。
记录审计思路,审计CMS(ZZCMS)
不记录审计细节。
一、在项目文件 zt/show.php中发现目标
在show.php中找到echo这个函数,最终相关的变量,最终选择了gsjj,因为这是一个和用户最紧密的字段,后续跟踪进行解释。
二、gsjj变量追踪
追踪这个变量要注意变量接收的参数用户是否可控。
继续进入stripfxg这个函数中进行查看,看整个交互过程。
跟进去发现是这样一个函数:
下面看看这个函数是如何执行的:
传入的参数是 content变量和true,所以执行的是下面这一个if
if ($htmlspecialchars_decode==true){
$string=htmlspecialchars_decode($string);//转html实体符号
}
htmlspecialchars这个函数可以把html实体转化为字符,htmlspecialchars_decode顾名思义解码,写一个代码例子:
<?php
$a="<srcipt>alert(1)</srcipt>";
$string = htmlspecialchars($a); //把html实体转为字符
echo 'htmlspecialchars函数:'.$string;
$s = htmlspecialchars_decode($string); //字符实体还原
echo "htmlspecialchars_decode函数:".$s;
在浏览器的打印两个函数分别操作后的结果,就一目了然了:
这里可以得出结论,就算内部存在对XSS过滤的htmlspecialchars函数,只要在其后执行了stripfxg这个方法,就可以无视哪些过滤。
继续下一步。
三、content变量追踪 top.php
在查找时发现在show.php这个文件中没有content这个变量的定义,把目标移向include包含的文件中,最后找到top.php
在top.php追踪content
48行row变量又是一个转折点
对整个文件进行分析,数据可能在数据库中进行了中转如下图:
这串代码分析的结果是,存在数据库的数据判断(用户信息),判断与否操作把数据进行提取,这个情况需要找到数据库中和用户绑定的更新语句
在usermodify.php追踪content
ctrl+shift+r全局查找update:
最后跟进方法usermodify.php:
在这个文件中需要满足一个if条件才能进入这部分的数据更新
action的传参位置
下面直接抓包调试:
最终发现停在了checkadminisdo这个方法里直接提示无法找到指定用户
这个时候要把思路装换,注册一个用户,但是现在的文件在admin中,这个权限是不能注册的,只能去寻找普通用户的界面,看是否存在相同的字段操作,当然也有别的操作。
四、尝试是否可以使用普通用户操作字段
发现user/manage.php同一个判断
找到content变量:
抓包进行代码测试
此处的action是get请求
代码调试结果
成功绕过这个判断。
最后执行到目标语句。
修改content加入下面的js代码
<script>alert('xss')</script>
最终结果:
在burp抓包访问时,若出现提示非法字符不执行,在url中任意给一个参数a=siteconfig.php。