“百度杯”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 | <?php |
PHP 超级全局变量列表:$GLOBALS、$_SERVER、$_REQUEST、$_POST、$_GET、$_FILES、$_ENV、$_COOKIE、$_SESSION
都试了一遍
解题收获
可变变量:把一个变量的值作为一个变量的变量名
$$a = 'world'; 相当于$$a=$hello=world
echo "$a $hello";?> 输出hello world-
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 | if($_SESSION['whoami']==($value[0].$value[1]) && substr(md5($value),5,4)==0){ |
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
解题收获
虽然做过这样的类型的题目,但到做题的时候还是有些不知道该怎么运用,这次过后应该会更熟练一点