xss常见套路
对于xss,实际上就是把我们提交上去的数据当做代码执行,对于这种实际上有很多种情况可以攻击,下面具体介绍一些常用的套路。
先看一些小trik
很多HTML标记中的属性都支持javascript:[code]伪协议的形式.
;)
如果XSS Filter仅仅把敏感的输入字符列入黑名单处理,用户可以利用空格、回车和Tab键绕过限制:
对于普通HTML标记的属性进行过滤的可以通过编码处理来绕过,因为HTML中属性值本身支持ASCII码形式.
替换为如下形式 替换成ascii 加ascii就表示对应的
t的ascii值为116,用t表示 而:则用:
另外,Tab符的ASCII码为 、换行符的
、回车符的
可以插入到代码中任何地方.
假设用户不能依靠属性值进行跨站,可以通过事件来解决
如:
读取错误 引发onerror,可以用的事件还有很多
使用with绕过点的过滤,with表示对类型的封装,作用域内可以直接访问它的.成员
var a={},a.name='张三';a.sex='女'; //常用来获取document.cookie等
with(a){
console.log(name);
console.log(sex);
}
1. 闭合标签或者表达式
代码中获取我们提交的数据,但是是在表达式或者函数中等,请看例子
function escape(s) {
return '';
}
我们输入的字符串被添加到console中执行,但是我们可以特殊构造s,闭合函数,然后执行alert
function escape(s) {
return '';
}
1");alert(1)//
1");alert(1);("
可以成功执行了。
2. 过滤" -加\
function escape(s) {
s = s.replace(/"/g, '\\"');
return '';
}
将数据中的“进行转义,我们可在再次添加\转义它的\,使得”逃逸
\");alert(1);//
3.全字符转义 -闭合标签
function escape(s) {
s = JSON.stringify(s);
return '';
}
将我们输入的全部识别为字符串,不会包含特殊字符,但是可以使用闭合标签的方法。
");alert(1)//
//全是字符形式的
"); //报错 但是可以执行
4.html参数获取 - url编码
function escape(s) {
var url = 'javascript:console.log(' + JSON.stringify(s) + ')';
console.log(url);
var a = document.createElement('a');
a.href = url;
document.body.appendChild(a);
a.click();
}
大概的意思就是把获取的经过转义的字符串作为元素a的href
/a>
//这里的话我们可以使用html编码的%22=" 绕过JSON.stringify
s=%22)alert(1)//
/a>
//得到的如下
/a>
CSRF概念:CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解:
攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。 原理如下:攻击者只是借用了你的信息去攻击其他网站
原理:攻击者在自己的网页中构造特殊的请求,当受害者访问时会执行特殊请求,被攻击者利用了。跟xss一个类似的是,我们在其中嵌入特殊信息,用来别人访问时执行。但是有一些问题:refer参数是攻击者的refer,攻击者利用的参数等是受害者的。
防御:验证 HTTP Referer 字段;在请求地址中添加 token 并验证;在 HTTP 头中自定义属性并验证。
验证 HTTP Referer 字段
在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。在通常情况下,访问一个安全受限页面的请求来自于同一个网站。
在请求地址中添加 token 并验证
CSRF 攻击之所以能够成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于 cookie 中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的 cookie 来通过安全验证。要抵御 CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。
在 HTTP 头中自定义属性并验证
这种方法也是使用 token 并进行验证,和上一种方法不同的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。这样解决了上种方法在请求中加入 token 的不便,同时,通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。
常见的一种类型是给你一个输入框,提交信息然偶服务器后台会使用机器人访问,给出响应,一般为了减少大量的请求,会采用验证码等
http://zzm.cat/xss2/ 例题1
我们看请求的响应头有
说明是不允许的跨域的,思路是写一个脚本,然后在本地用另一个脚本加载就可以访问了。
师傅给的代码
我们看一下那个文件的内容,可以看到文件被执行了
http://zzm.cat/xss2/reports/b7aqslen7nma6pivd21gfme670.php
针对这种情况,页面有一些原生的脚本,可能是这样写的
如果能在上边插入
(只有正确的nonce才能用)
(有的网站设置**refer什么的字段,可以不带refer字段进行请求)
典型的特征是
当前所看到的页面是从多个不同的域中得到的,简单来说就是从不同网站得到的。然而在正常的访问中,是不会允许这样的从一个网站去获取另外一个网站的信息。就CORS而言,使用它的根本原因就是要完成资源的跨域访问,也就是如何绕过Same-origin Policy。
Same-origin Policy是同源策略SOP,简单地说,在一个浏览器中访问的网站不能访问另一个网站中的数据,除非这两个网站具有相同的Origin,也即是拥有相同的协议、主机地址以及端口。一旦这三项数据中有一项不同,那么该资源就将被认为是从不同的Origin得来的,进而不被允许访问。
同源策略的具体表现举例:当attacker.me试图获取victim.me下的资源,浏览器会阻止返回该资源。
当然,解决这个问题也是有意义的,例如一个网站有不同的域,却不能互相通信;其二确实不同网站之间有时也需要交互。有三种方法,
第一个是修改文档域:
document.domain = ‘ambergarden.com’;
同一主域的不同子域可以设置document.domain为主域来让他们同域,并且子域的协议和端口都要一致。
第二就是通过事件与处理函数来跨域: 最后就是我们要说的CORS,实际上就是通过一些请求和响应头来代替策略。如果我们跨域访问一个网站,响应包含如下头: Access-Control-Allow-Origin: http://ambergarden.com
说明允许跨域,并且不考虑策略,但是为了限制使用,分三种情况。最简单的就是普通的simple request。如果在请求的字段中包含
任何自定义请求头, 那么就是Preflighted Request。
如果更过分的包含当前网站的用户凭证,那么其就属于Requests with Credential,这是为了加强保护,防止攻击和利用的。
JSONP跨域巧妙的利用了script标签能跨域的特点,实现了json的跨域传输。
当这个接口没有验证Referer头的时候,就存在JSONP劫持漏洞,即在任何域下都能窃取到传输的数据。
当接口返回的是一些敏感数据时(如CSRF TOKEN,用户个人信息等),我们也可以获取这个信息。
header("Access-Control-Allow-Origin: http://attacker.me");
而CORS跨域请求,需要对方网站事先设置一个白名单,当跨域访问时查看名单,如果包含那么就允许跨域。
此时是没有携带cookie的,如果需要支持cookie,还需要服务端配置:
header("Access-Control-Allow-Credentials: true");
还有一种特殊情况,就是Access-Control-Allow-Origin设置成通配符”*”时,表示允许任何域名跨源。
如果再把Access-Control-Allow-Credentials设置为true,允许客户端带上cookie的话,无疑此时是非常危险的.因为攻击者很容易就能窃取到用户个人的数据。所以浏览器加上了最后一道防线,当
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Credentials: true");
这种配置出现时,浏览器会拒接呈现服务端返回的资源.。