Web-爆破

“百度杯”CTF比赛 2017 二月场——Web-爆破-1

题目如下:

题目提示:flag在变量

提示说flag在变量里,看到var_dump(),$$a时,就猜测是考察超全局变量GLOBALS ,然后想到 [php全局变量漏洞 $GLOBALS漏洞预警],

所以就构造:http://8c262ae1cd78449e9ccdd89460a0fb9ca32af7e11aae45ee.changame.ichunqiu.com/?hello=GLOBALS

$和$$的理解

The $var (single dollar) is a normal variable with the name var that stores any value like string, integer, float, etc.

The $$var (double dollar) is a reference variable that stores the value of the $variable inside it.

运行一下这段代码就很好理解了

1
2
3
4
5
6
7
<?php  
$x = "abc";
$$x = 200;
echo $x."<br/>";
echo $$x."<br/>";
echo $abc;
?>

PHP 超级全局变量列表:$GLOBALS、$_SERVER、$_REQUEST、$_POST、$_GET、$_FILES、$_ENV、$_COOKIE、$_SESSION
都试了一遍

解题收获

  1. 可变变量:把一个变量的值作为一个变量的变量名
    $$a = 'world'; 相当于$$a=$hello=world
    echo "$a $hello";?> 输出hello world

  2. GET方法和POST方法传值的区别:
    使用get方式提交表单时,浏览器将各个表单字段元素及其数据按照url参数的方式附加在请求行的资源后面。使用get方式传递的数据量是有限的,一般限制在1K以下。
    使用post方式时,浏览器把各表单字段元素及其数据作为HTTP消息的实体内容发送给web服务器,而不是作为url地址参数传递,因此,使用post方式,要比使用get方式大的多。


“百度杯”CTF比赛 2017 二月场——Web-爆破-2

题目如下:

题目提示:flag不在变量

根据提示,就没必要再变量上浪费时间了。既然不在变量上,题目中又出了file的字眼,考虑从文件上入手。

方法一:

使用file_get_contents() 函数,其作用为把整个文件读入一个字符串中。URL?hello=file_get_contents('flag.php')
'编码为%27,url中特殊符号编码可以避免歧义。

方法二:

?hello=file("flag.php")
file_get_contents() 函数把整个文件读入一个字符串中。
file() 函数把整个文件读入一个数组中。与 file_get_contents() 类似,不同的是file() 将文件作为一个数组返回。数组中的每个单元都是文件中相应的一行,包括换行符在内。如果失败,则返回 false。

解题收获

对file_get_contents(),file() 函数的区别有了解了一分



“百度杯”CTF比赛 2017 二月场——Web-爆破-3

题目如下:

题目提示:额,没有别想p事

直接上关键的部分:

1
2
3
4
if($_SESSION['whoami']==($value[0].$value[1]) && substr(md5($value),5,4)==0){
$_SESSION['nums']++;
$_SESSION['whoami'] = $str_rands;
echo $str_rands;

Session中的num初始值为0,time为当前时间,whoami的初始值为ea。
120秒之后销毁会话。用str_rands随机生成2个字母,whoami需要等于我们传递的value值的前两位,并且value的md5值的第5为开始,长度为4的字符串==0,这样num++,whoami=str_rands,循环10次后,输出flag。

由于==为弱判断类型, 利用md5函数不能对数组进行处理,则可以用数组绕过,md5()==0;
因此,构造payload?value[]=ea
接着构造payload 手工10次
第十次就可得到flag

关于php弱类型绕过参考链接

解题收获

虽然做过这样的类型的题目,但到做题的时候还是有些不知道该怎么运用,这次过后应该会更熟练一点