題目
解題過程
試了一下單引號,發現存在注入,數據庫類型是MariaDB
第一反應是工具跑一下>_<,跑出數據庫名稱:supersqli
繼續跑表名,沒跑出來,嘗試了下執行sql,也木有任何返回。。。
看了一下當前用戶是root,但不是dba,難道是木有權限。。。
再回到頁面試了下,發現有過濾關鍵字,這應該就是工具沒跑出表來的原因。
把繞過的方法挨個試了一遍,發現可以堆疊注入,查出兩個表名來,但是不能select數據出來(因為關鍵字過濾了。。)
查詢表中的字段,flag在1919810931114514這張表中
查詢表中數據的方法我沒想到,百度了一下,有兩種:1.頁面默認查的是words表,將1919810931114514的表名和words交換;2.利用mysql的預處理。
預處理語句輸入如下:
1';use supersqli;set @sql=concat('s','elect * from `1919810931114514`');PREPARE pre FROM @sql;EXECUTE pre;--+
這里很巧妙的用concat繞過了關鍵字的檢查(這個思路厲害了,好好學習~^_^~)
知識點總結
1. MySQL表名為純數字時(表名和保留字沖突時也是加反引號),要加反引號:show columns from `1919810931114514`
2. MySQL 官方將 prepare、execute、deallocate 統稱為 PREPARE STATEMENT,也就是預處理語句
3. 字符拼接函數可以考慮用來繞過關鍵字檢查
如需轉載,請注明出處,這是對他人勞動成果的尊重。