原题内容:
地址:http://120.24.86.145:8003/
怎么说呢,难其实也不难,还是基本知识点掌握不足吧,写个wp记录下自己学习到的知识点
<?php
include "flag.php";
$a = @$_REQUEST['hello'];
eval( "var_dump($a);");
show_source(__FILE__);
?>
拿到代码,还是很简单就分析出hello这个post/get获取的参数值很重要($_REQUEST对get,post都能接受)
简单起见,当然选择get传值
其实根据最基本注入''引号闭合的思路,很容易就想到了利用括号,毕竟,eval中是执行的代码段
最基本的:
http://120.24.86.145:8003/index.php?hello= 1);print_r(2
上面的代码结合起来就是:
eval( "var_dump(1);print_r(2);");
结果也是很明显:
说明执行没问题,其实后面就简单了,打开文件就好
下面理一理两个失误点,
第一点,看了大佬们wp,对大佬们的答案,非常不理解:
hello=);print_r(file("./flag.php"));//
问了一个大佬才知道这里的诀窍
划重点,这里很关键,
eval函数中,“”内部为代码,//只在代码中起作用,相当于只注释了);
第二点,file_get_contents与file及var_dump,print_r和echo(划重点,后面三个的区别有待解决)
这个的区别我在网上没有找到详细的解释,不过,我本地做了个测试,简单说明下问题吧,求大佬解答
file测试没问题,接下来看file_get_contents,先不说明,看几张图
这个图的测试结果,显示空白,于是我进行了接下来的测试
这我就很好奇了,接下来我删除该字符串又测试了echo,依旧是空白
紧接着我测试了var_dump()
没错,可以显示
按照php手册的解释,file_get_contents读取文件为字符串,var_dump证明了这一点,可是print_r和echo为啥不能输出?
待解决,以后补上