新手上路

- 資源幣
- 10
- 積分
- 12
- 貢獻
- 0
- 在線時間
- 2 小時
- 注冊時間
- 2020-2-19
- 最后登錄
- 2020-5-2
|
代碼審計入門教學(四)
什么是XSS
跨站腳本攻擊(CrossSite Scripting),為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站腳本攻擊縮寫為XSS。惡意攻擊者往Web頁面里插入惡意JavaScript代碼,當用戶瀏覽該頁之時,嵌入其中Web里面的JavaScript代碼會被執(zhí)行,從而達到惡意攻擊用戶的目的。
常見的XSS種類有反射型XSS、存儲型XSS、DOM-XSS。
2.1反射型XSS
反射型XSS一般是指非持久型XSS,網(wǎng)頁直接輸出請求參數(shù)的值到頁面上,需要自己去觸發(fā)或者引誘別人去觸發(fā),如在瀏覽器打開一個包含惡意javascript代碼的URL鏈接,當該鏈接存在XSS漏洞是服務器就會“反射”javascript代碼到我們的瀏覽器,然后在我們的瀏覽器上執(zhí)行惡意javascript代碼。該漏洞常出沒的地方是搜索框。
2.2存儲型XSS
存儲型XSS一般是指持久型XSS,先提交內(nèi)容存入數(shù)據(jù)庫,然后從數(shù)據(jù)庫取出在輸出到頁面上。存儲型XSS會永久性的嵌入到頁面,所有訪問存在該漏洞的小伙伴都將成為被攻擊者。該漏洞常出沒的地方是留言板。
2.3DOM-XSS
DOM—based XSS漏洞是基于文檔對象模型DocumentObjeet Model,DOM)的一種漏洞,其實小白我也不大懂DOM XSS,做項目的時候也很少遇到過這個,想要了解更多可以自行百度。
3. 漏洞原理
小白竊以為要想通過源碼挖掘出漏洞,首先得找出漏洞形成的原因。接下來小白將把自己對XSS漏洞形成的原因做一個整理,便于后期查閱。
3.1反射型XSS漏洞原理
從上面可以看出反射型XSS網(wǎng)頁直接輸出請求參數(shù)的值到頁面上,其實看過小白之前某一篇文章的話就知道小白不小心寫出了個存在XSS漏洞的php腳本。代碼大致如下:
index.php
01.jpg (8.17 KB, 下載次數(shù): 104)
下載附件
保存到相冊
2020-2-19 23:17 上傳
這段代碼的意思是獲取GET請求的value參數(shù)的值賦給$str變量,然后輸出$str變量的值到網(wǎng)頁上。
可以看出腳本未對value參數(shù)的值做輸入判斷,也未對輸出進行編碼,也就是說value的值是一段javascript代碼也會直接輸出到網(wǎng)頁咯。這就是反射型XSS的形成原因。于是小白構造好帶有惡意javascript代碼的URL驗證是否屬實。
http://www.yuesec.com/index.php?value=<script>alert(/1/)</script>
此處應有彈框:
02.jpg (6.52 KB, 下載次數(shù): 98)
下載附件
保存到相冊
2020-2-19 23:17 上傳
上面也說過該漏洞常出沒的地方是搜索框,我們這個index.php看起來不像搜索框!那好,我們直接把index.php改成search.php就好啦!
http://www.yuesec.com/search.php?value=<script>alert(/1/)</script>
此處也有彈框:
03.jpg (7.99 KB, 下載次數(shù): 101)
下載附件
保存到相冊
2020-2-19 23:18 上傳
嗯嗯,反射型XSS漏洞形成原因通俗地講就是攻擊者可以控制輸出到頁面的腳本的變量的值,該變量的值一般是通過GET請求控制,且沒對傳進來的值進行過濾,這樣子就構成了反射型XSS漏洞。
3.2存儲型XSS漏洞原理
大家都知道存儲型XSS是先提交內(nèi)容存入數(shù)據(jù)庫,然后從數(shù)據(jù)庫取出在輸出到頁面上。
sxss.php
04.jpg (21.34 KB, 下載次數(shù): 95)
下載附件
保存到相冊
2020-2-19 23:18 上傳
這是一個簡單的存儲型XSS腳本,因為沒有過濾特殊字符或者方法使用不當,所以就形成了存儲型XSS漏洞。
4. 審計實踐
小白對兩種類型的XSS形成原因已經(jīng)有了一定的了解,接下來就是了解如何挖掘XSS了,看到上面兩個小例子,反射型XSS先通過$_GET獲取參數(shù)值,然后通過echo輸出到網(wǎng)頁,那么$_GET和echo就是我們的審計關鍵字了,但是存儲型XSS還要提交內(nèi)容插入到數(shù)據(jù)庫啊,那$_POST、mysql_query和insert into也可以做關鍵字了。$_GET和$_POST也可以有這幾個關鍵字足夠了,其他的大家自己挖掘。
4.1反射型XSS審計實踐
接著拿出前幾次一直在審計的cms,如果這個cms會說話的話,早就干翻我了。(大家就不要在意它怎么干翻我啦),俗話說,千穿百穿,漏洞不穿。
搜索我們上面提到的關鍵字$_GET:
05.jpg (11.05 KB, 下載次數(shù): 99)
下載附件
保存到相冊
2020-2-19 23:19 上傳
如果不去掉正則的話可以這樣子寫:
\$_GET
查找結果:
06.jpg (24.7 KB, 下載次數(shù): 95)
下載附件
保存到相冊
2020-2-19 23:20 上傳
篩選搜索結果
①Ctrl+A全選然后復制我們搜索出來的結果,Ctrl+N打開一個新的文檔并粘結復制的內(nèi)容。
07.jpg (36.61 KB, 下載次數(shù): 99)
下載附件
保存到相冊
2020-2-19 23:20 上傳
②Ctrl+F搜索echo.*?\$_GET,這次需要用到正則了。
08.jpg (13.48 KB, 下載次數(shù): 100)
下載附件
保存到相冊
2020-2-19 23:20 上傳
可以看到左下角有91個匹配,也就是說可能存在91個反射型XSS,如果都是的話,那“篩子cms”還真是名副其實了。
09.jpg (6.5 KB, 下載次數(shù): 96)
下載附件
保存到相冊
2020-2-19 23:21 上傳
看了下基本都是后臺的,算是有條件的雞肋反射型XSS吧。
4.1.1.4 增強版關鍵字篩選
接下來試試增強版的關鍵字echo.*?\$_GET搜索結果吧,看搜索出來的結果是91個還是更多?
10.jpg (12.33 KB, 下載次數(shù): 101)
下載附件
保存到相冊
2020-2-19 23:21 上傳
可以看到有15個文件總共有91個匹配結果匹配了我們的關鍵字,跟上面的結果一致,但是操作卻多了,還是增強版關鍵字好用。
4.2存儲型XSS審計實踐
存儲型因為不是直接輸出控制的參數(shù)的值,所以不能直接定位到存在漏洞的地方,小白設想存儲型XSS簡單的審計方法有兩種:
①可以先通過mysql_query和insert into定位存入數(shù)據(jù)到數(shù)據(jù)庫,接著看有沒有數(shù)據(jù)庫查詢語句查詢存入數(shù)據(jù)的表,最后看有沒有echo輸出查詢結果。
②可以通過先通過定位echo輸出,然后確定查詢的那個表,再定位哪個位置插入數(shù)據(jù)到這個表。
小白將根據(jù)這兩種設想方法進行存儲型XSS的挖掘,可能還有其他方法,鼓勵大家分享其他方法。下面我們就以第一個方法為例。
4.2.1 審計步驟
4.2.1.1定位存入數(shù)據(jù)表
mysql_query和insert into可以拆分為多個關鍵字搜索,為免麻煩mysql_query和insert into一起搜索了。
mysql_query.*?insertinto
11.jpg (23.45 KB, 下載次數(shù): 103)
下載附件
保存到相冊
2020-2-19 23:22 上傳
發(fā)現(xiàn)只有2個文件總共13個匹配結果,出乎意料的少。先判斷有沒有對即將存入的數(shù)據(jù)進行過濾,若沒有過濾可以借著下一步,若有過濾就ganme over。要判斷是否過濾還得進入代碼的函數(shù)進行審計。
12.jpg (7.67 KB, 下載次數(shù): 87)
下載附件
保存到相冊
2020-2-19 23:22 上傳
只有兩個文件,第一個是包含了網(wǎng)站大部分函數(shù)的腳本,我們就選擇這個進行審計。
判斷是否存在過濾
13.jpg (14.46 KB, 下載次數(shù): 88)
下載附件
保存到相冊
2020-2-19 23:23 上傳
我們就挑這一段代碼進行審計吧,看看是否存在存儲型XSS,木有的話就算了,天氣太冷了,小白準備躲被窩里抱團取暖了。
雙擊進入該代碼的位置:
14.jpg (24.94 KB, 下載次數(shù): 89)
下載附件
保存到相冊
2020-2-19 23:23 上傳
可以看到可以控制的傳入查詢語句的值大部分都調(diào)用了test_input函數(shù),顧名思義就是測試輸入。
分析test_input函數(shù)
我們搜索下test_input函數(shù)存在哪個文件(用“test_input\(”關鍵字搜索):
15.jpg (13.14 KB, 下載次數(shù): 100)
下載附件
保存到相冊
2020-2-19 23:24 上傳
可以看到該函數(shù)存在function.php文件中,從這聊聊幾句代碼中可以看到先調(diào)用了trim函數(shù)對傳進來的值進行處理。
trim函數(shù)作用是移除字符串兩側的空白字符或其他預定義字符。這里應該是去除空白字符。
去除空白字符后接著用stripslashes處理傳進來的值,stripslashes() 函數(shù)的作用是刪除由addslashes() 函數(shù)添加的反斜杠。雙擊進去看test_input函數(shù)的全部代碼:
16.jpg (7.75 KB, 下載次數(shù): 90)
下載附件
保存到相冊
2020-2-19 23:24 上傳
去除反斜杠后調(diào)用htmlspecialchars函數(shù)把預定義的字符轉換為 HTML 實體,預定義的字符有&、"、'、<、>。ENT_QUOTES表示編碼雙引號和單引號?吹絟tmlspecialchars小白頓時慌了,這不是坑爹嘛~
寫一個腳本驗證htmlspecialchars處理數(shù)值后是否還能執(zhí)行javascript代碼:
test.php
17.jpg (11.49 KB, 下載次數(shù): 89)
下載附件
保存到相冊
2020-2-19 23:25 上傳
果然是不能彈窗,看下網(wǎng)頁源碼:
18.jpg (12.09 KB, 下載次數(shù): 95)
下載附件
保存到相冊
2020-2-19 23:25 上傳
小白頓時想掩面狂奔,不過還是沉下心來自我安慰道:“雖然過濾的,但是審計的流程還是得講完的。俗話說得好,自己耍的套路,哭著也要耍完!
4.2.1.4定位查詢、輸出位置
從上面得知存入數(shù)據(jù)的表是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個匹配結果符合我們的搜索關鍵字:
19.jpg (11.7 KB, 下載次數(shù): 92)
下載附件
保存到相冊
2020-2-19 23:26 上傳
隨便點入一個匹配結果:
20.jpg (15.97 KB, 下載次數(shù): 93)
下載附件
保存到相冊
2020-2-19 23:26 上傳
可以得知nlmcc函數(shù)會返回分類名,我們接著看哪里調(diào)用了nlmcc函數(shù),關鍵字“nlmcc(”。
21.jpg (34.05 KB, 下載次數(shù): 92)
下載附件
保存到相冊
2020-2-19 23:27 上傳
可以看到有7個文件總共18個匹配結果匹配我們的關鍵字,而且搜索結果既有nlmcc函數(shù),也有pnlmcc函數(shù),這兩個函數(shù)前面都有echo,也就是直接把函數(shù)返回值輸出到頁面上。如果前面沒有調(diào)用htmlspecialchars函數(shù)做文字處理的話就存在存儲型XSS了。
驗證結果
①添加分類:
22.jpg (20.47 KB, 下載次數(shù): 93)
下載附件
保存到相冊
2020-2-19 23:27 上傳
②獲取分類id值:
23.jpg (6.87 KB, 下載次數(shù): 96)
下載附件
保存到相冊
2020-2-19 23:28 上傳
鼠標移到編輯那里可以獲取到分類id值是101.
③構造鏈接訪問:
24.jpg (14.1 KB, 下載次數(shù): 94)
下載附件
保存到相冊
2020-2-19 23:28 上傳
查看源碼會發(fā)現(xiàn)“><script>alert(1)</script><”進行了html編碼轉換:
25.jpg (6.47 KB, 下載次數(shù): 89)
下載附件
保存到相冊
2020-2-19 23:29 上傳
如果沒有調(diào)用htmlspecialchars函數(shù)做文字處理的話是不是就存在存儲型XSS呢?我們注釋掉調(diào)用htmlspecialchars函數(shù)的代碼:
26.jpg (7.97 KB, 下載次數(shù): 95)
下載附件
保存到相冊
2020-2-19 23:29 上傳
再添加一個分類:
27.jpg (26.54 KB, 下載次數(shù): 90)
下載附件
保存到相冊
2020-2-19 23:29 上傳
修改后頁面就彈出了個提示窗口:
28.jpg (12.4 KB, 下載次數(shù): 90)
下載附件
保存到相冊
2020-2-19 23:30 上傳
果然是htmlspecialchars函數(shù)的問題呢。分類id是102,構造好鏈接訪問試試:
29.jpg (9.11 KB, 下載次數(shù): 89)
下載附件
保存到相冊
2020-2-19 23:30 上傳
總結
這次小白學習XSS審計雖說后面審計不出存儲型XSS,但是至少證明了小白的審計思路是對的。關于htmlspecialchars函數(shù)如果寫的不對,其實還是有一定可能繞過的。大家也可以了解下htmlspecialchars繞過,到時候記得給大家分享哦!
|
|