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的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享
Jul 09 Python
Python中logging模块的用法实例
Sep 29 Python
python解决汉字编码问题:Unicode Decode Error
Jan 19 Python
老生常谈Python序列化和反序列化
Jun 28 Python
Python2包含中文报错的解决方法
Jul 09 Python
Python查找不限层级Json数据中某个key或者value的路径方式
Feb 27 Python
Python爬虫爬取百度搜索内容代码实例
Jun 05 Python
Tensorflow tensor 数学运算和逻辑运算方式
Jun 30 Python
一文解决django 2.2与mysql兼容性问题
Jul 15 Python
python 将列表里的字典元素合并为一个字典实例
Sep 01 Python
有趣的二维码:使用MyQR和qrcode来制作二维码
May 10 Python
Python语言规范之Pylint的详细用法
Jun 24 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
PHP4实际应用经验篇(9)
2006/10/09 PHP
php给每个段落添加空格的方法
2015/03/20 PHP
PHP simplexml_import_dom()函数讲解
2019/02/03 PHP
javascript代码运行不出来执行错误的可能情况整理
2013/10/18 Javascript
JavaScript利用正则表达式去除日期中的“-”
2014/07/01 Javascript
禁用页面部分JavaScript不是全部而是部分
2014/09/03 Javascript
JQuery中DOM事件冒泡实例分析
2015/06/13 Javascript
jquery动态导航插件dynamicNav用法实例分析
2015/09/06 Javascript
jquery遍历table的tr获取td的值实现方法
2016/05/19 Javascript
关于动态执行代码(js的Eval)实例详解
2016/08/15 Javascript
如何正确理解javascript的模块化
2017/03/02 Javascript
在vue中使用vue-echarts-v3的实例代码
2018/09/13 Javascript
详解vuex持久化插件解决浏览器刷新数据消失问题
2019/04/15 Javascript
vue实现一个6个输入框的验证码输入组件功能的实例代码
2020/06/29 Javascript
vue实现下拉菜单树
2020/10/22 Javascript
Taro小程序自定义顶部导航栏功能的实现
2020/12/17 Javascript
[48:46]完美世界DOTA2联赛PWL S2 SZ vs FTD.C 第二场 11.19
2020/11/19 DOTA
Python中文编码那些事
2014/06/25 Python
Python多进程通信Queue、Pipe、Value、Array实例
2014/11/21 Python
python基础教程之分支、循环简单用法
2016/06/16 Python
DataFrame:通过SparkSql将scala类转为DataFrame的方法
2019/01/29 Python
python栈的基本定义与使用方法示例【初始化、赋值、入栈、出栈等】
2019/10/24 Python
python 装饰器功能与用法案例详解
2020/03/06 Python
Java Unsafe类实现原理及测试代码
2020/09/15 Python
Jupyter Notebook添加代码自动补全功能的实现
2021/01/07 Python
免税水晶:Duty Free Crystal
2019/05/13 全球购物
乐高西班牙官方商店:LEGO Shop ES
2019/12/01 全球购物
幼师自荐信
2013/10/26 职场文书
关键在于落实心得体会
2014/09/03 职场文书
2014年教师批评与自我批评思想汇报
2014/09/20 职场文书
解除劳动合同证明书
2014/09/26 职场文书
2016年寒假社会实践活动心得体会
2015/10/09 职场文书
2016年企业安全生产月活动总结
2016/04/06 职场文书
python 爬取豆瓣网页的示例
2021/04/13 Python
Python爬虫实战之爬取携程评论
2021/06/02 Python
Python实现查询剪贴板自动匹配信息的思路详解
2021/07/09 Python