代码审计中XSS挖掘一些了解

打印 上一主题 下一主题

主题 895|帖子 895|积分 2685

0x01 XSS的挖掘思路

1.1 反射型

直接搜索 echo print_r print之类的函数即可也可以寻找$_GET变量来判断是否存在输出(不过对于代码审计来说除非着实挖不出漏洞,否则没必要关注反射xss)
[img=720,223.92]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406171639969.png[/img]

1.2 dom型

和反射型差不多必要看网站的前端javascript(一般安装好网页直接查看源代码即可,和反射xss一样代码审计没必要太过于关注)。但是也和反射型有区别,domxss是不经过服务器处理的,也就是不必要经过后端代码,必要审计javascript。
[img=720,120.96]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406171639970.png[/img]

1.3 存储型xss

对于代码审计,存储型xss才是必要关注的重点。
存储型xss一般是存在有数据库交互的地方,由于必要把数据写入进去数据库中才气长期储存数据。
以是我们在审计存储型xss的时候会关注数据库交互的地方。
这里举例两种思路:
思路一 : 从数据库类文件中开始审计

什么是数据库类文件呢?其着实实际开辟项目过程中,通常步伐员都会把数据库操作封装成一个类来提供操作。
好比说我们必要设计一个留言板,留言板最根本得有这几个功能吧。好比说发表留言,查看留言,复兴留言,删除留言,修改留言等等功能。
而这些是不是必要使用数据库来实现这类功能(下面用代码配合伪代码示意,注意代码可以不用明白功能,但是要可以大概明白代码为什么要这样写。)
  1. # 比如用户发表一条留言
  2. # uname就是用户名也就是"小明",content就是内容也就是"你好"
  3. insert into text(id, uname, content) value(1, '小明', '你好');
  4. # 然后用户发现你好不太恰当,想删掉替换成您好
  5. delete from text where id = 1;
  6. # id就是数据库用于区分不同数据的字段, delete from 表示删除表里面的内容
  7. text表示需要删除的表
  8. # 表示删除id=1的数据
  9. where id = 1
  10. # 那么php中的代码是这样看小明的:
  11. $sql = "insert into text(id, uname, content) value(1, '小明',
  12. '你好')";
  13. // $conn就是我们数据库的链接
  14. mysqli_query($conn, $sql);
  15. $sql = "delete from text where id = 1";
  16. mysqli_query($conn, $sql);
  17. // 小明换成了您好
  18. $sql = "insert into text(id, uname, content) value(2, '小明',
  19. '您好')";
  20. mysqli_query($conn, $sql);
  21. $sql = "delete from text where id = 2";
  22. mysqli_query($conn, $sql);
  23. # 这样的代码是不是特别麻烦 把他简化一下(把sql查询做成一个函数)
  24. function sql_insert($name, $content){
  25. $sql = "insert into text(id, uname, content) value(1, '{$name}',
  26. '{$content}',哈哈哈哈')";
  27. mysqli_query($conn,$sql);
  28. }
  29. function sql_delete($id){
  30. $sql = "delete from text where id = '{$id}'";
  31. mysqli_query($conn,$sql);
  32. }
  33. // 好的封装完成了 这时候小明发送你好
  34. sql_insert('小明', "你好");
  35. sql_delete(1); // 想删除
  36. // 发送您好
  37. sql_insert('小明', "您好");
  38. sql_delete(2); // 又删除
  39. # 这样是不是无论小明发多少条留言都能够很轻松的删除插入
  40. # 好了 这就是封装成的作用(把重复的操作放在一起)
  41. #
  42. 这里是写完了,但是还是有一个问题,比如遇到sql注入怎么办。遇到xss怎么办。
  43. # 很简单!只需要修改我们定义的两个操作函数即可
  44. function sql_insert($name, $content){
  45. $name = htmlspecialchars(addslashes($name));
  46. $content = htmlspecialchars(addslashes($content)); // 添加了转义
  47. $sql = "insert into text(id, uname, content) value(1, '{$name}',
  48. '{$content}')";
  49. mysqli_query($conn,$sql);
  50. }
  51. function sql_delete($id){
  52. $id = intval($id); // 强制转换
  53. $sql = "delete from text where id = '{$id}'";
  54. mysqli_query($conn,$sql);
  55. }
  56. #
  57. 是不是这样的写法很方便,如果我们不定义一个函数集中操作的话每次拼接sql语句都需要添加htmlspecialchars和addlashes
  58. #
  59. 这就是我们为什么要寻找数据库操作文件的意义。(因为程序员很有可能把过滤函数写在sql类中)
