pikachu-sql注入


1.概述

1.1發生原因

SQL注入漏洞,主要是開發人員在構建代碼時,沒有對輸入邊界進行安全考慮,導致攻擊者可以通過合法的輸入點提交一些精心構造的語句,從而欺騙后台數據庫對其進行執行,導致數據庫信息泄漏的一種漏洞。

1.2SQL注入攻擊流程

第一步:注入點探測

  • 自動方式:使用web漏洞掃描工具,自動進行注入點發現
  • 手動方式:手工構造SQL注入測試語句進行注入點發現

第二步:信息獲取

  通過注入點取得期望得到的數據

  • 1.環境信息:數據庫類型,數據庫版本,操作系統版本,用戶信息等
  • 2.數據庫信息:數據庫蜜罐,數據庫表,表字段,字段內容等(加密內容破解)

第三步:獲取權限

  • 獲取操作系統權限:通過數據庫執行shell,上傳木馬

1.3注入點類型

分類根據:輸入的變量傳入到SQL語句是以什么類型拼接的

  • 數字型:user_id=$id
  • 字符型:user_id=‘$id‘
  • 搜索型:text LIKE ‘%{$_GET[‘search‘]}%‘"

2.數字型注入(POST)

這里可以根據我們選擇的 userid 返回用戶名和郵箱

 

 

 因為是用POST語句取得我們傳遞的參數值,傳遞給一個變量,再到數據庫查詢。所以我們猜測后台的查詢語句大概是下面這樣的

$id=$_POST[‘id‘]
select 字段1,字段2 from 表名 where id=1$id

下面我 BurpSuite 抓包來測試一下

 

 

 

 

 

把傳入的參數改成1 or 1=1,看看返回的結果

注入成功

 

 

 

 三、字符型注入

 

 

 

 kobe‘ or 1=1#

 

 

 

 

 

 

 注入成功

四、搜索型注入

 

 

 k%‘ or 1=1#

 

 

 

注入成功

 

 

五.XX型注入

構造的payload如下

kobe‘) or 1=1#

 

 

 

 

六、insert/update注入

我們就填必填的兩項,用戶那里輸入單引號,密碼隨便輸入,頁面會有報錯信息,說明存在SQL注入漏洞

 

 

 

這種情況下,我們知道后台使用的是 insert 語句,我們一般可以通過 or 進行閉合。后台的 SQL 語句可能是下面這個樣子

insert into member(username,pw,sex,phonenum,email,adderss) values(‘doge‘, 11111, 1, 2, 3, 4);

構造下面的 payload,基於 insert 下的報錯來進行注入

adminminmin 'or updatexml(1, concat(0x7e,database()), 0) or '兩個單引號分別閉合 values數據的前后兩個單引號,所以不用注釋后面的句子

 

 注入成功

 

七、delete注入

這里有一個留言板,點刪除可以把對應的留言刪掉我們點刪除並用 BurpSuite 抓包,實際上就是傳遞了一個留言的 id,后台根據這個 id 去刪除留言

 

 

 

 構造出 or updatexml(1, concat(0x7e,database()), 0) 在id=67后

 

八、http header 注入

有些時候,后台開發人員為了驗證客戶端頭信息(比如cookie驗證)

或者通過http header獲取客戶端的一些信息,比如useragent,accept字段等

 

會對客戶端的http header信息進行獲取並使用SQL進行處理,如果此時並沒有足夠的安全考慮

則可能會導致基於 http header 的 SQL 注入漏洞

登陸之后會記錄以下信息

 

 下面BurpSuite修改發包內容

 

 把 User-Agent 改為一個單引號,發包看看后台處理的結果,發現直接報了 SQL 語法錯誤

 

 

還有 cookie 也是可以注入的,后端可能會取得我們的 cookie,后端通過拼接 SQL 語句進行驗證

 

 

九、盲注boolian

我們在皮卡丘平台一進行實驗,輸入下面的測試語句

kobe‘ and 1=1#

 

 

kobe‘ and 1=2#

 

 

於是利用and來構造payload

kobe' and ascii(substr(database(),1,1))=112 #

來一個個進行測試,爆出database

不對的話就會出現用戶名不存在,正確的話就會出現用戶正確信息,可采用二分法來減少盲注次數

十、盲注time

 

 

 

 發現其存在時間盲注,只要kobe存在就會執行后面的響應五秒延遲

根據這個在加上測試

 

 

payload: kobe' and if((substr(database(),1,1))='p',sleep(4),null) #

此時412ms就返回結果,說明數據庫名第一位是p
將p改為a,則1ms返回結果
說明數據庫名第一位是p

十一、寬字節注入

當我們用通常的測試 payload時,是無法執行成功的,下面的payload會報錯

kobe‘ or 1=1#

 

 

抓包看一下

 

 

因為在后台單引號會被轉義,在數據庫中執行時多了個反斜杠。我們可以用下面的payload,在單引號前面加上 %df,讓單引號成功逃逸

kobe%df‘ or 1=1#

 

 

 

 成功

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM