1. 程式人生 > 實用技巧 >[SUCTF 2019]Easy SQL

[SUCTF 2019]Easy SQL

日常and or

一圈測試之後發現,and or && from都過濾了,很奇怪 || 這個沒有過濾。

接著嘗試,試試堆疊注入。

可以,接著看錶

發現flag

嘗試desc

經測試,Flag被過濾了。

想過之前碰到一個預處理的,嘗試之後發現限制了輸入長度。

concat char 都不行,prepare被過濾

突然想到and or &&都被過濾了,唯獨留了 ||,可能有什麼貓膩

查了一下mysql ||這個符號。

結果發現oracle || 還有連線的作用

但這裡是或

所以嘗試一下有沒有辦法能把 || 改成oracle那樣的連線符

然後就沒有然後了,不會了,看了wp,發現還有個sql_mode這個東西

關於sql_mode: 它定義了 MySQL 應支援的 SQL 語法,以及應該在資料上執行何種確認檢查,其中的PIPES_AS_CONCAT將 || 視為字串的連線操作符而非 “或” 運算子。

具體說明:https://www.cnblogs.com/piperck/p/9835695.html

還有就是這個模式下進行查詢的時候,使用字母連線會報錯,使用數字連線才會查詢出資料,因為這個 | | 相當於是將select 1select flag from flag的結果拼接在一起。

看了關鍵的查詢程式碼是 :

select
$post['query']||flag from Flag

官方給的 payload 是

1;set sql_mode=PIPES_AS_CONCAT;select 1

拼接一下就是

select 1;set sql_mode=PIPES_AS_CONCAT;select 1||flag from Flag

關於 *,1

拼接一下就是

select *,1||flag from Flag

select *,1 from Flag

可以,腦洞清奇,記下來了。