我的理解是,頁面不給出任何錯誤資訊的都屬於盲注
基於布林的盲注
通過返回的頁面是否正確來判斷,如果後台做了限制,此方法無效
例如less-9,錯誤也會顯示you are in...........
基於報錯的盲注
構造乙個能回顯錯誤資訊的sql語句,如果後台做了限制,此方法無效
例如less-8以及後面的幾關,錯誤資訊被注釋//print_r(mysql_error());
基於時間的盲注
根據錯誤和正確返回的頁面的時間不同來判斷,雖然是最麻煩的方法,但是不會受到上面兩種的限制
關鍵函式:
還有幾個其他的我也沒用過,以後再補上
以less-5為例,演示基於布林盲注的流程:
使用length(database())判斷當前資料庫名的長度
' and length(database())>5%23,頁面顯示正確。改為' and length(database())>10%23,頁面顯示錯誤,說明資料庫名長度在5-10之間,接下來就是逐個逐個試,最後得到長度為8。
使用left(database(),1)逐個猜解出資料庫名
' and left(database(),1)>'a'%23,頁面顯示正確。改為' and left(database(),1)>'s'%23,頁面顯示錯誤,說明在字母a-s之間,用二分法或者其他方法逐個試,最後得到資料庫名的第一位是s
。再來猜解第二位' and left(database(),2)>'sa'%23。重複第一位的做法就行。當然這裡也可以配合ascii函式使用,比如:' and ascii(left(database(),1))>98%23。由第一步知道是8位,最後得到資料庫名security
。(這一步也可以用substr函式做到)
使用substr函式猜解出表名
先用legth函式判斷出第乙個表名的長度' and length((select table_name from information_schema.tables where table_schema='security' limit 0,1))>6%23,顯示錯誤,改為>5
顯示正確,說明第乙個表名的長度為6。然後使用substr函式來逐個猜解出表名,' and substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)>'o'%23顯示錯誤,改為》m顯示正確,說明第一位是m,再修改substr(str,1,1)為substr(str,2,1)猜第二位,依次猜出第乙個表名。接下來再猜第二個表名,把limit 0,1改為limit 1,1即可,重複操作。當然這一步也可以使用ascii函式,要靈活運用。
通過表名猜列
方法同上,不贅述
逐個猜出列中的資料
上面的基於布林的盲注確實挺繞,基於報錯的盲注可以通過錯誤顯示直接爆出想要資訊
基於報錯的盲注語法有很多,這裡隨便貼幾個吧
跟布林盲注原理類似,這裡就不演示了
自己發現的乙個關於時間盲注的小技巧,如果有錯誤,歡迎批評指正。
實際運用sql注入時,在沒有任何錯誤顯示的情況下,特別是在輸入錯誤也顯示正確頁面時,要如何判斷是'
還是"
還是')
等等閉合格式?這裡可以使用?id=1' and if(length(database())>100,0,sleep(5))%23故意構造一條假的語句,如果延時5秒,說明就是'
閉合,如果沒有延時,則把'
換成其他的(比如"
、'))
、")
等等)挨個測試。
通過sqli labs學習SQL注入(4)
這次用sqlmap來通關一次sqli labs 主要使用的引數 例項演示 目標url 選擇感興趣的資料庫,這裡選擇security 檢視指定表名的列 直接dump出users表的內容 也可以加 c username dump指定列username的內容,dump alldump所有資料庫的內容 sq...
sqli labs學習sql注入
在sql注入時應該記住的一些東西 information schema庫存放了所有庫的資訊 information schema.columns包含了所有表的字段 table name表名 table schema資料庫名 column name列名 information schema.table...
Sqli labs 學習筆記
資料庫的連線函式 concat和concat ws concat ws的第乙個引數是連線字串的分隔符。user 返回當前資料庫連線使用的使用者 database 返回當前資料庫連線使用的資料庫 version 返回當前資料庫的版本 127.0.0.1 sqli labs less 1 id 1 un...