一、os命令执行函数
1.system()
将输入的字符串作为os命令执行,并且输出
<?php
if(isset($_GET['cmd'])){
echo "<pre>";
system($_GET['cmd']);
}else{
echo "Useage:http://IpAddress/?cmd=net user";
}
?>

2.exec()
将输入的字符串作为os命令执行,并且输出,但只输出最后一行
<?php
if(isset($_GET['cmd'])){
echo "<pre>";
print exec($_GET['cmd']);
}else{
echo "Useage:http://IpAddress/?cmd=whoami";
}
?>

3.shell_exec()
将函数中的参数当做os命令执行,完整显示
<?php
if(isset($_GET['cmd'])){
echo "<pre>";
print shell_exec($_GET['cmd']);
}else{
echo "Useage:http://IpAddress/?cmd=ipconfig";
}
?>

4.passthru()
自带输出功能
<?php
if(isset($_GET['cmd'])){
echo "<pre>";
passthru($_GET['cmd']);
}else{
echo "Useage:http://IpAddress/?cmd=ipconfig";
}
?>

5.popen()
此函数没有回显,因此需要将数据导入到一个文件中
<?php
if(isset($_GET['cmd'])){
echo "<pre>";
popen($_GET['cmd'],'r');
}else{
echo "Useage:http://IpAddress/?cmd=ipconfig > 1.txt";
}
?>

6.反引号``
将反引号中的参数当做os命令执行
<?php
if(isset($_GET['cmd'])){
$info = $_GET['cmd'];
print `$info`;
}else{
echo "Useage:http://IpAddress/?cmd=ipconfig";
}
?>

二、php代码执行函数
1.eval()
将字符串当作php代码执行
注意:输入的字符串需要以分号结尾
<?php
$str = "phpinfo();";
echo $str;
eval($str);
?>

2.assert()
将字符串当作php代码执行
<?php
if(isset($_GET['code'])){
$code=$_GET['code'];
assert($code);
}else{
echo "please submit code!<br>?code=phpinfo()";
}
?>

3.preg_replace()
利用正则表达式提取出指定字符串,字符串会被当成代码执行
<?php
if(isset($_GET['code'])){
$code = $_GET['code'];
preg_replace("/\[(.*)\]/e","\\1", $code);
}else{
echo "?code=[phpinfo()]";
}
?>

4.call_user_func()
funName是函数名称
stra是函数中的参数
<?php
if(isset($_GET['funName'])){
$fun = $_GET['funName'];
$para = $_GET['stra'];
call_user_func($fun,$para);
}else{
echo"?funName=assert&stra=phpinfo()";
}
?>

5.动态函数$a($b)
类似于call_user_func()
<?php
if(isset($_GET['a'])){
$a = $_GET['a'];
$b = $_GET['b'];
$a($b);
}else{
echo "?a=assert&b=phpinfo()";
}
?>

防御方法:
- 尽量不要使用eval等危险函数
- 如果不得已使用,一定要进行严格过滤
- 减少危险函数的使用,并在php.ini中修改disable_functions添加禁用的函数
- 参数的值尽量使用引号包裹,并在拼接前调用 addslashes() 进行转义