以一道CTF題目看無引數RCE

2022-08-21 15:12:11 字數 2406 閱讀 8574

前幾天做到了一些無引數rce的題目,自己記性不行,這裡總結一下,方便以後隨時撿起來看看.

原始碼中過濾了常用偽協議,用正規表示式規定只可以使用無引數函式進行rce,具體可以看下段**:

第乙個if過濾掉了常用的偽協議,無法直接使用偽協議讀取檔案.

第二個if用了乙個比較複雜的正規表示式,對輸入的exp引數進行匹配,把匹配到的字串全部替換為null(不改變exp的值),然後檢測替換之後的字串是否只剩乙個分號.

來分析一下那個奇怪的正規表示式,[a-z,_]限制了只可以是小寫字母以及下劃線,(?r)是引用當前表示式的意思,就是把當前的整個表示式替換到(?r)的位置,(?r)?這裡最後乙個?表示這個引用可有可無,就是說,可以匹配,也可以不匹配.也就是說這個正則只可以匹配到無引數的函式,如a(),a(b()),a(b(c())).

第三個if過濾了一些函式的關鍵字,需要構造別的方法去繞過.

無引數rce,具體怎麼解釋呢?

var_dump(scandir()); //可以使用

var_dump(scandir('.')) //不可以使用

也就是說,我們可以使用函式套娃的形式,來逐層實現我們rce的命令.

[gxyctf2019]禁止套娃

題目存在git洩露,這裡有乙個問題就是用dirsearch掃會導致訪問過快從而掃不到./git,不知道是掃瞄工具原因還是題目問題.

來看原始碼

傳入exp引數,經過三個if函式判斷後,如果滿足條件會執行exp引數.

eval($_get['exp']); 典型的無引數rce.

這中過濾條件,想要getshell沒戲了,從原始碼中得知flag應該就在flag.php中,那麼這道題目的意思就是使用無引數rce來讀取到flag.php中的內容.

具體改怎麼做呢?下面看幾個函式:

scandir():掃瞄當前目錄下的檔案,並以陣列的形式返回

localeconv():返回乙個包含本地數字及貨幣格式資訊的陣列,該陣列的第一項就是'.'

current():返回當前陣列的當前單元,預設值是第乙個

pos():同current()

組合拳1:獲取當前目錄下的檔案

要獲取當前目錄下的檔案,應該想到scandir('.'),知道上面的三個函式,就可以把它構造出來了.

payload:var_dump(scandir(current(localeconv())); //別忘了加分號

用current(localeconv())代替了'.'

要讀取的flag.php在陣列中的索引值是3,也就是在第4個位置,問題就是該怎麼讀取到呢?好在php為我們提供了這些函式:

array_reverse():以相反的順序返回陣列

next():將陣列中的內部指著指向下乙個元素並輸出

array_rand():從陣列中隨機獲取乙個或多個單元

組合拳2:讀取到flag.php的內容

payload1:readfile(next(array_reverse(scandir(current(localeconv())))));

因為flag.php是在陣列中的倒數第二個位置,所以將陣列倒置之後變成了第二個位置,用next()函式將陣列內部指標位置指向第二個元素,成功讀取flag.php

payload2:readfile(array_rand(scandir(current(localeconv()))));

多重新整理幾次,即可讀取到flag.php

5.另一種解法:

session_id():可以獲取到當前的會話id.

session_start():會建立新會話或者重用現有會話。如果通過 get 或者 post 方式,或者使用 cookie 提交了會話 id, 則會重用現有會話。

因為sessionid是存放在客戶端的cookie中的,所以我們可以手動設定會話id為flag.php來讀取到其中的內容

payload:readfile(session_id(session_start())); //注意一點,session_start()必須在session_id()之前呼叫,使伺服器端使用我們cookie提交的會話id.

可以使用函式還有很多,以後再另寫一篇文章總結吧.

從一道CTF題看整數溢位

整數溢位漏洞是程式開發過程中危害較大的一種漏洞,經常是pwn中各大神的突破點,利用此跳板,攻入系統,進而攻陷真個系統。此類漏洞不容易發覺,也不容易引起程式設計人員的注意。近期在研究 網鼎盃2020白虎組 的比賽試題中,有一道re逆向題目 惡龍 涉及到整數溢位,如利用此漏洞,可快速拿到flag。本題解...

一道this的題目

請問下面 中的this值指向的是全域性物件還是物件o?function f return c var o new f console.log o.constructor.name object這裡的this指向全域性物件,因為 c call without new。這裡用正常的方式呼叫的函式 c 所...

一道題目 intel

從序列中找四個四字子串形成十進位制數使之乘積最大 就是求四個最大的?我目前只想到如下辦法。這個題並不是關於複雜的演算法,其本意是要利用並行處理,但目前尚未考慮到 除了其中比較求最小值部分有希望用simd include int g teststring int main void int picke...