SQL注入繞過方式
當前位置:點晴教程→知識管理交流
→『 技術(shù)文檔交流 』
前言 在實際的測試過程中,經(jīng)常會遇到一些SQL注入,明明判斷存在注入點,然而在實際的測試過程中會發(fā)現(xiàn)有各種各樣的輸入過濾器導致SQL注入利用失敗。這時我們需要利用一些不常見的特性或者與其它技術(shù)結(jié)合起來以便發(fā)動成功的攻擊。本篇文章就來看看常見的過濾方式以及繞過的方式。 判斷是否存在SQL注入的方式 1)布爾注入 2)時間注入 3)錯誤 4)內(nèi)聯(lián) 5)union 6)堆疊(stack queries) 常見的過濾方式 1)過濾SQL關(guān)鍵字,比如SELECT,AND,INSERT等 繞過方式 1)使用大小寫變種 特性:數(shù)據(jù)庫使用不區(qū)分大小寫的方式處理SQL關(guān)鍵字 這種特性在基于關(guān)鍵字的檢測中,如果沒有對大小寫進行判斷,則可以繞過。 2)使用SQL注釋符 特性:在SQL語句中用/**/來進行多行注釋??梢杂米⑨尫麃泶婵崭襁B接SQL關(guān)鍵字。 PS:低版本的MySQL中甚至可以在SQL關(guān)鍵字中使用內(nèi)聯(lián)注釋。 /* */ 在mysql中是多行注釋 但是如果里面加了! 那么后面的內(nèi)容會被執(zhí)行 select/*foo*/username/*foo*/users sel/*foo*/ect username,password fr/*foo*/om user (mysql中還可以插入到關(guān)鍵字中) 3)使用編碼(URL編碼,Unicode編碼) URL編碼:使用字符的十六進制ASCII碼來替換,并在ASCII碼前加上%就是URL編碼。 特性:web程序經(jīng)過一系列處理,可能將經(jīng)過編碼的字符還原成原始字符并帶到數(shù)據(jù)庫中執(zhí)行。 PS:單次編碼不行的時候,可以嘗試雙重編碼,因為WEB應(yīng)用程序有時會多次解碼用戶輸入并在最后解碼之前應(yīng)用其輸入過濾器。 4)使用動態(tài)查詢 特性:許多數(shù)據(jù)庫都允許動態(tài)執(zhí)行SQL查詢,只須向執(zhí)行查詢的數(shù)據(jù)庫函數(shù)傳遞一個包含SQL查詢的字符串即可。 PS:SQLSERVER中使用exec。exec('select password from tbluser') oracle中使用EXECUTE IMMEDIATE命令執(zhí)行一個字符串格式的查詢。 這樣如果過濾了關(guān)鍵字就可以通過連接字符來進行繞過。
通過還可以使用cha()來構(gòu)造SQL中的關(guān)鍵字。 SQLSERVER中,可以使用代表字符串的ASCII字符編碼的十六進制數(shù)字來實例化字符串。如下:
5)使用空字節(jié) 特性:原生代碼和托管代碼分別采用不同的方法來處理空字節(jié)。原生代碼根據(jù)第一個空字節(jié)的位置來確認字符串的長度。這種差異導致,原生過濾器如果遇到字符串遇到空字符就會停止處理,導致繞過過濾器。 %00’ union select password form tblusers -- 6)使用嵌套 特性:有的過濾器采用的方式是通過去掉SQL關(guān)鍵字??梢酝送ㄟ^嵌套的方式繞過。 selselectect 7)利用截斷 特性:有的輸入過濾器會將輸入截斷成最大長度。 有的過濾器將‘變換成’‘來防止SQL注入。這是如果可以截斷,那么就可以繞過。 8)非標準入口 特性:有的waf只檢查了常規(guī)的參數(shù)值。我們可以將paylaod放到參數(shù)名中。還有http的其它協(xié)議,如user-agent。 9)利用二階注入 特性:輸入的時候?qū)ψ址M行了轉(zhuǎn)換,然后將不安全的字符原樣存儲在數(shù)據(jù)庫中,下次查詢時就會造成SQL注入。 總結(jié) 上面這些過濾方式只是一些比較基本的,類似的還有很多,在遇到判斷存在注入點而無法利用的時候可以嘗試一下繞過。 該文章在 2024/5/17 15:50:39 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |