-
python的命令注入威胁之eval()
小G@北京 2012/5/15 19:23
eval函数是python最常用于做序列化、反序列化的函数,有些人就会把外部输入的数据,eval一下变成对象,但你不做任何过滤就执行eval的时候可知道,你变成一个很初级的码农了。
命令执行的场景如下:
1234code ="""__import__('os').system('echo 1')"""eval(code)10很简单,code变量的值可能是外部提交的,一旦被你序列化的时候,里面是可以写python代码并被执行了,而且eval执行的代码是在当前命名空间下的。
eval是可以指定执行时的全局和局部的命令空间的:
安全使用eval
eval接受3个参数: eval(source[, globals[, locals]]) -> value
只要将2个命名空间置空即可隔绝上下文的代码进行安全执行表达式。
1eval('{1:2}',{},{})不过! 通过builtins内置的方法仍有可能绕过:import('os').system('dir')、 eval("globals()", {}, {}), 直接秒杀
情况看上去似乎很复杂,不好解决问题啊。
此时只能祭出大招了。。
嗯哼,吭叽吭叽地写出一个安全eval的接口,方便开发的同学不需要再考虑这些产品相关性很低而复杂的问题。safeeval模块因此而诞生,为序列化操作提供安全转换,对eval数据进行词法分析,确保eval的数据中不会包含不合法的TRUE等写法,并且在隔离、安全的环境执行eval。
用法:
myobj = safe_eval(eval_str)源代码已经开源,大家可以到
https://github.com/greysign/pysec/blob/master/safeeval.py
得到全部信息。3 Comments -
python的常见命令注入威胁
小G@北京 2012/5/15 18:45
ah!其实没有标题说的那么严重!
不过下面可是我们开发产品初期的一些血淋淋的案例,更多的安全威胁可以看看北北同学的《python hack》PPT,里面提及了不只命令执行的威胁,那些都是我们亲身经历的代码。
千万要记得执行命令的时候,不要信任其他传入数据就行了,既然意识到问题,那么修复方法是多种多样的。
在我们的系统中,多处出现问题然后修修补补是不靠谱的,那么我们需要一个通用的安全执行接口,这个接口过后更新进来。
此外,我们在开发新功能的时候,也要掌握安全编程的规范技巧,这些技巧不局限在命令执行安全。
总结了一下,就是一下几点要素啦:
- 命令执行的字符串不要去拼接输入的参数,非要拼接的话,要对输入参数进行白名单过滤
- 对传入的参数一定要做类型校验,例如知道是数字型的,就int测试一下,会安全许多
- 对于拼接串,也要严格一些,例如int类型参数的拼接,对于参数要用%d,不要%s。
- 使用subprocess来传入多个参数,就可以防止命令行注入
-
“知道杯”第二届台球比赛
-
多线程下pymongo连接数过多的问题处理
背景
项目中有个应用,用到了多线程,线程中会有对MongoDB的操作。一般涉及到这种场景,都会小心MongoDB的连接的数量控制。
实现这个应用的时候必然已经考虑这点了,但实际碰到的情况是:多线程的程序运行起来,MongoDB连接数比预期多。
涉及的环境:
- Linux
- Python 2.6.5
- MongoDB 2.0.0
- MongoDB的驱动是pymongo。本文涉及的版本有4个:1.1.1、2.0.1、2.1.1,以及最新的2.2rc1。
过程
简化的代码
先用一段简化的代码来说明下这个问题。
12345678910111213141516#-*- encoding:UTF-8 -*-import threadingimport timeimport pymongosingle_conn = pymongo.Connection('mongodb://127.0.0.1', max_pool_size=1)class SimpleExampleThread(threading.Thread):def run(self):print single_conn['fvck'].damnit.count(), self.getName()time.sleep(10)for i in range(100):SimpleExampleThread().start()代码的大致意思是创建1个MongoDB连接,然后生成100个线程,在线程中会有对MongoDB的操作 Read More »
-
关于 Content-Encoding: gzip
背景
===
如果你的网页抓取程序(例如爬虫)在抓取网页时没有发送 Accept-Encoding: gzip,那么你 out 了:
因为今天超过 99% 的网页抓取程序都会声明支持 gzip (或 deflate) 编码。如果你的程序属于这 99%,那么恭喜,但别高兴的太早。 你的程序是否正确处理了 Content-Encoding: gzip?
问题
===
典型的处理 Content-Encoding: gzip 的代码片段 (python):html_data = GzipFile(fileobj=StringIO(html_data), mode="r").read()
假设 html_data 为 Web 服务器返回的Content-Encoding 为 gzip 的数据。
那么在大多数情况下,上述代码都能正确处理。 但很不幸,你会发现,对有些 url,浏览器可以正常显示内容,
但是你的网页抓取程序会出错!分析
===
不是所有 Web 服务器(或应用)都是遵纪守法的公民。 极少数应用,会在 gzip 压缩后的数据后面,添加一些“尾巴”数据。
一些数据解压模块(如Python 的 GzipFile 模块)在这种情况下会出现处理异常。例外的是浏览器。它们充分体会和考虑到了现实世界的复杂,会自动抛弃多出的“尾巴”,正常解压和处理页面数据。
解决
===
Python GzipFile 模块有个未公开属性: extrabuf, 负责保存已经成功解压的数据。 因此,下面的代码有更好的兼容性:12345try:gf = GzipFile(fileobj=StringIO(html_data), mode="r")html_data = gf.read()except:html_data = gf.extrabuf -
2011-2012中国互联网网站安全报告
2012年3月26日,北京知道创宇信息技术有限公司“2011-2012中国互联网网站安全报告”发布会在金台饭店举行,100多位行业用户、专家学者及国内知名媒体出席了本次发布会。
知道创宇CEO赵伟代表公司致欢迎辞,感谢大家的光临并和大家分享了公司专注于Web安全以及“更好更安全的互联网”公司愿景。中国信息安全测评中心资深安全顾问蒋鲁宁老师对2011年互联网网络安全行业趋势进行了详细的回顾,并探讨了未来的应对策略;CNCERT/CC运行部副主任王明华通过具体的数据对2011年中国互联网网络安全态势进行了深度的解析,并指出网站安全问题依然是未来的安全热点问题。
知道创宇研究部总监钟晨鸣(网名:余弦)对“2011-2012中国互联网网站安全报告”内容进行了详细解读。知道创宇互联网网站监测中心对2011年的挂马、暗链数据按行业及地区进行了统计分析。监测数据显示,网站挂马事件得到了有效控制,但挂马的方式方法变得复杂和多样化。一些国家重点部门以及重点行业的网站仍旧是挂马攻击的主要目标。在网站挂马得到有效抑制的同时,比网站挂马更为隐蔽、不易察觉的恶意行为——暗链,成为了新的、重要的攻击手段。
-
知道创宇在赵灵儿家乡封闭开发
现在正在进行的是在仙剑奇侠传,赵林灵儿家乡进行封闭开发 -- 云南大理古城,点苍山脚下,洱海之畔,蝴蝶泉边 ;到丽江只有4小时车程。
知道创宇的童鞋们从各地齐聚在东临碧波荡漾的洱海,西倚常年青翠的苍山的大理古城啦!
-
Web应用漏洞的大规模攻击案例分析
当一个流行的Web应用漏洞碰到充满想象力的Web Hackers,会产生什么化学效应?
By GreySign@Yunnan:2012/3/20
我们常常听闻各种Web漏洞被发现、被利用、被大肆宣传,或许安全厂商们都多多少少有点让用户们觉得这只是恐吓营销的手段,
但我们从不这么认为。
从我们的团队创立至今,分析、深入追踪过的案例大大小小已经数不清,但我们也相信,这些被发现的精彩的大规模攻击、APT攻击(当最初我们看到各种高级攻击的时候,还不知道如何称呼它们)只是冰山一角,浮出水面的每个事件,在经过各位安全研究员的深入分析,都足以拍成一部电影。
Anonymous对全球白帽子下了3月31日瘫痪DNS根服务器的挑战书的时候,我相信在这个互联网上大隐于市的高手们经已蓄势待发,默默捍卫承载着无数梦想的国度。与此同时,我们也在贡献着力所能及的微薄力量,时刻响应来自客户、来自国家、来自互联网那些需要我们帮助的安全事件。
在最近一段时间,我们发现了一个大规模攻击,与各位共享一下这个有意思的追踪过程。 Read More »
-
[实用开源]用于网络包检查的内核模块
非常简单的网络包检查的内核模块,基于此可以做更多有意义的事情。基于内核 3.2 测试通过。
pkt_chk.c
1234567/*** @file* @author Z. Liu** @brief kernel module for packet inspection*/ -
[笔试题]如果你是WEB开发极客,需要完成一个简单论坛
加入知道创宇,如果你是WEB开发极客,需要完成一个简单论坛。
数据库使用MongoDB 、服务端应用使用Node.js 或 Python + Django 、前端使用 JQuery + Bootstrap Twitter。
论坛功能包括:
1. 用户自己注册、密码修改与找回
2. 无刷新发帖、回帖
3. 权限管理,只有自己发的贴自己才能删除
4. 文章列表支持分页显示
这应该不会有什么难度,如果你完成了,请尽快联系我们(yang@scanv.com)。因为你正是我们需要的人!此笔试题长期有效:)