python的常见命令注入威胁


Posted in Python onFebruary 18, 2013

ah!其实没有标题说的那么严重!

不过下面可是我们开发产品初期的一些血淋淋的案例,更多的安全威胁可以看看北北同学的《python hack》PPT,里面提及了不只命令执行的威胁,那些都是我们亲身经历的代码。

千万要记得执行命令的时候,不要信任其他传入数据就行了,既然意识到问题,那么修复方法是多种多样的。

在我们的系统中,多处出现问题然后修修补补是不靠谱的,那么我们需要一个通用的安全执行接口,这个接口过后更新进来。

此外,我们在开发新功能的时候,也要掌握安全编程的规范技巧,这些技巧不局限在命令执行安全。

总结了一下,就是一下几点要素啦:

•命令执行的字符串不要去拼接输入的参数,非要拼接的话,要对输入参数进行白名单过滤
•对传入的参数一定要做类型校验,例如知道是数字型的,就int测试一下,会安全许多
•对于拼接串,也要严格一些,例如int类型参数的拼接,对于参数要用%d,不要%s。
•使用subprocess来传入多个参数,就可以防止命令行注入

拿我们曾经的代码(当时是最新版=,=时过境迁了)存在的bug来做教程:

示例1(变量没过滤):

a.py

site变量其实是个url格式的串,未经过滤。由于老版本中site格式没有出现问题,新版本支持url格式,就可以传入各种符号了。

cmd = 'python /a.py --task_id=%s --site=%s -b' % (taski, site)

示例2(不牢靠的过滤):

util/update.py

downloadFile函数尽管对fileName使用了过滤,但绕过的方法很多。

linux下面的命令分隔方法非常多,黑名单法是不牢靠的。

fileName = downloadInfo[0]
fileName = fileName.replace(';','').replace('&','') #过滤文件名
localMd5 = os.popen('md5sum %s%s' %(path,fileName)).read()

修复的方法就是对fileName进行白名单格式检查,比如,只允许出现字符数字以及.。

示例3(不安全的格式化字符串):

b.py

target是个url格式的串,未经过滤。并且还有潜在威胁,deep使用了%s,其实它必须是个int,使用%d才对,假如以后有机会感染deep变量,那就xxoo了。

cmd = 'python b.py --task_id "%s" -s %s --deep %s --check_level %s -b' %(taski,target,deep,check_level)

示例4(无法利用的命令注入):

c.py

site_report函数,tid参数未经格式化,目前无法利用是因为有一个查询数据库的语句:

get_object_or_404(Task, get_domain_query(request), id=tid)#这里会让带了特殊符号的tid查不到记录,所以变为404,暂时保护了位于下文的cmd拼接。

一旦该语句变更,就会导致新的命令注入漏洞

cmd = 'sh /opt/report %s >/tmp/export_report.log 2>&1' % tid

Python 相关文章推荐
Python urlopen()函数 示例分享
Jun 12 Python
使用python加密自己的密码
Aug 04 Python
python用Pygal如何生成漂亮的SVG图像详解
Feb 10 Python
深入理解Python异常处理的哲学
Feb 01 Python
pytest中文文档之编写断言
Sep 12 Python
Python3实现打印任意宽度的菱形代码
Apr 12 Python
Python实现寻找回文数字过程解析
Jun 09 Python
Python通过zookeeper实现分布式服务代码解析
Jul 22 Python
Python远程方法调用实现过程解析
Jul 28 Python
python中zip()函数遍历多个列表方法
Feb 18 Python
8g内存用python读取10文件_面试题-python 如何读取一个大于 10G 的txt文件?
May 28 Python
Pytorch distributed 多卡并行载入模型操作
Jun 05 Python
centos下更新Python版本的步骤
Feb 12 #Python
Python3.x和Python2.x的区别介绍
Feb 12 #Python
windows下安装python paramiko模块的代码
Feb 10 #Python
linux下安装easy_install的方法
Feb 10 #Python
Flask SQLAlchemy一对一,一对多的使用方法实践
Feb 10 #Python
python类型强制转换long to int的代码
Feb 10 #Python
python函数缺省值与引用学习笔记分享
Feb 10 #Python
You might like
PHP 强制下载文件代码
2010/10/24 PHP
php设计模式 Strategy(策略模式)
2011/06/26 PHP
php5.3 不支持 session_register() 此函数已启用的解决方法
2013/11/12 PHP
PHP命名空间(namespace)的动态访问及使用技巧
2014/08/18 PHP
php中session定期自动清理的方法
2015/11/12 PHP
AES加解密在php接口请求过程中的应用示例
2016/10/26 PHP
详解php用curl调用接口方法,get和post两种方式
2017/01/13 PHP
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/02/09 Javascript
jQuery类选择器用法实例
2014/12/23 Javascript
Ajax分页插件Pagination从前台jQuery到后端java总结
2016/07/22 Javascript
微信小程序 首页制作简单实例
2017/04/07 Javascript
js数组去重的N种方法(小结)
2018/06/07 Javascript
vue-router之nuxt动态路由设置的两种方法小结
2018/09/26 Javascript
ES6中的class是如何实现的(附Babel编译的ES5代码详解)
2019/05/17 Javascript
Vue 动态添加路由及生成菜单的方法示例
2019/06/20 Javascript
微信小程序数据统计和错误统计的实现方法
2019/06/26 Javascript
layer.confirm点击第一个按钮关闭弹出框的方法
2019/09/09 Javascript
在Python操作时间和日期之asctime()方法的使用
2015/05/22 Python
python并发编程之多进程、多线程、异步和协程详解
2016/10/28 Python
python 自定义异常和异常捕捉的方法
2018/10/18 Python
Python实现word2Vec model过程解析
2019/12/16 Python
Python 如何在字符串中插入变量
2020/08/01 Python
django 获取字段最大值,最新的记录操作
2020/08/09 Python
详解scrapy内置中间件的顺序
2020/09/28 Python
CSS3教程:边框属性border的极致应用
2009/04/02 HTML / CSS
Html5画布_动力节点Java学院整理
2017/07/13 HTML / CSS
整理HTML5的一些新特性与Canvas的常用属性
2016/01/29 HTML / CSS
HTML5事件方法全部汇总
2016/05/12 HTML / CSS
理财计划书
2014/08/14 职场文书
2014年科室工作总结
2014/11/20 职场文书
实习科室评语
2015/01/04 职场文书
换届选举主持词
2015/07/03 职场文书
2016年第十四个公民道德宣传日活动总
2016/04/01 职场文书
年终工作总结范文
2019/06/20 职场文书
导游词之湖北武当山
2019/09/23 职场文书
javascript Number 与 Math对象的介绍
2021/11/17 Javascript