menu arrow_back 湛蓝安全空间 |狂野湛蓝,暴躁每天 chevron_right All_wiki chevron_right Some-PoC-oR-ExP-master chevron_right Django chevron_right CVE-2021-28658.md
  • home 首页
  • brightness_4 暗黑模式
  • cloud
    xLIYhHS7e34ez7Ma
    cloud
    湛蓝安全
    code
    Github
    CVE-2021-28658.md
    1.92 KB / 2021-07-04 19:32:24
        ## 漏洞标题为:Django 上传文件时路径遍历漏洞
    ## 漏洞类型为:路径遍历
    ## 漏洞等级为:中危
    ## 漏洞简介为
       Django是Django基金会的一套基于Python语言的开源Web应用框架。该框架包括面向对象的映射器、视图系统、模板系统等。
    
    Django 2.2至2.2.20, 3.0至3.0.14, 3.1至3.1.8 存在路径遍历漏洞,该漏洞允许通过上传的具有合适文件名的文件来遍历目录。
    
    ## 漏洞cve为:CVE-2021-28658
    漏洞ID为:CNNVD-202104-352:http://www.cnnvd.org.cn/web/xxk/ldxqById.tag?CNNVD=CNNVD-202104-352
    
    ## 补丁 diff:
    http://launchpadlibrarian.net/531049456/python-django_1.8.7-1ubuntu5.14_1.8.7-1ubuntu5.15.diff.gz
    
    
    ### poc:
    构造上传文件名为:`../test.txt `她是`../test.txt`的变形
    
    poc代码参考部分:
    
    ```
    def test_filename_traversal_upload(self):
        if not os.path.isdir(UPLOAD_TO):
            os.makedirs(UPLOAD_TO)
        self.addCleanup(shutil.rmtree, MEDIA_ROOT)
        file_name = '../test.txt',
        payload = client.FakePayload()
        payload.write(
            '\r\n'.join([
                '--' + client.BOUNDARY,
                'Content-Disposition: form-data; name="my_file"; '
                'filename="%s";' % file_name,
                'Content-Type: text/plain',
                '',
                'file contents.\r\n',
                '\r\n--' + client.BOUNDARY + '--\r\n',
            ]),
        )
        r = {
            'CONTENT_LENGTH': len(payload),
            'CONTENT_TYPE': client.MULTIPART_CONTENT,
            'PATH_INFO': '/upload_traversal/',
            'REQUEST_METHOD': 'POST',
            'wsgi.input': payload,
        }
        response = self.client.request(**r)
        result = json.loads(response.content.decode('utf-8'))
        self.assertEqual(response.status_code, 200)
        self.assertEqual(result['file_name'], 'test.txt')
        self.assertIs(os.path.exists(os.path.join(MEDIA_ROOT, 'test.txt')), False)
        self.assertIs(os.path.exists(os.path.join(UPLOAD_TO, 'test.txt')), True)
    
    ```
    
    
    links
    file_download