無需“in”的SQL盲注

22.png

爲了鍛鍊安全技術,我在TetCTF上想尋找一些新奇的網絡挑戰,並注意到一個有趣的系統——“Secure System”。

其中挑戰目標是製作一個和SQL盲注有關的payload,並且不使用:

  • UNION … SELECT

  • information_schema

  • “in”和“or”等關鍵詞

儘管還有其他安全過濾,但以上關鍵詞是最難克服的障礙。

33.png

information_schema的替代方法

44.png

我在網上搜索了一下從MySQL數據庫中檢索表名的替代方法,但沒有找到任何可行的方法。所有的技術都依賴於information_schemamysql.innodb_table_stats,但這兩者都會被“in”關鍵詞過濾掉。所以,我需要尋找新方法,並在研究了一段時間後成功發現了替代品sys.x$schema_flattened_keys

55.png

在上述示例中,不僅包含一個table_name列,還包含“索引列”。但這不是唯一的方法,還有另一個表sys.schema_table_statistics可顯示更多的表:

66.png

通過這種方法和SQL盲注技術,我成功得到了目標表名Th1z_Fack1n_Fl4444g_Tabl3

他人的解決方案

在嘗試檢索列名的時候,我遇到了不小的困難,嘗試了很多方法都不成功。但我發現的表格sys.x$statement_analysis可讓我查看其他參與者的解決方案。

77.png

我很好奇是否有人找到了列名,但腳本運行要花費很多時間,所以我只檢索上面示例中的內容。這也許能在將來幫我解決其他SQL注入挑戰!

在沒有列名的情況下檢索數據

88.png

如果一個表只包含一列,那麼很輕易就可在不知道列名的情況下檢索出數據,只需一個簡單的SUBSTR((SELECT * FROM table),1,1)='x'就可,但如果一個表包含多個列,那麼這個查詢就會拋出一個錯誤。不過這裏有個技巧,就是將查詢語句與相同數量的列進行比較!

99.png

通過小於號替換等號,你可以逐字符檢索出數據。不過還有一個問題——MySQL中的字符串比較在默認情況下是不區分大小寫的。

區分大小寫

100.png

通過以上方法我可以得到全是小寫字母的flag,現在就需要一個區分大小寫的方法。我發現將字符串轉換爲二進制格式後,會強制進行字節對字節的比較,這正是我所需要的。但問題是,BINARY函數中的“in”被過濾掉了。

110.png

此時我注意到,當一個字符串連接一個二進制的值時CONCAT("aa", BINARY("BB")),其得到的也將是二進制。因此我需要找到一個方法,將一個二進制字符串插入CONCAT函數中。

經過反覆試驗,我終於發現MySQL中的JSON對象是二進制對象,因此,CAST(0 AS JSON)會返回一個二進制字符串,進而SELECT CONCAT(“A”, CAST(0 AS JSON))也會返回一個二進制字符串。

120.png

綜合以上改進,我成功地獲得了完整的flag,它實際上只含有一個大寫字符,但還是花了我幾個小時。

TetCTF{0wl_d0nkey_means_Liarrrrrrr}

有趣的挑戰和解決方案

這正是我喜歡CTF的地方,一個簡單的安全挑戰就可以引導出很棒的研究。我不確定我的解決方案是否爲最好,但對我來說這是一個偉大的旅程!

此外(關於這個挑戰的其他內容),我們一開始希望使用ORD(SUBSTR((SELECT smth),x,1))=77去檢索值,但是由於過濾了“or”關鍵詞,ORD被禁止了。不過還是可以通過CONV(HEX(SUBSTR((SELECT ...),x,1)),16,10)=77繞過。以下是Oracle盲注的payload:

130.png

最後根據這些方法和已經檢索到的表名,payload如下:

140.png

詳細鏈接點擊這裏

本文由白帽彙整理並翻譯,不代表白帽匯任何觀點和立場:https://nosec.org/home/detail/3830.html
來源:https://medium.com/@terjanq/blind-sql-injection-without-an-in-1e14ba1d4952

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章