命令执行

代码执行&命令执行&例题

请注意,本文编写于 116 天前,最后修改于 100 天前,其中某些信息可能已经过时。

代码执行

在PHP中有一些可直接执行的代码

eval()
assert()
preg_replace()
preg_match()
......

eval()函数

eval()会把字符串当成 PHP 代码来执行

<?php
$a = $_GET['a'];
eval($a);
?>

http://127.0.0.1/1.php?a=phpinfo();

提交后显示phpinfo.php页面

assert()函数

assert()函数会判断一个表达式是否成立,返回true or false。

与eval()类似,assert()中字符串参数也会被执行,但assert把整个字符串参数当php代码执行,eval把合法的php代码执行。

preg_replace()

preg_replace 函数执行一个正则表达式的搜索和替换。

语法:

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

  • $pattern: 要搜索的模式,可以是字符串或一个字符串数组。
  • $replacement: 用于替换的字符串或字符串数组。
  • $subject: 要搜索替换的目标字符串或字符串数组。
  • $limit: 可选,对于每个模式用于每个 subject 字符串的最大可替换次数。 默认是-1(无限制)。
  • $count: 可选,为替换执行的次数。

当$pattern处存在一个"/e"修饰符时,$replacement的值会被当成php代码来执行。

<?php
$a = $_GET['a'];
echo preg_replace("/abc/e", $a, "abc")
?>

http://127.0.0.1/1.php?a=phpinfo()

如果没有 /e 修饰符,可以尝试 %00 截断。

preg_match()

preg_match 执行的是匹配正则表达式,如果匹配成功,则允许代码执行。

CTF Wiki里讲了梅子酒师傅出的一道题,十分详细。

命令执行漏洞

命令执行漏洞是指应用有时需要调用一些执行系统命令的函数,如:system()exec()shell_exec()passthru(),代码未对用户可控参数做过滤,当用户能控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击。

system()

system()函数会输出并返回最后一行shell结果。

<?php
system($_GET['a']);
?>

http://127.0.0.1/1.php?a=ipconfig 将会返回执行ipconfig命令的结果

exec()

exec ( string $command [, array &$output [, int &$return_var ]] );

exec()函数与system()类似,也执行给定的命令,但不输出结果,而是返回结果的最后一行。虽然它只返回命令结果的最后一行,但用第二个参数array 可以得到完整的结果,方法是把结果逐行追加到array的结尾处。所以如果array不是空的,在调用之前最好用unset()最它清掉。只有指定了第二 个参数时,才可以用第三个参数,用来取得命令执行的状态码。

passthru()

passthru ( string $command [, int &$return_var ] )

与 exec() 类似,唯一不同的是,命令的所有输出返回内容都不再导入到 PHP 环境,而是直接作为输出内容,返回到浏览器的输出上,等效于把所有返回内容直接echo输出。

例题

添加新评论