Bugkuctf-变量1

写在前:最近开始记录我的ctfweb的学习笔记,顺便记录一下学习到的Wp。

 

Bugkuctf题目,变量1

这里涉及了几个知识点:

1.eval()函数

eval函数,可以将括号内的字符串变成php代码执行,前提是括号内的内容以分号结尾;如果代码解析错误,则会返回false。

2.var_dump()函数

将显示一个或多个表达式的值,包括表达式的类型和值,数组会递归展开。

Bugkuctf-变量1_第1张图片

点进来看到的是php代码。

Bugkuctf-变量1_第2张图片

刚开始看到include,就猜测应该是跟文件包含相关。在我尝试了一些关于文件包含的手段之后,我发现并不对。

因为看到最后的eval以及var_dump,我就想到了payload的方式去提交申请,发现并不对。

我尝试了一下这个方法:

http://123.206.87.240:8004/index1.php?args=1);highlight_file=%27flag1.php%27;var_dump(3;

也就是借用eval函数,来实现文件的阅读。

发现:Bugkuctf-变量1_第3张图片

我们再来审计一下代码。

error_reporting(0); //关闭错误报告

include"flag1.php"

highlight_file(_file_);

if(isset($_GET['args']))// isset函数判断变量是否存在,是则返回true

{ $args= $_GET['args']; //通过get请求获取args

  if(!preg_match("/^\w+$/",$args));//利用正则匹配,检测args中的内容

  {die("args error!);}

 eval("var_dump($$args);")//var_dump会输出一个或者多个表达式的类型和值,eval函数会将字符串当成php代码来执行

}

?>

所以我们可以从中了解到,我们需要通过get请求的方式将args赋值。

我本来尝试了一下直接复制args=flag1.php,但是因为在preg_match()函数中,匹配的是\w,也就是字母字符以及下划线,所以输出了 args error!

又尝试了一下args=flag1,发现还是不对,输出了null。

再次审计代码以及这个输出的null,

最后一句话 eval(var_dump($$args));

有两个$符号,这里可以做个小小的例子:可以简单理解,把这个东西想象成二级指针。

如果$a='hello',$hello=world,那么$$a=world。

所以在做替换的时候,如果args=flag,那么最后的结果就是eval(var_dump($flag);,也难怪系统输出了null。

在看一遍题目,没有了其他的提示,我们只能猜测是使用了全局变量,尝试一下args=GLOBALS,我们的结果就出来了。

Bugkuctf-变量1_第4张图片
 

 

你可能感兴趣的:(ctf)