1. 避開輸入過濾 php
輸入過濾存在於外部和內部,外部屬於web應用防火牆WAF,入侵防護系統IPS,入侵檢測系統IDS,內部屬於代碼中對輸入進行過濾 web
過濾select,insert等sql關鍵字和' |,等字符 sql
(1)大小寫變種:將關鍵字變爲SeLeCt * FrOm UserINFO 因爲過濾是針對全大寫或者全小寫,不多會對大小寫作排列組合進行過濾。若單個過濾則會影響用戶正常輸入。 shell
(2)使用sql註釋:php中使用stristr('a','b')判斷b在a中第一次出現並返回,經過 數據庫
判斷輸入中是否含有關鍵字,且大小寫不敏感且二進制安全。都緊跟空格進行檢查 windows
用/**/代替空格 用like代替= 瀏覽器
(3)使用URL編碼:URL編碼是經過瀏覽器進行,不一樣瀏覽器的編碼方式不一樣。IE11使用GB2312,firefox3.2使用UTF-8,解碼倒是根據服務器的編碼模式進行解碼,因此常常開發過程會出現中文未對其進行編碼處理就會致使亂碼問題,就是瀏覽器編碼和服務器解碼不一致問題。這樣也會產生get和post的區別,get是由瀏覽器自動編碼。但post是由請求頭contentType中的charset決定編碼模式,並告訴服務器應對應什麼方式進行解碼。因此在使用URL編碼繞過sql過濾且進行get注入的時候要考慮瀏覽器的編碼模式和服務器的解碼模式,隨便一個頁面就能看出服務器的解碼模式。JS的AJAX技術也是同樣。escape就是針對GB2312的編碼,URLencordCompontent是針對UTF-8的。 安全
有的對於中文查詢會在前段進行UTF-8編碼再進行UTF-8(ISO-8859-1),在服務器端逆序解碼。須要雙URL編碼。 服務器
原始注入:c' and if(current_user()='root@localhost',1,0)#ww 工具
c'%2F%2A%2A%2Fand%2F%2A%2A%2Fif%28current_user%u0023%29%3D'root%40localhost'%2C1%2C0)%3B%23ww
(4)使用動態查詢:SQLserver容許用exec('')的方式執行sql語句
exec ('select * from sysobjects')
濫用字符鏈接繞過sql過濾
exec('s'+'e'+'l'+'e'+'c'+'t'+'/**/*/**/f'+'r'+'o'+'m/**/s'+'y'+'s'+'o'+'b'+'j'+'e'+'c'+'t'+'s')
使用CHAR()構造單個字符,不須要引入任何引號。
sqlsever中可直接使用聲明變量,賦值爲0x的16進制進行
declare @query varchar(100)
set @query=0x73656C656374202A2066726F6D207379736F626A65637473
exec(@query)
(5)使用空字符:不少IDS或者WAF由C++等原生代碼編寫。對於空字符便是截斷就會中止處理。
%00' UNION SELECT PASSWORD FROM TBLUSERS WHERE USERNAME='ADMIN'--
原生代碼指的是直接能靠cpu執行的代碼,不須要虛擬機沙箱等外部應用庫提供支持。
(6)對於剝離字符串:第一次剝離後不會迭代過濾器,因此能夠selselectect進行注入
2. 二階sql注入
(1) 產生緣由: 攻擊者須要在第一次注入的時候將目標值或者有用的東西存儲在數據庫中。再經過第二次查詢將目標值讀取出來。
應用實例:在添加用戶的時候將用戶名設置爲 '+substring(@@version,1,50)+'
數據庫在插入語句則以下:insert into userinfo values (''+substring(@@version,1,50)+'','wwww');
這樣就將版本信息插入進入了用戶名字段,在隨意查看用戶名就知道了數據庫版本號等信息。
重點考慮的是不一樣數據庫的字符串鏈接符還閉合先後的引號,使得注入語句能被執行且保存在數據庫中。
重點考慮的是用戶名等信息在被處理的時候的具體處理方式,過濾仍是剝離,或經過編碼,大小寫等方法一
一嘗試
在用戶名等插入過程當中,經常將用戶名設置爲xxx' union select count(*),count(*) from xxx 等信息來進行二階注入,在面對有輸入過濾的狀況下就進行繞過。
(2) 尋找二階注入點:經常使用工具沒法掃出,只能經過手工注入。
1. 尋找能被用戶操做且存儲的數據項
2. 檢測非法字符注入的可行性
3. 試試用URL編碼,大小寫轉換等技巧繞過輸入過濾
4. 針對程序可能暴露出的敏感信息頁面的收集
5. 開發代碼驗證SQL注入,先顯後盲。
防護:全部對數據庫提供的操做均使用參數化,對查詢結果集結構進行固定。
3. 其餘思路
(1) 使用混合攻擊:使用跨站和sql注入混合攻擊,若id是一個容易被注入的參數則有以下語句
id=123' union select 1,'<script>alert(1)</script>',1
(2) 使用驗證過的通道:有的sql注入漏洞是須要利用管理員登錄後纔有權限訪問的點。因此能夠先經過跨站點僞造請求。
(3) 使用ORACLE執行OS命令,經過雙引號包含表名,包含惡意shell命令的表名的表則被成功建立。再經過SQL*Plus來執行的時候該腳本會去除引號,將!解析爲UNIX命令,$則是windows,VMS。