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 相关文章推荐
关于pip的安装,更新,卸载模块以及使用方法(详解)
May 19 Python
使用Turtle画正螺旋线的方法
Sep 22 Python
Python编程给numpy矩阵添加一列方法示例
Dec 04 Python
python设定并获取socket超时时间的方法
Jan 12 Python
Python定义函数功能与用法实例详解
Apr 08 Python
python批量下载抖音视频
Jun 17 Python
python实现一行输入多个值和一行输出多个值的例子
Jul 16 Python
PYTHON绘制雷达图代码实例
Oct 15 Python
解决django-xadmin列表页filter关联对象搜索问题
Nov 15 Python
通过实例简单了解Python中yield的作用
Dec 11 Python
python批量修改xml属性的实现方式
Mar 05 Python
Python实现视频自动打码的示例代码
Apr 08 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
第四节 构造函数和析构函数 [4]
2006/10/09 PHP
php自动获取关键字的方法
2015/01/06 PHP
php简单统计字符串单词数量的方法
2015/06/19 PHP
PHP 中提示undefined index如何解决(多种方法)
2016/03/16 PHP
PHP常用文件操作函数和简单实例分析
2016/06/03 PHP
Yii2中事务的使用实例代码详解
2016/09/07 PHP
thinkphp中的多表关联查询的实例详解
2017/10/12 PHP
PHP数组实际占用内存大小原理解析
2020/12/11 PHP
jQuery输入城市查看地图使用介绍
2013/05/08 Javascript
JS获取当前网址、主机地址项目根路径
2013/11/19 Javascript
jquery实现页面百叶窗走马灯式翻滚显示效果的方法
2015/03/12 Javascript
JS实现带关闭功能的阿里妈妈网站顶部滑出banner工具条代码
2015/09/17 Javascript
使用JavaScript判断手机浏览器是横屏还是竖屏问题
2016/08/02 Javascript
Radio 单选JS动态添加的选项onchange事件无效的解决方法
2016/12/12 Javascript
数组Array的一些方法(总结)
2017/02/17 Javascript
Angular2实现自定义双向绑定属性
2017/03/22 Javascript
javascript数组去重常用方法实例分析
2017/04/11 Javascript
Vue.js用法详解
2017/11/13 Javascript
SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法
2018/01/09 Javascript
浅谈React Event实现原理
2018/09/20 Javascript
JavaScript实现切换多张图片
2021/01/27 Javascript
python从ftp下载数据保存实例
2013/11/20 Python
Python设计模式之MVC模式简单示例
2018/01/10 Python
Python实现子类调用父类的初始化实例
2020/03/12 Python
Django 多对多字段的更新和插入数据实例
2020/03/31 Python
Python3批量创建Crowd用户并分配组
2020/05/20 Python
Python单元测试及unittest框架用法实例解析
2020/07/09 Python
Windows 平台做 Python 开发的最佳组合(推荐)
2020/07/27 Python
h5页面背景图很长要有滚动条滑动效果的实现
2021/01/27 HTML / CSS
枚举和一组预处理的#define有什么不同
2016/09/21 面试题
公司企业表扬信
2014/01/11 职场文书
初中高效课堂实施方案
2014/02/26 职场文书
情人节寄语大全
2014/04/11 职场文书
公路绿化方案
2014/05/12 职场文书
大学生就业意向书
2015/05/11 职场文书
查看nginx配置文件路径和资源文件路径的方法
2021/03/31 Servers