1.2 dom型
和反射型差不多须要看网站的前端javascript(一样平常安装好网页直接查看源代码即可,和反射xss一样代码审计没必要太过于关注)。但是也和反射型有差异,domxss是不经由做事器处理的,也便是不须要经由后端代码,须要审计javascript。
1.3 存储型xss
对付代码审计,存储型xss才是须要关注的重点。
存储型xss一样平常是存在有数据库交互的地方,由于须要把数据写入进去数据库中才能长期储存数据。

以是我们在审计存储型xss的时候会关注数据库交互的地方。
这里举例两种思路:
思路一 : 从数据库类文件中开始审计什么是数据库类文件呢?其实在实际开拓项目过程中,常日程序员都会把数据库操作封装成一个类来供应操作。
比如说我们须要设计一个留言板,留言板最基本得有这几个功能吧。比如说揭橥留言,查看留言,回答留言,删除留言,修正留言等等功能。
而这些是不是须要利用数据库来实现这类功能(下面用代码合营伪代码示意,把稳代码可以不用理解功能,但是要能够理解代码为什么要这样写。)
# 比如用户揭橥一条留言# uname便是用户名也便是"小明",content便是内容也便是"你好"insert into text(id, uname, content) value(1, '小明', '你好');# 然后用户创造你好不太恰当,想删掉更换成您好delete from text where id = 1;# id便是数据库用于区分不同数据的字段, delete from 表示删除表里面的内容text表示须要删除的表# 表示删除id=1的数据where id = 1# 那么php中的代码是这样看小明的:$sql = "insert into text(id, uname, content) value(1, '小明','你好')";// $conn便是我们数据库的链接mysqli_query($conn, $sql);$sql = "delete from text where id = 1";mysqli_query($conn, $sql);// 小明换成了您好$sql = "insert into text(id, uname, content) value(2, '小明','您好')";mysqli_query($conn, $sql);$sql = "delete from text where id = 2";mysqli_query($conn, $sql);# 这样的代码是不是特殊麻烦 把他简化一下(把sql查询做成一个函数)function sql_insert($name, $content){$sql = "insert into text(id, uname, content) value(1, '{$name}','{$content}',哈哈哈哈')";mysqli_query($conn,$sql);}function sql_delete($id){$sql = "delete from text where id = '{$id}'";mysqli_query($conn,$sql);}// 好的封装完成了 这时候小明发送你好sql_insert('小明', "你好");sql_delete(1); // 想删除// 发送您好sql_insert('小明', "您好");sql_delete(2); // 又删除# 这样是不是无论小明发多少条留言都能够很轻松的删除插入# 好了 这便是封装成的浸染(把重复的操作放在一起)#这里是写完了,但是还是有一个问题,比如碰着sql注入怎么办。碰着xss怎么办。# 很大略!
只须要修正我们定义的两个操作函数即可function sql_insert($name, $content){$name = htmlspecialchars(addslashes($name));$content = htmlspecialchars(addslashes($content)); // 添加了转义$sql = "insert into text(id, uname, content) value(1, '{$name}','{$content}')";mysqli_query($conn,$sql);}function sql_delete($id){$id = intval($id); // 逼迫转换$sql = "delete from text where id = '{$id}'";mysqli_query($conn,$sql);}#是不是这样的写法很方便,如果我们不定义一个函数集中操作的话每次拼接sql语句都须要添加htmlspecialchars和addlashes#这便是我们为什么要探求数据库操作文件的意义。(由于程序员很有可能把过滤函数写在sql类中)
好了,进入正题。 关于如何找到sql封装文件,很大略。
搜索关键字即可(new mysqli, mysqli,pdo)这里拿其他cms来实例(phpems架构比较繁芜也便是上课时用的cms)这里我利用yixuncms_v2.0.3
打开文件,全局搜索
第二步 剖析文件的功能 查找须要的关键函数
直接跟进query函数 查看是否有过滤
右键定位函数 定位escape_string_array函数
然后跟进审计
思路二: 利用输出函数进行动态输出查看是否过滤
由于源代码在我们做事器上,我们可以利用echo或者var_dump查看过滤后的结果来判断过滤了什么。
由于我们不知道在程序在哪个页面做了sql查询,以是选择登录功能作为测试点
由于可以知道一点,那便是上岸功能一定是做了sql查询的,除非是前端上岸,而前端上岸本身也便是一个漏洞...
知道了这一点,上岸抓包,上岸账号密码有没有都不要紧。
我这里利用缺点的账号密码上岸:
返回了一个操作失落败
然后我们根据提示去全局搜索: 操作失落败
至于为什么是这三个呢? 由于我们抓到的数据表访问的便是这个路径
进入app.php
然后定位getUserByUserName函数
然后就可以添加代码进行调试了(修正后记得保存 快捷键 ctrl + s)
再次发包进行调试创造已经返回sql语句了
思路在这里完结了。下面是漏洞复现
【----帮助网安学习,须要网安学习资料关注我,私信回答“资料”免费获取----】① 网安学习发展路径思维导图② 60+网安经典常用工具包③ 100+SRC漏洞剖析报告④ 150+网安攻防实战技能电子书⑤ 最威信CISSP 认证考试指南+题库⑥ 超1800页CTF实战技巧手册⑦ 最新网安大厂口试题合集(含答案)⑧ APP客户端安全检测指南(安卓+IOS)
0x02 漏洞的复现由于上面已经知道了xss和sql在普通参数里面不存在,然后正常注册后上岸创造
那么直接根据注册ip搜索
跟进后再次全局搜索
由于程序开拓中默认ip地址是安全的一样平常很少会进行过滤,以是这里直接预测ip地址不存在过滤。
然后注册账号进行测试
payload:Client-ip: <svg/onload=alert(1)>
然后放包,创造个人中央已经存储了我们的xss
同理,这里没有经由过滤也是存在注入的。这里就不在演示
0x03 总结xss加固可以在前端或者后端实体编码 同时也要把稳对单双引号的转义。
不要以为获取ip便是安全的,获取ip每每是不屈安的。
思路 -》 找过滤函数 -》测试过滤是否有遗漏 -》 测试可能没有经由过滤的参数
有些网站会把在属性内的参数利用反斜杠编码.比如你输入 &url="onerror=alert(1) 双引号会被转义成/",这时如果网站的编码是gb2312...之类的可以利用宽字节 %df"的办法绕过