一、題目


點開頁面,是一個提交表單
二、解題
1. 先試試一些常規的姿勢


輸入數字有回顯


輸入其他字符(或數字后加單引號構造閉合)都沒有回顯,應該是關閉了錯誤提示
那么我們可以確定這里是字符型注入
2. 優先考慮用聯合查詢


無論輸啥數字都顯示nonono,初步推斷有關鍵字被后臺過濾掉了
一個一個試(也可以在BP里面buzz測驗)





常用的關鍵字只有show和select沒被過濾掉(or被過濾了肯定order也用不了)
聯合查詢可以放棄了
3. 我們知道在陳述句里穿插分號,可以同時執行多條命令,這就是堆疊注入的原理
于是用show嘗試


爆庫爆表之后發現flag檔案 Flag

好家伙,flag都被過濾掉了
再試試handler吧

......(流汗黃豆臉)
4. 報錯注入,時間盲注就別考慮了
測驗之后 extractvalue(),sleep這些關鍵字都被過濾掉
冥思苦想(看了別人的wp)
這里我們回到最開始測驗得到的結論
除非零數字外,輸入其他字符都不會得到回顯
于是猜測后臺陳述句中存在 "||",如下
select $_GET['query'] || flag from Flag
在MySQL中,"||" 起到的是“或”的作用,這就是輸入0和其他字符沒有回顯的原因
而在Oracle中,"||" 起到的是連接字串的作用
于是有兩種解法
方法一:使用通配符 *
通配符 * 的在查詢陳述句中的作用是匹配所有結果集
構造payload:
*,1
整個查詢陳述句就變為
select *,1 || flag from Flag
1 || flag 等價于 1
從而會輸出Flag里面所有內容
方法二:修改配置
可以讓MySQL里的 "||" 變成Oracle里的 "||"
構造payload:
1;set sql_mode=PIPES_AS_CONCAT;select 1
整個查詢陳述句變成
select 1;set sql_mode=PIPES_AS_CONCAT;select 1 || flag from Flag
和concat()作用一樣
得到flag

三、總結
1. 這里猜測管道符 || 的存在確實是比較刁鉆,不過有一點點提示都好,至少沒把show這些關鍵字過濾掉,要不然真的是沒啥辦法
2. 遇到 "||" 等符號存在的時候有兩種繞過方式,一是用 *,1 來輸出檔案的全部內容,二是修改這類字符的定義
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/320993.html
標籤:其他
下一篇:D 模塊 CTF 防御
