简单测试
1.1、环境搭建
测试环境:
在官⽹下载好源码包,解压后访问upload⽬录,根据提示安装好测试环境,即可进⼊后台⻚⾯
1.2、测试XSS
后台可以新增内容,先试试增加⼀篇⽂章,这⾥框写的是<script>alert(1)</script>
然后发现⻚⾯⾃动跳转到了⽂章列表⻚,并弹出1
打开前台⻚⾯,发现也有弹框1,是⼀个存储型的XSS漏洞
源码分析
2.1、如何保存到数据库
使⽤Seay代码审计系统对⽹站源码进⾏⾃动审计,通过软件提供的Mysql监控功能,发现新建 这篇⽂章时,执⾏的SQL语句,除了⽂章描述部分的<>被转化成了实体字符,其他如title处的<script>alert(1)</script>都被完整插⼊数据库中
查看admin/article.php源码进⾏分析,看起来似乎代码并没有对$_POST传递的值进⾏过滤
实际上,admin/article.php在最开始引⼊了/inculde/init .php⽂件
⽽在admin/inculde/init .php⽂件中,实例化了Check()与Firewall这两个类,调⽤了dou_firewall()⽅法
这两个类是通过include/check.class.php 与 include/firewall.class.php这两个⽂件来引⼊,数据的过滤⽅法就在这⾥。
其中,include/check.class.php⽂件的is_number⽅法,使⽤正则对参数进⾏了过滤,确保传递的 参数是数字
在admin/article.php中调⽤了该⽅法,确保cat _id参数是数字
include/firewall.class.php这个⽂件中,dou_firewall() 调⽤了dou_magic_quot es()⽅法
dou_magic_quotes()⽅法的作⽤,是在magic_quotes_gpc没有开启时,调⽤addslashes_deep()⽅法
addslashes_deep()⽅法的作⽤,是通过递归的⽅式,利⽤addslashes()函数对' " \等特殊字符进⾏转义,问题应该就是出在这⾥,函数并未对<>/()这些特殊字符进⾏转义,导致
<script>alert(1)</script>被完整保存到数据库中
2.2、如何调⽤数据
点击⽂章列表时会弹窗,回头再看admin/article.php中的⽂章列表模块源码,将$row['title'] 赋值给"title",未过滤
通过实例化的对象$smarty来调⽤调⽤assign⽅法,未过滤
最后在admin/templat es/article.htm中直接取得$article.title的值,未过滤
最终导致了存储型XSS的产⽣
总结
只是整理了下XSS的思路,还请各位师傅指正。