資源共享吧|易語言論壇|逆向破解教程|輔助開發(fā)教程|網絡安全教程|anzei.cn|我的開發(fā)技術隨記

 找回密碼
 注冊成為正式會員
查看: 1091|回復: 0
打印 上一主題 下一主題

[網絡安全/滲透測試] 代碼審計入門教學(四)

[復制鏈接]

4

主題

4

帖子

0

精華

新手上路

Rank: 1

資源幣
10
積分
12
貢獻
0
在線時間
2 小時
注冊時間
2020-2-19
最后登錄
2020-5-2
跳轉到指定樓層
樓主
發(fā)表于 2020-2-19 23:31:17 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
代碼審計入門教學(四)

什么是XSS

跨站腳本攻擊(CrossSite Scripting),為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站腳本攻擊縮寫為XSS。惡意攻擊者往Web頁面里插入惡意JavaScript代碼,當用戶瀏覽該頁之時,嵌入其中Web里面的JavaScript代碼會被執(zhí)行,從而達到惡意攻擊用戶的目的。

常見的XSS種類有反射型XSS、存儲型XSS、DOM-XSS。

2.1反射型XSS
反射型XSS一般是指非持久型XSS,網頁直接輸出請求參數的值到頁面上,需要自己去觸發(fā)或者引誘別人去觸發(fā),如在瀏覽器打開一個包含惡意javascript代碼的URL鏈接,當該鏈接存在XSS漏洞是服務器就會“反射”javascript代碼到我們的瀏覽器,然后在我們的瀏覽器上執(zhí)行惡意javascript代碼。該漏洞常出沒的地方是搜索框。

2.2存儲型XSS
存儲型XSS一般是指持久型XSS,先提交內容存入數據庫,然后從數據庫取出在輸出到頁面上。存儲型XSS會永久性的嵌入到頁面,所有訪問存在該漏洞的小伙伴都將成為被攻擊者。該漏洞常出沒的地方是留言板。

2.3DOM-XSS
DOM—based XSS漏洞是基于文檔對象模型DocumentObjeet Model,DOM)的一種漏洞,其實小白我也不大懂DOM XSS,做項目的時候也很少遇到過這個,想要了解更多可以自行百度。

3.  漏洞原理

小白竊以為要想通過源碼挖掘出漏洞,首先得找出漏洞形成的原因。接下來小白將把自己對XSS漏洞形成的原因做一個整理,便于后期查閱。

3.1反射型XSS漏洞原理
從上面可以看出反射型XSS網頁直接輸出請求參數的值到頁面上,其實看過小白之前某一篇文章的話就知道小白不小心寫出了個存在XSS漏洞的php腳本。代碼大致如下:

index.php


這段代碼的意思是獲取GET請求的value參數的值賦給$str變量,然后輸出$str變量的值到網頁上。

可以看出腳本未對value參數的值做輸入判斷,也未對輸出進行編碼,也就是說value的值是一段javascript代碼也會直接輸出到網頁咯。這就是反射型XSS的形成原因。于是小白構造好帶有惡意javascript代碼的URL驗證是否屬實。

http://www.yuesec.com/index.php?value=<script>alert(/1/)</script>

此處應有彈框:



上面也說過該漏洞常出沒的地方是搜索框,我們這個index.php看起來不像搜索框。∧呛,我們直接把index.php改成search.php就好啦!

http://www.yuesec.com/search.php?value=<script>alert(/1/)</script>

此處也有彈框:



嗯嗯,反射型XSS漏洞形成原因通俗地講就是攻擊者可以控制輸出到頁面的腳本的變量的值,該變量的值一般是通過GET請求控制,且沒對傳進來的值進行過濾,這樣子就構成了反射型XSS漏洞。

3.2存儲型XSS漏洞原理
大家都知道存儲型XSS是先提交內容存入數據庫,然后從數據庫取出在輸出到頁面上。

sxss.php


這是一個簡單的存儲型XSS腳本,因為沒有過濾特殊字符或者方法使用不當,所以就形成了存儲型XSS漏洞。

4.  審計實踐

小白對兩種類型的XSS形成原因已經有了一定的了解,接下來就是了解如何挖掘XSS了,看到上面兩個小例子,反射型XSS先通過$_GET獲取參數值,然后通過echo輸出到網頁,那么$_GET和echo就是我們的審計關鍵字了,但是存儲型XSS還要提交內容插入到數據庫啊,那$_POST、mysql_query和insert into也可以做關鍵字了。$_GET和$_POST也可以有這幾個關鍵字足夠了,其他的大家自己挖掘。

4.1反射型XSS審計實踐
接著拿出前幾次一直在審計的cms,如果這個cms會說話的話,早就干翻我了。(大家就不要在意它怎么干翻我啦),俗話說,千穿百穿,漏洞不穿。

搜索我們上面提到的關鍵字$_GET:


如果不去掉正則的話可以這樣子寫:

\$_GET

查找結果:



篩選搜索結果
①Ctrl+A全選然后復制我們搜索出來的結果,Ctrl+N打開一個新的文檔并粘結復制的內容。


②Ctrl+F搜索echo.*?\$_GET,這次需要用到正則了。


可以看到左下角有91個匹配,也就是說可能存在91個反射型XSS,如果都是的話,那“篩子cms”還真是名副其實了。


看了下基本都是后臺的,算是有條件的雞肋反射型XSS吧。

