BugKu WEB-alert题目深度解析与解题指南
题目分析
根据提供的HTML代码,这是一个典型的基于JavaScript alert弹窗的CTF题目,主要特点是:
- 无限循环的alert弹窗("flag就在这里"和"来找找吧"交替出现)
- 在HTML注释中隐藏了Unicode编码的flag
- 简单的页面结构,没有复杂的交互逻辑
解题步骤详解
方法一:直接HTML实体转字符
方法二:直接查看源代码(推荐)
题目源代码:
<html><head>
<title>BKCTF-WEB6</title>
<script language="javascript">
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
alert("flag就在这里");
alert("来找找吧");
<!-- flag{c79d5050dab6f335f464e9988c3e27e4} --></script></head></html>
阻止弹窗:
- 当第一个alert弹出时,勾选"阻止此页面创建更多对话框"选项
或者使用快捷键
Ctrl+Shift+I
打开开发者工具,在控制台输入:window.alert = function(){}; // 重写alert函数为空
查看HTML注释:
在页面最后有一个HTML注释:
<!-- fla&{c79d5050dab6f335f464e9988c3e27e4} -->
- 这是Unicode编码的flag
解码Unicode:
- 使用在线工具或编写简单脚本解码
JavaScript解码方法:
function decode() { const encoded = "flag{c79d5050dab6f335f464e9988c3e27e4}"; return encoded.replace(/&#(\d+);/g, (_, dec) => String.fromCharCode(dec)); } console.log(decode());
Python解码方法:
encoded = "flag{c79d5050dab6f335f464e9988c3e27e4}" decoded = ''.join(chr(int(code)) for code in encoded[2:-1].split(';&#')) print(decoded)
方法三:使用浏览器开发者工具
- 按F12打开开发者工具
- 转到"Sources"标签页
- 查看页面HTML源代码
- 直接复制注释中的编码内容进行解码
方法四:编程自动化获取
Python自动化脚本示例:
import requests
from bs4 import BeautifulSoup
import re
url = "http://题目网址/"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
# 查找HTML注释中的Unicode编码
comment = soup.find_all(string=lambda text: isinstance(text, str) and '&#' in text)
if comment:
encoded = comment[0].strip()
# 解码Unicode
flag = ''.join(chr(int(code)) for code in re.findall(r'&#(\d+);', encoded))
print("获取到的flag:", flag)
else:
print("未找到flag")
技术原理
Unicode编码:
f
表示Unicode字符'f'l
表示Unicode字符'l'- 这种编码方式称为HTML字符实体引用
JavaScript弹窗阻断:
- 浏览器允许用户阻止重复弹窗
- 也可以通过重写
window.alert
函数来阻止弹窗
信息隐藏技术:
- 开发者常用HTML注释隐藏信息
- 编码是一种基本的信息隐藏手段
题目变种与防御
可能的变种形式
- 多层编码:如Base64+Unicode组合编码
- 条件触发:只有特定操作后才显示真实flag
- 动态生成:通过AJAX获取flag内容
- 代码混淆:使用JSFuck等混淆技术
防御措施
- 不要在前端存储敏感信息
- 避免使用可逆的编码方式
- 重要的验证逻辑放在服务端
- 使用Content Security Policy(CSP)
总结
这个WEB-alert题目通过简单的弹窗干扰和HTML注释隐藏flag,考察了以下技能:
- 浏览器开发者工具的使用
- Unicode编码的识别与解码
- JavaScript弹窗的处理
- HTML结构的分析
最终flag为解码后的字符串:flag{c79d5050dab6f335f464e9988c3e27e4}
通过这道题目,我们学习到了前端信息隐藏的基本手法和相应的解密技术,这对CTF比赛和实际安全审计都有重要意义。