回顾 XSS 漏洞原理和防御的知识
XSS 漏洞原理
XSS 通过构造的代码(JavaScript)注入到网页中,并由浏览器解释运行这段JS 代码,以达到恶意攻击的效果。当用户访问被 XSS 脚本注入过的网页,XSS 脚本就会被提取出来,用户浏览器就会解析执行这段代码
关键点:输入的内容服务器是否原样返回(未被编码、过滤等)
XSS 防御
XSS 过滤器的作用是过滤用户(浏览器客户端)提交的有害信息,从而达到防范XSS 攻击的效果。
输入过滤
输入验证
- 仅接受指定长度;
- 仅包含合法字符;
- 仅接收指定范围;
- 特殊的格式,例如,email、IP 地址。
数据消毒
净化或过滤有害输入
<?php
// echo $_GET['keywords'];
$keywords = $_GET['keywords'];
$keywords = strtolower($keywords);
$keywords = str_replace("on", "", $keywords);
$keywords = str_replace("<script>", "", $keywords);
$keywords = str_replace("<", "", $keywords);
$keywords = str_replace(">", "", $keywords);
echo $keywords;
?>
输出编码
将特殊字符转换为 HTML 实体,从而可以在 HTML 页面中安全地显示这些字符,避免被误解为 HTML 标记或 JavaScript 代码
$keywords = htmlspecialchars( $_GET[ 'keywords' ] );
黑白名单策略
不管是采用输入过滤还是输出编码,都是针对用户提交的信息进行黑、白名单式的过滤:
- 黑名单:非允许的内容
- 白名单:允许的内容
漏洞验证(DVWA 为例)
若输入的内容没有被过滤、实体编码,原样返回则说明存在 XSS 漏洞
存在 XSS 漏洞
poc:
<script>alert(/gjl/)</script>
但如果直接使用 poc 验证很容易被 waf 等防御措施发现 XSS 攻击的特征,从而封掉 ip 等
可以验证输入的内容是否原样返回
如提交测试内容
a1>/)
查看返回页面的源代码,未被过滤或转义,则存在 XSS
不存在 XSS 漏洞
将难度调为 impossible
输入测试内容
a1>/)
查看其源代码
发现关键字符被 HTML 实体编码,说明此 XSS 漏洞不可利用