简介
命令执行
web应用提供调取外部应用、执行系统命令功能。用户利用这些功能执行系统命令,从而读取敏感信息、拿到系统权限。
代码执行
应用程序在调用一些能够将字符串转换为代码的函数(如PHP中的eval(),eval可以将字符串当做函数进行执行)时,没有考虑用户是否控制这个字符串,将造成代码执行漏洞。一般很难通过黑盒查找漏洞,大部分都是根据源代码判断代码执行漏洞。
危险函数
命令执行函数:
system(): 执行一个外部的应用程序并显示输出的结果
exec(): 执行一个外部的应用程序,以数组形式保存结果,回显需要echo
shell_exec(): 执行shell命令并返回输出的结果的字符串,回显需要echo
passthru(): 执行一个unix系统命令并显示原始的输出
popen
proc_open
pcntl_exec() (需要开启pcntl扩展) ob_start:打开输出控制缓冲
popen()、proc_open() 不会直接返回执行结果,而是返回一个文件指针
代码执行函数:
eval():将字符串当做函数进行执行(需要传入一个完整的语句)。
assert():判断是否为字符串,是则当成代码执行。php官方在php7中更改了assert函数。在php7.0.29之后的版本不支持动态调用。
call_user_func():回调函数,可以使用is_callable查看是否可以进行调用call_user_fuc_array():回调函数,参数为数组
create_function():创建匿名函数
preg_replace()::当php版本小于7时,当为/e 时代码会执行
array_map():为数组的每个元素应用回调函数
array_iter():依次将array数组中的每个值传递到callback函数。如果callback函数返回true,则 array数组的当前值会被包含,在返回的结果数组中。数组的键名保留不变。
usort():使用自定义函数对数组进行排序。
${}:中间的php代码将会被解析。preg_replace
利用方式
1.eval
eval():将字符串当做函数进行执行(需要传入一个完整的语句)
2.assert
assert():判断是否为字符串,是则当成代码执行
3.call_user_func
call_user_func():回调函数,可以使用is_callable查看是否可以进行调用
4.call_user_fuc_array
call_user_fuc_array():回调函数,参数为数组
5.create_function
create_function():创建匿名函数
string create_function(string $args,string $code)
args是要创建的函数的参数,code是函数内的代码
6.preg_replace
preg_replace():当为/e时代码会执行
7.system
system:可以执行系统命令并将其输出
8.passthru
passthru:执行命令并输出
9.shell_exec
shell_exec:执行命令,但无回显
10.反引号
反引号:执行shell命令,并返回输出的字符串