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脚本来获取mp3文件tag信息的教程
May 04 Python
Python2/3中urllib库的一些常见用法
Dec 19 Python
全面分析Python的优点和缺点
Feb 07 Python
Python 装饰器实现DRY(不重复代码)原则
Mar 05 Python
Python中py文件引用另一个py文件变量的方法
Apr 29 Python
使用Python通过win32 COM打开Excel并添加Sheet的方法
May 02 Python
Python堆排序原理与实现方法详解
May 11 Python
pygame游戏之旅 添加碰撞效果的方法
Nov 20 Python
python json.loads兼容单引号数据的方法
Dec 19 Python
kafka-python 获取topic lag值方式
Dec 23 Python
Python3运算符常见用法分析
Feb 14 Python
Python导入模块包原理及相关注意事项
Mar 25 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
非常不错的MySQL优化的8条经验
2008/03/24 PHP
基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解
2013/05/15 PHP
php获取随机数组列表的方法
2014/11/13 PHP
php array_values 返回数组的值实例详解
2016/11/17 PHP
php获取用户真实IP和防刷机制的实例代码
2018/11/28 PHP
解决laravel查询构造器中的别名问题
2019/10/17 PHP
通过jQuery源码学习javascript(三)
2012/12/27 Javascript
jquery实现图片左右间隔滚动特效(可自动播放)
2013/05/08 Javascript
jQuery中获取Radio元素值的方法
2013/07/02 Javascript
javascript禁用键盘功能键让右击及其他键无效
2013/10/09 Javascript
javascript新建标签,判断键盘输入,以及判断焦点(示例代码)
2013/11/25 Javascript
HTML5 Shiv完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
2015/11/25 Javascript
Bootstrap布局组件应用实例讲解
2016/02/17 Javascript
浅析JS中对函数function的理解(基础篇)
2016/10/14 Javascript
Bootstrap基本组件学习笔记之列表组(11)
2016/12/07 Javascript
JS中使用 after 伪类清除浮动实例
2017/03/01 Javascript
基于BootStrap的前端分页带省略号和上下页效果
2017/05/18 Javascript
Vue 自定义动态组件实例详解
2018/03/28 Javascript
vue使用vue-i18n实现国际化的实现代码
2018/04/08 Javascript
在vue中使用axios实现post方式获取二进制流下载文件(实例代码)
2019/12/16 Javascript
Vue自定义组件的四种方式示例详解
2020/02/28 Javascript
python使用os模块的os.walk遍历文件夹示例
2014/01/27 Python
机器学习python实战之手写数字识别
2017/11/01 Python
python实现ID3决策树算法
2017/12/20 Python
python定向爬取淘宝商品价格
2018/02/27 Python
解决python中的幂函数、指数函数问题
2019/11/25 Python
Python:type、object、class与内置类型实例
2019/12/25 Python
python 中的[:-1]和[::-1]的具体使用
2020/02/13 Python
电子技术专业中专生的自我评价
2013/12/17 职场文书
房地产财务部员工岗位职责
2014/03/12 职场文书
2014年效能监察工作总结
2014/11/21 职场文书
2015年大学辅导员工作总结
2015/05/12 职场文书
人为什么会“幸灾乐祸”?
2019/08/06 职场文书
500字作文之周记
2019/12/13 职场文书
MongoDB orm框架的注意事项及简单使用
2021/06/20 MongoDB
Win11安装升级时提示“该电脑必须支持安全启动”
2022/04/19 数码科技