内容索引:
5.2. Python
5.2.1. 格式化字符串
在Python中,有两种格式化字符串的方式,在Python2的较低版本中,格式化字符串的方式为 "this is a %s" % "test"
,之后增加了format的方式, 语法为 "this is a {}".format('test')
或者"this is a {test}".format(test='test')
当格式化字符串由用户输入时,则可能会造成一些问题,下面是一个最简单的例子
>>> 'class of {0} is {0.__class__}'.format(42)
"class of 42 is <class 'int'>"
从上面这个简单的例子不难知道,当我们可以控制要format的字符串时,则可以使用 __init__
/ __globals__
等属性读取一些比较敏感的值,甚至任意执行代码。
5.2.2. 反序列化
5.2.2.1. pickle demo
Python Pickle在反序列化时会调用 __reduce__
,可用自定义的 __reduce__
函数来实现攻击。
import pickle
import pickletools
import subprocess
class A(object):
a = 1
b = 2
def __reduce__(self):
return (subprocess.Popen, (('cmd.exe',),))
data = pickle.dumps(A())
pickletools.dis(data)
5.2.2.2. 其他序列化库
- PyYAML
- marshal
- shelve
5.2.3. 沙箱
5.2.3.1. 常用函数
- eval / exec / compile
- dir / type
- globals / locals / vars
- getattr / setattr
5.2.3.2. 绕过
- 最简单的思路是在已有的模块中import,如果那个模块中已经 import 可以利用的模块就可以使用了
- 在父类中寻找可用的模块,最常见payload是
().__class__.__bases__[0].__subclasses__()
或者用魔术方法获取全局作用域__init__.__func__.__globals__
- 有些网站没有过滤 pickle 模块,可以使用 pickle 实现任意代码执行,生成 payload 可以使用
https://gist.github.com/freddyb/3360650
- 有的沙箱把相关的模块代码都被删除了,则可以使用libc中的函数,Python 中调用一般可以使用 ctypes 或者 cffi。
"A""B" == "AB"
5.2.3.3. 防御
Python官方给出了一些防御的建议
- 使用Jython并尝试使用Java平台来锁定程序的权限
- 使用fakeroot来避免
- 使用一些rootjail的技术
5.2.4. 框架
5.2.4.1. Django
5.2.4.1.1. 历史漏洞
- CVE-2016-7401 CSRF Bypass
- CVE-2017-7233/7234 Open redirect vulnerability
- CVE-2017-12794 debug page XSS
5.2.4.1.2. 配置相关
- Nginx 在为 Django 做反向代理时,静态文件目录配置错误会导致源码泄露。访问 /static… 会 301 重定向到 /static…/
5.2.4.2. Flask
Flask默认使用客户端session,使得session可以被伪造
5.2.5. Sink
5.2.5.1. 命令执行
- os.popen
- os.system
- os.spawn
- os.fork
- os.exec
- popen2
- commands
- subprocess
- exec
- execfile
- eval
- timeit.sys
- timeit.timeit
- platform.os
- platform.sys
- platform.popen
- pty.spawn
- pty.os
- bdb.os
- cgi.sys
- …
5.2.5.2. 危险第三方库
- Template
- subprocess32
5.2.5.3. 反序列化
- marshal
- PyYAML
- pickle
- cPickle
- shelve
- PIL
5.2.6. 参考链接
5.2.6.1. 反序列化
- Python 沙箱 官方wiki
- pickle Python 对象序列化
- Sour Pickles A serialised exploitation guide in one part
- How pickle works in Python
5.2.6.2. 沙箱
5.2.6.3. 格式化字符串\
5.2.6.4. 综合
本文地址:https://blog.csdn.net/weixin_43510203/article/details/107143520
您可能感兴趣的文章:
如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!
网友评论