lijiejie.com
域名年龄: 15年9个月15天HTTP/1.1 200 OK 访问时间:2015年02月22日 17:56:53 服务器:Apache/2.2.22 (Ubuntu) 修改日期:2015年02月17日 13:55:58 接受单位:字节 文件大小:17849 缓存控制:max-age=3,必须更新 过期时间:2015年02月22日 17:56:56 动作:Accept-Encoding,Cookie Keep-Alive: timeout=5, max=100 连接:Keep-Alive 类型:text/html; charset=UTF-8 Content-Encoding: gzip 网站编码:UTF-8
李劼杰的博客依然在路上新浪微博You are here: Homepython和django的目录遍历漏洞(任意文件读取)By lijiejie on 2015 年 1 月 20 日 | 浏览 334 次近来我和同事观察到wooyun平台上较多地出现了“任意文件读取漏洞”,类似:Wooyun:优酷系列服务器文件读取攻击者通过请求http://220.181.185.228/../../../../../../../../../etc/sysconfig/network-scripts/ifcfg-eth1或类似URL,可跨目录读取系统敏感文件。 显然,这个漏洞是因为WebServer处理URL不当引入的。我们感兴趣的是,这到底是不是一个通用WebServer的漏洞。经分析验证,我们初步得出,这主要是由于开发人员在python代码中不安全地使用open函数引起,而且低版本的django自身也存在漏洞。1. 什么是目录遍历漏洞“目录遍历漏洞”的英文名称是Directory Traversal 或 Path Traversal。指攻击者通过在URL或参数中构造../..%2F /%c0%ae%c0%ae/%2e%2e%2f或类似的跨父目录字符串,完成目录跳转,读取操作系统各个目录下的敏感文件。很多时候,我们也把它称作“任意文件读取漏洞”。2. Python和Django的目录遍历漏洞历史上python和django曾爆出多个目录遍历漏洞,例如:CVE-2009-2659 Django directory traversal flawCVE-2013-4315 python-django: directory traversal with "ssi" template tagPython CGIHTTPServer File Disclosure and Potential Code Execution内置的模块和Django模板标签,均受过影响。程序员稍不谨慎,就可能写下有漏洞的代码。3. 漏洞代码示例为了演示漏洞的原理,我们写了一段存在明显漏洞的代码:Python# -*- coding: utf-8 -*-import sysimport SocketServerimport BaseHTTPServerimport threadingimport timeimport exceptionsimport osclass MyHttpRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):def do_GET(self):self.send_response(200)self.send_header('Content-type','text/plain')self.end_headers()if os.path.isfile(self.path):file = open(self.path)self.wfile.write(file.read())file.close()else:self.wfile.write('hello world')class ThreadedHttpServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):__httpd = None@staticmethoddef get():if not ThreadedHttpServer.__httpd:ThreadedHttpServer.__httpd = ThreadedHttpServer(('0.0.0.0', 80), MyHttpRequestHandler)return ThreadedHttpServer.__httpddef main():try:httpd = ThreadedHttpServer.get()httpd.serve_forever()except exceptions.KeyboardInterrupt:httpd.shutdown()except Exception as e:print eif __name__ == '__main__':main()123456789101112131415161718192021222324252627282930313233343536373839404142434445# -*- coding: utf-8 -*-import sysimport SocketServerimport BaseHTTPServerimport threadingimport timeimport exceptionsimport os class MyHttpRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): def do_GET(self): self.send_response(200) self.send_header('Content-type','text/plain') self.end_headers() if os.path.isfile(self.path): file = open(self.path) self.wfile.write(file.read()) file.close() else: self.wfile.write('hello world') class ThreadedHttpServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): __httpd = None @staticmethod def get(): if not ThreadedHttpServer.__httpd: ThreadedHttpServer.__httpd = ThreadedHttpServer(('0.0.0.0', 80), MyHttpRequestHandler) return ThreadedHttpServer.__httpd def main(): try: httpd = ThreadedHttpServer.get() httpd.serve_forever() except exceptions.KeyboardInterrupt: httpd.shutdown() except Exception as e: print e if __name__ == '__main__': main()在处理GET请求时,我直接取path,然后使用open函数打开path对应的静态文件,并HTTP响应文件的内容。这里出现了一个明显的目录遍历漏洞,对path未做任
© 2010 - 2020 网站综合信息查询 同IP网站查询 相关类似网站查询 网站备案查询网站地图 最新查询 最近更新 优秀网站 热门网站 全部网站 同IP查询 备案查询
2025-05-15 23:10, Process in 0.0044 second.