复制代码
好了,进入正题。 关于如何找到sql封装文件,很简单。
搜索关键字即可(new mysqli, mysqli,pdo)这里拿其他cms来实例(phpems架构比力复杂也就是上课时用的cms)这里我使用yixuncms_v2.0.3
打开文件,全局搜索
[img=720,275.76]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406171639971.png[/img]

第二步 分析文件的功能 查找必要的关键函数
[img=720,370.8]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406171639973.png[/img]

直接跟进query函数 查看是否有过滤
[img=720,323.28]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406171639974.png[/img]

右键定位函数 定位escape_string_array函数
[img=720,87.84]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406171639975.png[/img]

然后跟进审计
[img=720,327.6]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406171639976.png[/img]

思路二: 使用输出函数举举措态输出查看是否过滤

由于源代码在我们服务器上,我们可以使用echo或者var_dump查看过滤后的结果来判断过滤了什么。
由于我们不知道在步伐在哪个页面做了sql查询,以是选择登录功能作为测试点
由于可以知道一点,那就是登陆功能肯定是做了sql查询的,除非是前端登陆,而前端登陆本身也就是一个漏洞...
知道了这一点,登陆抓包,登陆账号密码有没有都没关系。
我这里使用错误的账号密码登陆:
[img=720,313.2]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406171639977.png[/img]

返回了一个操作失败
[img=720,86.4]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406171639978.png[/img]

然后我们根据提示去全局搜索: 操作失败
[img=720,434.88]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406171639979.png[/img]

至于为什么是这三个呢? 由于我们抓到的数据表访问的就是这个路径
[img=720,498.65429234338745]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406171639980.png[/img]

进入app.php
[img=720,334.8]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406171639981.png[/img]

然后定位getUserByUserName函数
[img=720,363.6]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406171639982.png[/img]

然后就可以添加代码举行调试了(修改后记得保存 快捷键 ctrl + s)
[img=720,76.32]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406171639983.png[/img]

再次发包举行调试发现已经返回sql语句了
[img=720,297.36]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406171639984.png[/img]

[img=720,287.28]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406171639985.png[/img]

思路在这里完结了。下面是漏洞复现
【----帮助网安学习,以下所有学习资料免费领!加vx:dctintin,备注 “博客园” 获取!】
 ① 网安学习成长路径思维导图
 ② 60+网安经典常用工具包
 ③ 100+SRC漏洞分析陈诉
 ④ 150+网安攻防实战技能电子书
 ⑤ 最权威CISSP 认证考试指南+题库
 ⑥ 超1800页CTF实战技巧手册
 ⑦ 最新网安大厂面试题合集(含答案)
 ⑧ APP客户端安全检测指南(安卓+IOS)
0x02 漏洞的复现

由于上面已经知道了xss和sql在平凡参数里面不存在,然后正常注册后登陆发现
[img=720,213.84]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406171639986.png[/img]

那么直接根据注册ip搜索
[img=720,81.36]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406171639987.png[/img]

跟进后再次全局搜索
[img=720,326.16]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406171639988.png[/img]

[img=720,97.2]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406171639989.png[/img]

[img=720,365.76]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406171639991.png[/img]

[img=720,339.84]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406171639992.png[/img]

由于步伐开辟中默认ip地点是安全的一般很少会举行过滤,以是这里直接猜测ip地点不存在过滤。
然后注册账号举行测试
payload:Client-ip:
[img=720,267.12]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406171639993.png[/img]

然后放包,发现个人中央已经存储了我们的xss
[img=720,423.5736677115988]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406171639994.png[/img]

[img=720,385.92]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406171639995.png[/img]

同理,这里没有经过过滤也是存在注入的。这里就不在演示
0x03 总结

xss加固可以在前端或者后端实体编码 同时也要注意对单双引号的转义。
不要以为获取ip就是安全的,获取ip往往是不安全的。
思路 -》 找过滤函数 -》测试过滤是否有遗漏 -》 测试可能没有经过过滤的参数
有些网站会把在属性内的参数使用反斜杠编码.好比你输入 &url="onerror=alert(1) 双引号会被转义成/",这时如果网站的编码是gb2312...之类的可以使用宽字节 %df"的方式绕过
[img=720,137.8909090909091]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406171639996.png[/img]

[img=720,395.28]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202406171639997.png[/img]

更多网安技能的在线实训练习,请点击这里>>
  

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

钜形不锈钢水箱

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表