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程序的方法
Apr 21 Python
分析python服务器拒绝服务攻击代码
Jan 16 Python
python使用xauth方式登录饭否网然后发消息
Apr 11 Python
Python中字典和JSON互转操作实例
Jan 19 Python
使用Python编写一个模仿CPU工作的程序
Apr 16 Python
python求解水仙花数的方法
May 11 Python
python中的随机函数random的用法示例
Jan 27 Python
对PyQt5中的菜单栏和工具栏实例详解
Jun 20 Python
基于python实现检索标记敏感词并输出
May 07 Python
python实现数学模型(插值、拟合和微分方程)
Nov 13 Python
PyMongo 查询数据的实现
Jun 28 Python
Python数据处理的三个实用技巧分享
Apr 01 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的Root密码忘记,查看或修改的解决方法(图文介绍)
2013/06/14 PHP
php微信支付之APP支付方法
2015/03/04 PHP
php实现从上传文件创建缩略图的方法
2015/04/02 PHP
编写跨浏览器的javascript代码必备[js多浏览器兼容写法]
2008/10/29 Javascript
基于jquery实现的类似百度搜索的输入框自动完成功能
2011/08/23 Javascript
Javascript玩转继承(二)
2014/05/08 Javascript
node.js中的fs.writeFileSync方法使用说明
2014/12/14 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖动基本操作
2015/11/30 Javascript
JavaScript、jQuery与Ajax的关系
2016/01/24 Javascript
fullpage.js全屏滚动插件使用实例
2016/09/06 Javascript
jQuery+HTML5实现弹出创意搜索框层
2016/12/29 Javascript
javascript解析ajax返回的xml和json格式数据实例详解
2017/01/05 Javascript
Vue2.5通过json文件读取数据的方法
2018/02/27 Javascript
spring+angular实现导出excel的实现代码
2019/02/27 Javascript
vue按需加载实例详解
2019/09/06 Javascript
js实现坦克大战游戏
2020/02/24 Javascript
tensorflow1.0学习之模型的保存与恢复(Saver)
2018/04/23 Python
python脚本实现验证码识别
2018/06/07 Python
python实现彩票系统
2020/06/28 Python
python实现合并两个排序的链表
2019/03/03 Python
Python实现微信好友的数据分析
2019/12/16 Python
使用tensorflow显示pb模型的所有网络结点方式
2020/01/23 Python
Python实现从N个数中找到最大的K个数
2020/04/02 Python
css3实现图片遮罩效果鼠标hover以后出现文字
2013/11/05 HTML / CSS
EJB2和EJB3在架构上的不同点
2014/09/29 面试题
革命先烈的英雄事迹材料
2014/02/15 职场文书
后勤主管岗位职责
2014/03/01 职场文书
2014年残疾人工作总结
2014/12/06 职场文书
2015年机关党委工作总结
2015/05/23 职场文书
2015年教师党员个人总结
2015/11/24 职场文书
2019班干部竞选演讲稿范本!
2019/07/08 职场文书
Jupyter Notebook 如何修改字体和大小以及更改字体样式
2021/06/03 Python
浅谈MySQL next-key lock 加锁范围
2021/06/07 MySQL
Python与C++中梯度方向直方图的实现
2022/03/17 Python
SpringCloud Feign请求头删除修改的操作代码
2022/03/20 Java/Android
MySQL范围查询优化的场景实例详解
2022/06/10 MySQL