SQL注入繞過技術
侵刪
微信公眾號:計算機與網絡安全
ID:Computer-network
1、大小寫繞過注入
大小寫繞過注入的測試地址:http://ccctf.cn/sql/1.php?id=1。
訪問id=1',發現頁面報出MySQL錯誤,當訪問id=1 and 1=1時,頁面返回“no hack”,顯然是被攔截了,說明有關鍵詞被過濾。使用關鍵字大小寫的方式嘗試繞過,如And 1=1(任意字母大小寫都可以,如aNd 1=1,AND 1=1等),可以看到訪問id=1 And 1=1時頁面返回與id=1相同的結果,訪問id=1 And 1=2時頁面返回與id=1不同的結果,得出存在SQL注入漏洞的結論,如圖1和圖2所示。
圖1 訪問id=1 And 1=1的結果
圖2 訪問id=1 And 1=2的結果
使用order by查詢字段數量,發現還是被攔截了,如圖3所示,還是利用修改關鍵字大小寫來繞過它,嘗試只改order這個單詞,結果發現當order改成Order后,頁面顯示正常,說明by並沒有被攔截,如圖4所示,最終通過嘗試,發現數據庫表中存在3個字段。
圖3 order by被攔截
圖4 Order by沒被攔截
接着,使用Union方法完成此次注入,如果仍然遇到關鍵字被攔截,則嘗試使用修改大小寫的方式繞過攔截。
2、雙寫繞過注入
雙寫繞過注入的測試地址:http://ccctf.cn/sql/2.php?id=1。
訪問id=1',發現頁面報出MySQL錯誤,接着訪問id=1 and 1=1,頁面依然報出MySQL的錯誤,但是從錯誤信息中可以看出,輸入的and 1=1變成了1=1,如圖5所示。
圖5 關鍵字and被過濾
因此可以得知,關鍵字and被過濾了。這時嘗試使用雙寫的方式繞過,如anandd 1=1,當and被過濾后,anandd變成了and,所以這時傳入數據庫的語句是and 1=1,結果如圖6所示,成功執行並返回正常頁面。
圖6 關鍵字anandd被過濾后正確執行
接着,輸入aandnd 1=2,返回錯誤信息,判斷頁面參數存在SQL注入漏洞。當訪問id=1 order by 3時,MySQL的錯誤信息為“der by 3”,如圖7所示,所以這里並沒有過濾order整個單詞,而是僅過濾or,因此只需要雙寫or即可,結果如圖8所示。
圖7 過濾了關鍵字or
圖8 雙寫關鍵字or
后面的注入過程與Union注入的一致。
3、編碼繞過注入
編碼繞過注入的測試地址:http://ccctf.cn/sql/3.php?id=1。
訪問id=1',發現頁面報出MySQL錯誤,接着訪問id=1 and 1=1和id=1 and 1=2時,發現關鍵字and被攔截。嘗試使用URL全編碼的方式繞過攔截。由於服務器會自動對URL進行一次URL解碼,所以需要把關鍵詞編碼兩次,這里需要注意的地方是,URL編碼需選擇全編碼,而不是普通的URL編碼。如圖9所示,關鍵字and進行兩次URL全編碼的結果是%25%36%31%25%36%65%25%36%34,訪問id=1%25%36%31% 25%36%65%25%36%34 1=1時,頁面返回與id=1相同的結果,如圖10所示,訪問id=1 %25%36%31%25%36%65%25%36%34 1=2時,頁面返回與id=1不同的結果,如圖11所示,所以該網址存在SQL注入漏洞。
圖9 兩次URL編碼關鍵字and
圖10 訪問id=1 and 1=1時的結果
圖11 訪問id=1 and 1=2時的結果
后面的注入過程與Union注入的一致,只需判斷過濾的關鍵詞,並經過兩次URL全編碼即可。
4、內聯注釋繞過注入
內聯注釋繞過注入的測試地址:http://ccctf.cn/sql/4.php?id=1。
訪問id=1',發現頁面報出MySQL錯誤,接着訪問id=1 and 1=1和id=1 and 1=2時,發現頁面提示“no hack”,即關鍵字被攔截。嘗試使用內聯注釋繞過。訪問id=1/*!and*/1=1時,頁面返回與id=1相同的結果;訪問id=1/*!and*/1=2時,頁面返回與id=1不同的結果,如圖12和圖13所示。
圖12 訪問id=1 /*!and*/1=1時的結果
圖13 訪問id=1 /*!and*/1=2時的結果
后面的注入過程與Union注入的一致。
5、SQL注入修復建議
常用的SQL注入漏洞的修復方法有兩種。
(1)過濾危險字符
多數CMS都采用過濾危險字符的方式,例如,采用正則表達式匹配union、sleep、load_file等關鍵字,如果匹配到,則退出程序。例如80sec的防注入代碼,如下所示。
使用過濾的方式,在一定程度上可以防止SQL注入漏洞,但仍然存在被繞過的可能。
(2)使用預編譯語句
其實使用PDO預編譯語句,需要注意的是,不要將變量直接拼接到PDO語句中,而是使用占位符進行數據庫的增加、刪除、修改、查詢。