4.1.1.4     增強版關鍵字篩選
接下來試試增強版的關鍵字echo.*?\$_GET搜索結果吧,看搜索出來的結果是91個還是更多?


可以看到有15個文件總共有91個匹配結果匹配了我們的關鍵字,跟上面的結果一致,但是操作卻多了,還是增強版關鍵字好用。

4.2存儲型XSS審計實踐
存儲型因為不是直接輸出控制的參數的值,所以不能直接定位到存在漏洞的地方,小白設想存儲型XSS簡單的審計方法有兩種:

①可以先通過mysql_query和insert into定位存入數據到數據庫,接著看有沒有數據庫查詢語句查詢存入數據的表,最后看有沒有echo輸出查詢結果。

②可以通過先通過定位echo輸出,然后確定查詢的那個表,再定位哪個位置插入數據到這個表。

小白將根據這兩種設想方法進行存儲型XSS的挖掘,可能還有其他方法,鼓勵大家分享其他方法。下面我們就以第一個方法為例。

4.2.1  審計步驟
4.2.1.1定位存入數據表
mysql_query和insert into可以拆分為多個關鍵字搜索,為免麻煩mysql_query和insert into一起搜索了。

mysql_query.*?insertinto


發(fā)現只有2個文件總共13個匹配結果,出乎意料的少。先判斷有沒有對即將存入的數據進行過濾,若沒有過濾可以借著下一步,若有過濾就ganme over。要判斷是否過濾還得進入代碼的函數進行審計。




只有兩個文件,第一個是包含了網站大部分函數的腳本,我們就選擇這個進行審計。

判斷是否存在過濾


我們就挑這一段代碼進行審計吧,看看是否存在存儲型XSS,木有的話就算了,天氣太冷了,小白準備躲被窩里抱團取暖了。

雙擊進入該代碼的位置:



可以看到可以控制的傳入查詢語句的值大部分都調用了test_input函數,顧名思義就是測試輸入。

分析test_input函數
我們搜索下test_input函數存在哪個文件(用“test_input\(”關鍵字搜索):



可以看到該函數存在function.php文件中,從這聊聊幾句代碼中可以看到先調用了trim函數對傳進來的值進行處理。

trim函數作用是移除字符串兩側的空白字符或其他預定義字符。這里應該是去除空白字符。

去除空白字符后接著用stripslashes處理傳進來的值,stripslashes() 函數的作用是刪除由addslashes() 函數添加的反斜杠。雙擊進去看test_input函數的全部代碼:




去除反斜杠后調用htmlspecialchars函數把預定義的字符轉換為 HTML 實體,預定義的字符有&、"、'、<、>。ENT_QUOTES表示編碼雙引號和單引號?吹絟tmlspecialchars小白頓時慌了,這不是坑爹嘛~

寫一個腳本驗證htmlspecialchars處理數值后是否還能執(zhí)行javascript代碼:

test.php


果然是不能彈窗,看下網頁源碼:


小白頓時想掩面狂奔,不過還是沉下心來自我安慰道:“雖然過濾的,但是審計的流程還是得講完的。俗話說得好,自己耍的套路,哭著也要耍完!

4.2.1.4定位查詢、輸出位置
從上面得知存入數據的表是sc_categories,要查找進行該表查詢的關鍵字可以是(有且不僅限于):

①select.*? sc_categories;

② select \*.*? sc_categories;

③ select \*.*? from sc_categories;-

④ select category_name.*? sc_categories;

⑤ select category_name.*?from sc_categories;

沒有最多,只有更多。這5個關鍵字僅僅是一小部分,大家可以自行發(fā)揮。用第一個關鍵字搜索可以得知有5個文件總共25個匹配結果符合我們的搜索關鍵字:




隨便點入一個匹配結果:




可以得知nlmcc函數會返回分類名,我們接著看哪里調用了nlmcc函數,關鍵字“nlmcc(”。


可以看到有7個文件總共18個匹配結果匹配我們的關鍵字,而且搜索結果既有nlmcc函數,也有pnlmcc函數,這兩個函數前面都有echo,也就是直接把函數返回值輸出到頁面上。如果前面沒有調用htmlspecialchars函數做文字處理的話就存在存儲型XSS了。

驗證結果
①添加分類:


②獲取分類id值:



鼠標移到編輯那里可以獲取到分類id值是101.

③構造鏈接訪問:


查看源碼會發(fā)現“><script>alert(1)</script><”進行了html編碼轉換:



如果沒有調用htmlspecialchars函數做文字處理的話是不是就存在存儲型XSS呢?我們注釋掉調用htmlspecialchars函數的代碼:


再添加一個分類:


修改后頁面就彈出了個提示窗口:


果然是htmlspecialchars函數的問題呢。分類id是102,構造好鏈接訪問試試:



總結

這次小白學習XSS審計雖說后面審計不出存儲型XSS,但是至少證明了小白的審計思路是對的。關于htmlspecialchars函數如果寫的不對,其實還是有一定可能繞過的。大家也可以了解下htmlspecialchars繞過,到時候記得給大家分享哦!


回復

使用道具 舉報

 點擊右側快捷回復  

本版積分規(guī)則

小黑屋|資源共享吧 ( 瓊ICP備2023000410號-1 )

GMT+8, 2024-10-23 06:34 , Processed in 0.057030 second(s), 15 queries , MemCached On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回復 返回頂部 返回列表