命令执行函数
system()
能够将字符串作为OS 命令执行
并且使用system() 可以将结果输出到前端
1 2 3 4 5 6 7 8 9 10
| <?php if(isset($_GET['cmd'])){ echo "<pre>"; system($_GET['cmd']); }else{ echo" ?cmd=ipconfig "; } ?>
|

exec()
将字符串当作os 命令执行,但是不会自动返回到前端
- 需要手动的输出命令的执行结果
- 不支持命令中存在空格
1 2 3 4 5 6 7 8 9 10
| <?php if (isset($_GET['cmd'])) { echo "<pre>"; print exec($_GET['cmd']); } else { echo " ?cmd=ipconfig "; }
|
注意这个相比上面一个添加了print
shell_exec()
把函数中的参数当作os 命令执行
1 2 3 4 5 6 7
| <?php if(isset($_GET['cmd'])){ print shell_exec($_GET['cmd']); }else{ echo"?cmd=whoami"; } ?>
|
passthru()
将字符串当做系统命令执行
1 2 3 4 5 6 7
| <?php if(isset($_GET['cmd'])){ passthru($_GET['cmd']); }else{ echo"?cmd=whoami"; } ?>
|
popen()
此函数没有回显,但是可以执行命令
1 2 3 4 5 6
| <pre> <?php if(isset($_GET['cmd'])){ popen($_GET['cmd'],'r'); } ?>
|


反引号
反引号``内的字符,也会被解析成os 命令


代码执行函数
eval()
会将符合PHP 语法规范字符串当作php 代码执行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| <?php
$str = $_GET['code']; eval($str);
?> $str = addslashes($_GET['code']); echo $str; eval($str);
|
assert()
同样会将字符串当做PHP 代码来执行。
1 2 3 4 5 6 7 8
| <?php if(isset($_GET['code'])){ $code=$_GET['code']; assert($code); }else{ echo "Please submit code!<br />?code=phpinfo()"; } ?>
|
preg_replace()
preg_replace函数分析 - AU9U5T (tsy244.github.io)
preg_replace() 函数的作用是对字符串进行正则匹配后替换。
- 搜索
$subject 中匹配$pattern 的部分,以$replacement 进行替换。
- 当
$pattern 处,存在e 修饰符时,$replacement 的值会被当成PHP 代码来执行。
1 2 3 4 5 6 7 8
| <?php if(isset($_GET['code'])){ $code=$_GET['code']; preg_replace("/\[(.*)\]/e",'\\1', $code); }else{ echo"?code=[phpinfo()]"; } ?>
|
执行的代码中的参数会被转义
call_user_func()
call_user_func() 等函数都有调用其他函数的功能,回调函数。
1 2 3 4
| $funName = 'assert'; $para = 'phpinfo()'; call_user_func($funName,$para);
|
$funName 被调用的函数名
$para 作为被调用函数的参数,参数中的单引号没有被转义
1 2 3 4 5 6 7 8 9
| <?php if(isset($_GET['fun'])){ $fun=$_GET['fun']; $para=$_GET['para']; call_user_func($fun,$para); }else{ echo"?fun=assert&para=phpinfo()"; } ?>
|
动态函数$a($b)
这种写法跟使用call_user_func()的初衷一样,用来更加方便地调用函数,但是一旦过了不严格就会造成代码执行漏洞。
1 2 3 4 5 6 7 8 9 10 11
| <?php if(isset($_GET['a'])){ $a=$_GET['a']; $b=$_GET['b']; $a($b); }else{ echo " ?a=assert&b=phpinfo() "; } ?>
|