新手上路

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