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 错误和异常小结
Oct 09 Python
用Python编写分析Python程序性能的工具的教程
Apr 01 Python
Python实现句子翻译功能
Nov 14 Python
python的re正则表达式实例代码
Jan 24 Python
pandas中的DataFrame按指定顺序输出所有列的方法
Apr 10 Python
selenium+python实现自动登录脚本
Apr 22 Python
python抓取需要扫微信登陆页面
Apr 29 Python
django数据库自动重连的方法实例
Jul 21 Python
Python绘制热力图示例
Sep 27 Python
Python 实现将大图切片成小图,将小图组合成大图的例子
Mar 14 Python
ubuntu16.04升级Python3.5到Python3.7的方法步骤
Aug 20 Python
为2021年的第一场雪锦上添花:用matplotlib绘制雪花和雪景
Jan 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实现MySQL更新记录的代码
2008/06/07 PHP
利用Memcached在php下实现session机制 替换PHP的原生session支持
2010/08/21 PHP
解析PHPExcel使用的常用说明以及把PHPExcel整合进CI框架的介绍
2013/06/24 PHP
Ajax+PHP快速上手及简单应用说明
2013/07/24 PHP
php实现水仙花数的4个示例分享
2014/04/08 PHP
PHP getDocNamespaces()函数讲解
2019/02/03 PHP
Js+Dhtml:WEB程序员简易开发工具包(预先体验版)
2006/11/07 Javascript
javascript 学习之旅 (1)
2009/02/05 Javascript
jQuery对象数据缓存Cache原理及jQuery.data方法区别介绍
2013/04/07 Javascript
javascript中expression的用法整理
2014/05/13 Javascript
使用javascript实现判断当前浏览器
2015/04/14 Javascript
教你JS中的运算符乘方、开方及变量格式转换
2016/08/09 Javascript
JavaScript ES6中CLASS的使用详解
2016/11/22 Javascript
基于JavaScript实现滑动门效果
2017/03/16 Javascript
bootstrap timepicker在angular中取值并转化为时间戳
2017/06/13 Javascript
vue.js实现备忘录功能的方法
2017/07/10 Javascript
Vue 去除路径中的#号
2018/04/19 Javascript
Swiper.js实现移动端元素左右滑动
2019/09/08 Javascript
JQuery样式与属性设置方法分析
2019/12/07 jQuery
jQuery+css实现的点击图片放大缩小预览功能示例【图片预览 查看大图】
2020/05/29 jQuery
[02:53]DOTA2英雄基础教程 山岭巨人小小
2013/12/09 DOTA
零基础写python爬虫之urllib2使用指南
2014/11/05 Python
python optparse模块使用实例
2015/04/09 Python
python+matplotlib实现礼盒柱状图实例代码
2018/01/16 Python
python3正则提取字符串里的中文实例
2019/01/31 Python
Python MySQLdb 执行sql语句时的参数传递方式
2020/03/04 Python
Python基于yaml文件配置logging日志过程解析
2020/06/23 Python
一款简洁的纯css3代码实现的动画导航
2014/10/31 HTML / CSS
如何将无状态会话Bean发布为WEB服务,只有无状态会话Bean可以发布为WEB服务?
2015/12/03 面试题
医学生自荐信
2013/12/03 职场文书
解除处分决定书
2015/06/25 职场文书
红歌会主持词
2015/07/02 职场文书
爱心捐赠活动简讯
2015/07/20 职场文书
如何利用map实现Nginx允许多个域名跨域
2021/03/31 Servers
mongodb的安装和开机自启动详细讲解
2021/08/02 MongoDB
Win11怎样将锁屏账户头像图片改成动画视频
2021/11/21 数码科技