代码执行漏洞

原理

​ 把用户提交的参数作为代码去执行。动态代码执行函数过滤参数不严格,导致用户输入数据作为服务端代码执行。

危害

执行脚本代码

产生

web源码,一些常见的cms

中间件漏洞

相关函数

  • eval()
  • assert()
  • preg_replace()
  • create_function()
  • call_user_func()
  • call_user_func_array()
  • ….

eval,assert函数

eval(),php4, phjp 5,php 7把字符串当作php代码执行、当用户可以控制字符串那么此时就存在代码执行漏洞。

1
2
3
4
5
#eval.php
<?php
$a = $_GET['cmd'];
eval($a);
?>

payload:

?cmd=phpinfo();

preg_replace函数

preg_replace()函数是执行一个正则表达式的搜索和替换、如果存在危险的/e修饰符,会使preg_replace()将替换的字符串当作php代码执行。

1
2
3
4
#preg_replace.php
<?php
echo preg_replace("/hello/e",$_GET["cmd"],"helloworld");
?>

payload:

?cmd=phpinfo();

动态函数调用

在php中可以把函数名通过字符串的方式传递给一个变量,然后通过此变量动态调用函数。在php语言中,可以通过动态函数调用来对代码进行执行。

1
2
3
4
5
6
7
8
9
10
11
#function.php
<?php
function A(){
return "..A..";
}
function B(){
return "..B..";
}
$fun = $_REQUEST['cmd'];
echo $fun();
?>

payload

?fun=phpinfo

call_user_func()

call_user_func()函数的作用是把第一个参数作为回调函数调用。

1
call_user_func (callable $callback [, mixed $parameter[, mixed $...]]):mixed

第一个参数callback是被调用的回调函数,其余参数是回调函数的参数

1
2
3
<?php
call_user_func($_REQUEST['call'],$_REQUEST['cmd']);
?>

payload

?call=system&cmd=whoami