Hackergame-2024-Web
Hackergame-2024-Web
xxshh签到
PaoluGPT
下载源码,包含database.py和main.py。
|
|
分析以上代码,发现
|
直接将conversation_id
插入到查询中,没有经过参数化或转义,这是一个明显的SQL 注入漏洞。
闭合方式是单引号,构造https://chal01-acbmue75.hack-challenge.lug.ustc.edu.cn:8443/view?conversation_id=1' OR '1'='1
,理论上会返回所有行,但是只返回了一条数据。
阅读源码,发现execute_query
使用了 cur.fetchone()
,默认返回第一行结果。想到利用group_concat
。
查询语句的列数是2,所以构造
|
注意:#
是 MySQL 的特有注释方式,在其他数据库系统(如 SQLite)中不被支持。
在 SQL 注入时,建议使用 --
,因为它是一个更通用的注释符号,确保在各种数据库中都能正确工作。
在结果中搜索flag关键词。
喜欢做签到的 CTFer 你们好呀
比大小王
|
小结:
自执行匿名函数(IIFE):
(function fastAutomateGame() {
// 函数体
})();在 IIFE 中使用括号的原因是为了将函数声明转换为函数表达式,从而能够立即调用它。
submit
函数发送一个包含inputs
的 POST 请求到服务器的/submit
路径,并将玩家的所有输入(inputs
数组)作为数据发送。返回的数据(data.message
)会显示在页面的dialog
元素中,可能包含有关结果的信息,比如“成功”或“失败”的消息。如果服务器返回的消息中包含flag
,可以在这里查看到。由于键盘和鼠标事件触发
chooseAnswer
函数来更新输入,如果可以通过脚本触发这些事件,就可以快速累积到100
分,并触发submit
函数。游戏中有防止“快速答题”的机制,检测到我们修改了状态或超速完成操作。为了避免被识别为“时空穿越”,增加一个稍短的间隔(例如,50到150毫秒的随机延时)来模拟真实答题。
state.allowInput
变量用于控制用户是否可以输入答案。在正常情况下,游戏逻辑中会在倒计时结束后将其设置为true
,以允许用户输入。但是,在这段自动化代码中,输入的选择是直接计算出来的,没有实际的用户输入行为,因此即使在倒计时期间也能够执行。
Node.js is Web Scale
禁止内卷
|
仔细阅读后端代码,后端接收到上传的文件后,首先会检查文件是否存在,然后将文件保存到 /tmp/uploads
目录。后端会尝试将上传的文件读取并解析为 JSON 格式。然后,它将与预设的 answers.json
进行比较。通过计算上传的文件中的数字与 answers.json
中的数字之间的平方差得到评分。
如果提交的 JSON 列表每一项都是 0,那么评分的结果将等于 answers
列表所有元素的平方和。通过更改第一个元素猜测answers
列表的第一个元素:如果是37,那么两次结果的差应是37的平方。
[!NOTE]
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它通常用于传输数据,特别是在 Web 应用程序中。JSON 格式的数据结构由以下几部分组成:
- 对象(Object):由花括号
{}
包裹的键值对集合,键必须是字符串,值可以是多种类型。- 数组(Array):由方括号
[]
包裹的值的集合,值可以是任何类型。- 字符串(String):被双引号
"
包裹的文本。- 数字(Number)、布尔值(Boolean)、null:JSON 也支持这些原始数据类型。
在 JSON 格式中,数据本质上是以字符串的形式传输的。
脚本如下:
|
但是flag提交上去显示答案错误。因为在 flask 代码中做了「归一化」的操作:
|
重新审题。题目中有提示:助教部署的时候偷懒了,直接用了 flask run
(当然了,助教也读过 Flask 的文档,所以 DEBUG 是关了的)。而且有的时候助教想改改代码,又懒得手动重启,所以还开了 --reload
。启动的完整命令为 flask run --reload --host 0
。网站代码运行在 /tmp/web
。
在使用 Flask 时,app.py
通常是 Flask 应用的主文件。这道题的关键是服务器的后端使用了flask run --reload --host 0
命令运行,并开启了--reload
选项,那么如果有文件换掉了app.py
,flask会马上应用新的脚本。所以在源代码中写一个读取并返回answer.json
的route,然后上传替换掉原本的 app.py
即可。
|
上传文件的目录是 /tmp/uploads
,题干又特意提示了网站目录在 /tmp/web
,想到路径穿越漏洞。上传文件的时候,给文件名前加上../
就可以穿透目录,上传到任意的地方去。BurpSuite抓包,修改传输路径为../web/app.py
。
访问/flag:
对应的数字加 65 后使用 ASCII 编码转换:
|