web1_此夜圆
一江春水何年尽,万古清光此夜圆
打开题目发现有php源码可以下载(最先点快了根本没发现,点进去一脸懵逼还扫了半天目录)下载下来,发现源码。
这里哥们一看就知道是似曾相识题型。php反序列化。
简单的思路就是把我们输入的参数通过字符逃逸的方式,让密码等于yu22x,就可以得到flag
我们需要的是在最后构造一个**”;s:8:”password”;s:5:”yu22x”;},(“;这两个符号是为了闭合前面的Firebasky字符串。后面的}是为了结束反序列化,让本来应该加入反序列化的“;s:8:”password”;s:1:”1”}**被舍弃掉)
这里一共有30个字符,而发现这里的过滤函数将Firebasky替换成Firebaskyup,一下子增加两个字符,算一下就需要填写15个Firebasky,所以我们可以构造
1 | payload=?1=FirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebasky";s:8:"password";s:5:"yu22x";} |
然后通过get方式提交就可以得到flag了
web2_故人心
三五夜中新月色,两千里外故人心
打开环境,迎面而来就是php代码,而且这个代码4个if在递进,就更加让人心烦了。
我们一个一个看
第一关需要过变量a的数字验证关。要求为:is_numeric($a) and strlen($a)<7 and $a!=0 and $a**2==0
这里需要知道php的一个知识点,php在一个特别小的数的时候,进行平方运算时,会被截断,由于这里限制了strlen,所以我们的办法是采用科学计数法,即1e-162.就可以完成第一个条件。
第二个我也一直看不懂,后头看了网上的wp,才知道原来是有提示的,但是不知道为什么现在好像没看到了。原题提示如图:
可以知道,他给出了一些关于后几位的数字。我们知道md5的碰撞原理是md5经过加密后,哈希值前面的字符串为0e,然后php语言会默认当作科学计数法,于是第一个数字就是0,就完成了md5的碰撞。为了满足$b==hash(“md2”, $b)和$c==hash(“md2”,hash(“md2”, $c))这两个条件,我们需要满足的是原变量b和c与hash出来的字符串前面都会有0e。这样的话,相当于就满足了0=0条件。
于是我们需要写一个php脚本来爆出原来的数字。
1 | <?php |
然后爆出b=0e652024452 c=0e603448399
接下来是最后一个,需要以post的方式提交url。这里科普一下以下几个函数:
观察源码可以发现,他主要是做了以下几步:
if(filter_var($url[1],FILTER_VALIDATE_URL)) 用来判断数据符不符合url格式。
$host=parse_url($url[1]); 用parse_url函数解析该url,形成一个数组。
if(preg_match(‘/ctfshow.com$/‘,$host[‘host’])),如果host名中有ctfshow.com就可以了
这里我们还需要知道一个知识点,php源码中,在向目标请求时先会判断使用的协议,如果协议无法识别,就会认为它是一个目录,所以这里我们可以运用目录穿越漏洞。
构造payload=
1 | url=abc://ctfshow.com/../../../../../fl0g.txt |
这里要返回多少个前目录,我也是一个一个试出来的……
web3_莫负婵娟
皎洁一年惟此夜,莫教容易负婵娟
这道题打开网页源码一看就可以知道
是想要考like查询。
1 | like模糊匹配 |
要想猜到密码,首先需要知道密码位数。然后去网上看其他师傅的脚本抄了一个猜位数的脚本。
1 | import requests |
可以知道密码为32位。
然后又需要写脚本来爆破,这里也看了网上师傅的脚本。
1 | import requests |
得到密码为:
成功通过用户名和密码登录后台,发现一个神奇的查询网址
通过bp抓包进行爆破,会发现小写字母全部被过滤了,然后用fuzz测试,可以发现,大写字母,数字,{},空格,$,~可以使用。根据题目的提示:环境变量 +linux字符串截取 + 通配符再加上网上师傅的答案,我们可以通过linux系统的$PATH环境变量来构造特殊的字符串命令。
这里进行一下解释:
在linux中输出$PATH时,他会给出一个字符串目录,我们可以通过字符串截取的操作来取得想要的字符。比如:
该命令意思是从$PATH变量里的第五个字符开始,拿1位字符,对照上图来看,第五个字符就是l,所以可以得到l。因此我们可以使用**ip=1;${PATH:5:1}${PATH:2:1}**来查询系统的文件。
ps:在这里要提醒大家,应该是环境原因,如果你post提交数据的时候,前面不加**ip=**,我的环境就会崩掉。发现加了ip=就正常使用
可以看到有flag.php文件。
然后我们通过构造nl命令,可以查看该文件。
这里又需要用到liunx中的通配符知识,liunux中,问号表示一个字符,我们发现flag.php有总共7个字,于是我们可以构造
ip=0;${PATH:14:1}${PATH:5:1} ????.???
这个来查看该文件,之后打开源代码即可发现flag