当前位置: 首页 > news >正文

python和django的目录遍历漏洞(任意文件读取)

1. 什么是目录遍历漏洞

“目录遍历漏洞”的英文名称是Directory Traversal 或 Path Traversal。指攻击者通过在URL或参数中构造

  • ../
  • ..%2F
  •  /%c0%ae%c0%ae/
  • %2e%2e%2f

或类似的跨父目录字符串,完成目录跳转,读取操作系统各个目录下的敏感文件。很多时候,我们也把它称作“任意文件读取漏洞”。

2. Python和Django的目录遍历漏洞

历史上python和django曾爆出多个目录遍历漏洞,例如:

  1. CVE-2009-2659  Django directory traversal flaw
  2. CVE-2013-4315   python-django: directory traversal with “ssi” template tag
  3. Python CGIHTTPServer File Disclosure and Potential Code Execution

内置的模块和Django模板标签,均受过影响。程序员稍不谨慎,就可能写下有漏洞的代码。

3. 漏洞代码示例

为了演示漏洞的原理,我们写了一段存在明显漏洞的代码:

# -*- coding: utf-8 -*-
import sys
import SocketServer
import BaseHTTPServer
import threading
import time
import exceptions
import 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未做任何判断和过滤。

当我请求http://localhost/etc/passwd时,self.path对应的值是/etc/passwd,而open(‘/etc/passwd’),自然可以读取到passwd文件。

那攻击者为什么要构造/../../../../../../etc/passwd呢? 这是为了防止程序过滤或丢失最左侧的/符号,让起始目录变成脚本当前所在的目录。攻击者使用多个..符号,不断向上跳转,最终到达根/,而根/的父目录就是自己,因此使用再多的..都无差别,最终停留在根/的位置,如此,便可通过绝对路径去读取任意文件。

4. 漏洞扫描

该漏洞扫描有多种扫描方法,可使用nmap的http-passwd脚本扫描(http://nmap.org/nsedoc/scripts/http-passwd.html),用法:

nmap –script http-passwd –script-args http-passwd.root=/test/ IP地址

还可以写几行python脚本,检查HTTP响应中是否存在关键字,只需几行代码,主要是:

import httplib
conn = httplib.HTTPConnection(host, timeout=20)
conn.request('GET', '/../../../../../../../../../etc/passwd')
html_doc = conn.getresponse().read()

还发现一些小伙伴通过curl来检查主机是否存在漏洞,确实也很方便:

curl http://localhost/../../../../../../../etc/passwd

5. 漏洞修复

针对低版本的django和python引入的目录遍历,可选择升级python和django。

若是开发自行处理URL不当引入,则可过滤self.path,递归地过滤掉”..“,并限定号base_dir。 当发现URL中存在..,可直接响应403。

转自:http://www.lijiejie.com/python-django-directory-traversal/

相关文章:

  • 【技术分享】Python安全 - 从SSRF到命令执行惨案
  • 【技术分享】python web 安全总结
  • Django CSRF Bypass 漏洞分析(CVE-2016-7401)
  • Python安全编码与代码审计
  • Cobra-White 白盒源代码审计工具-白帽子版
  • python动态代码审计
  • 【技术分享】关于Python漏洞挖掘那些不得不提的事儿
  • python 代码审计之-命令执行漏洞
  • REST API安全设计指南
  • Restful API设计指南
  • 从Django的SECTET_KEY到代码执行
  • 偷懒必备-不想工作的时候打开网页F11就好
  • 智能合约审计系列————2、权限隐患条件竞争
  • 【全网致谢】————感谢ivy女神赠送的IOS测试机一部
  • burpsuite保存现有数据包记录导入之前的抓包记录
  • 4个实用的微服务测试策略
  • conda常用的命令
  • crontab执行失败的多种原因
  • E-HPC支持多队列管理和自动伸缩
  • es6
  • github指令
  • php ci框架整合银盛支付
  • PHP的Ev教程三(Periodic watcher)
  • Python进阶细节
  • React组件设计模式(一)
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 安卓应用性能调试和优化经验分享
  • 对超线程几个不同角度的解释
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 嵌入式文件系统
  • 通过npm或yarn自动生成vue组件
  • 详解NodeJs流之一
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 用简单代码看卷积组块发展
  • 主流的CSS水平和垂直居中技术大全
  • 积累各种好的链接
  • 昨天1024程序员节,我故意写了个死循环~
  • ​第20课 在Android Native开发中加入新的C++类
  • #pragam once 和 #ifndef 预编译头
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (分布式缓存)Redis持久化
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (转)JAVA中的堆栈
  • (转载)利用webkit抓取动态网页和链接
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .Net Winform开发笔记(一)
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET的数据绑定
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • @vue/cli 3.x+引入jQuery
  • [\u4e00-\u9fa5] //匹配中文字符