前言:总结一下最近做的web题,从题中可以学习到很多知识。
爆破-1
<?php
include "flag.php";
$a = @$_REQUEST['hello'];
if(!preg_match('/^\w*$/',$a )){
die('ERROR');
}
eval("var_dump($$a);");
show_source(__FILE__);
?>
给了一段PHP代码,里面还有简单的正则表达式,那就来分析一下。
/
表示的是正则表达式的开始和结束,^或\A
匹配字符串开始位置,\w
匹配任意数字或字母或下划线(a-z,A-Z,0-9,_),*
匹配0次、或1次、或多次其前面的字符(相当于可以输入多个字符、数字、或下划线),$或者\Z
匹配字符串的结束位置。所以在这里我们输入hello
可以执行
提示有说flag在某个变量中,还观察到var_dump($$a)
,可以使用超全局变量$GLOBALS
,直接在url中构造?hello=GLOBALS
即可flag。
做题小结:这道题之所以能够用超全局变量,就是因为输出时又多了一个$
,利用它构造一系列超全局变量,得出我们想要的信息。
$_SERVER 这种超全局变量保存关于报头、路径和脚本位置的信息
$_REQUEST 用于收集 HTML 表单提交的数据
$_POST 广泛用于收集提交 method="post" 的 HTML 表单后的表单数据。
$_GET 也可用于收集提交 HTML 表单 (method="get") 之后的表单数据
爆破-2
<?php
include "flag.php";
$a = @$_REQUEST['hello'];
eval( "var_dump($a);");
show_source(__FILE__);
提示说flag不在变量中,用$GLOBALS
查看果然不在。
不在变量中,那就查flag.php文件,查到一个file_get_contents() 函数
可以把整个文件读入一个字符串中。
/?hello=file_get_contents('flag.php')
除此之外,我们还可以用另一个函数file()函数
。