反射型XSS
什么是XSS
跨站脚本攻击,相当于再代买中注入恶意的脚本,当用户访问页面时,再浏览中出发并解析代码,完成攻击
分为反射型XSS、存储型XSS、Dom型XSS
常用的构造语句
注意:下列代码中的空格要去掉
- < script>alert(‘xss’)< /script>
- '>< script>alert(document.cookie)< /script>
- < IFRAME SRC=javascript:alert(‘xss’)< / IFRAME >//框架注入
- “>< BODY ONLOAD=“a();”>< script>function a(){alert(‘XSS’);}< /script><”
- < A HREF=http://127.0.0.1/phpinfo.php>link</ A>//链接注入
- < img src=1 οnerrοr=alert(2)>
- < script>confirm(‘xss’)< /script>
反射型XSS-Reflected
low等级
- 先随意输入一个字符,‘z’
- 输入构造语句
- 出现弹窗
- 查看源码分析
medium等级
- 查看源码分析
- str_replace()字符替换,替换时区分大小写
- 可以通过双写绕过
- z<sc< script>ript>alert(document.cookie)</ script>
- 查看与网站cookie一致
- 大写绕过
High等级
- 查看源代码分析
- preg_repalce,执行一个正则表达式的搜索和替换
- 代码的意思是无数次的匹配大小写
- 发现过滤了script整个标签
- 所以构造不包含script的语句
- <img src=1 οnerrοr=alert(‘zxh’)>
Impossible等级
- 查看源代码分析
- htmlspecialchars()函数把预定义的字符转换成HTML实体
- 让<、>变成实体能够完全防御XSS
Dom型XSS
是通过url传入参数去控制触发的
low等级
- 通过url传入构造语句
- 成功弹窗
medium等级
- 打开源码分析
- stripos()函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)
- 相关函数:strpos()函数查找字符串在另一字符串中第一次出现的位置(区分大小写)
- 根据代码发现其过滤了<script的大小写
- 使用<img ,发现不成功
- 打开网页源代码,应该是<select 未闭合
- 输入</ select><img src=1 οnerrοr=alert(‘zxh’)>
High等级
- 查看源代码分析
- 想办法如何绕过这个PHP文件
- 利用PHP与HTML的逻辑漏洞
- PHP中的注释符号有//、#、/**/
- html中只有<!–
- url输入#< script>alert(‘zxh’)< /script>
- 没有直接弹窗
- 但是url上的语句已经注入成功
- 需要你再次select后
- 再次注入
- 才能有English#这个select
- 弹窗成功
Impossible等级
- 查看代码分析
- 开启了客户端的XSS筛选器
存储型XSS-Stored
low等级
- 查看代码分析
- 没有任何防御
- 直接构造语句
- 它会存储到你的数据库里,每次访问都会弹窗
- 清楚数据
medium等级
- addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。
- 预定义字符是:
- 单引号(’)
- 双引号(")
- 反斜杠(\)
- NULL
- strip_tags() 函数剥去字符串中的 HTML、XML 以及 PHP 的标签。
- 注释:该函数始终会剥离 HTML 注释。这点无法通过 allow 参数改变。
- 注释:该函数是二进制安全的。
- 看到最后发现在$message使用了htmlspecialchars()
- 所以message没法注入了
- $name上只是做了简单的过滤
- 所以在$name上构造语句
- $name = str_replace( ‘< script>’, ‘’, $name );
- 过滤了<script
- 还发现限制了长度
- 打开开发者工具
- 修改maxlength的值
- 重新输入构造语句
High等级
- 查看代码分析
- 一样是直接防御了$message
- $name过滤了所有的<script
Impossible等级
- 查看代码分析
- 两个参数都防御住了