虽然这道题目在Bugkuctf给的链接已经无法进入,但是这道题涉及的知识点还是值得大家花时间来学习的。
1. 代码审计部分
<?php
include "flag.php";
$a = @$_REQUEST['hello'];
eval("var_dump($a);");
show_source(__FILE__);
?>
- include “flag.php”; 从本地中包含flag.php文件。
- a = @ a = @ a=@_REQUEST[‘hello’]; 一个超全局变量,可以接收_get,_post,_cookie发送的数据(为了方便起见,我们用_get来发送数据)
- eval(“var_dump($a);”); eval函数,如果参数是一个表达式,eval() 函数将执行表达式。如果参数是Javascript语句,eval()将执行 Javascript 语句;简单来说,就是将引号中字符串当作php代码。
- var_dump()方法是判断一个变量的类型与长度,并输出变量的数值,如果变量有值输的是变量的值并回返数据类型.
此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。
这里是将变量a的值打印到界面中。 - show_source(FILE);高亮显示文件中的代码。
2. 知识点补充
那么什么是文件包含呢?
简单来说,就是一段提前写好的代码,在开发中为了避免写出冗余的代码,开发人员会提前设计好一部分会被重复利用的代码。文件包含就是你在开发中调用了这一部分函数。
3. 思路分析
所以,当看到include函数的时候就要考虑本地包含漏洞这以方面的内容。题目中的这段代码明明调用了flag.php但是却没有起到任何的效果,这就意味着flag文件中的内容很有可能被注释掉了,因此我们要想办法将它还原出来,这么一想题目的思路就很清晰了。
方法一:
直接将flag.php文件的内容读入参数hello中,然后让var_dump()函数打印出来。
所以可以将payload写成:?hello=file(“flag.php”)
方法二:
最基本的注入引号闭合的思路,可以利用eval函数的特性来执行这一漏洞
payload写成:?hello=3);show_source(%27flag.php%27);//
这样eval函数执行的语句就变成了:var_dump(3); show_source(%27flag.php%27);
后面的内容被//注释掉了。执行后就得到了flag.php中的源代码,在里面成功找到flag。(这张图是网上截的,大致的形式就是这样的)。