python.django.security.injection.request-data-write.request-data-write

profile photo of semgrepsemgrep
Author
6,591
Download Count*

Found user-controlled request data passed into '.write(...)'. This could be dangerous if a malicious actor is able to control data into sensitive files. For example, a malicious actor could force rolling of critical log files, or cause a denial-of-service by using up available disk space. Instead, ensure that request data is properly escaped or sanitized.

Run Locally

Run in CI

Defintion

rules:
  - id: request-data-write
    message: Found user-controlled request data passed into '.write(...)'. This
      could be dangerous if a malicious actor is able to control data into
      sensitive files. For example, a malicious actor could force rolling of
      critical log files, or cause a denial-of-service by using up available
      disk space. Instead, ensure that request data is properly escaped or
      sanitized.
    metadata:
      cwe:
        - "CWE-93: Improper Neutralization of CRLF Sequences ('CRLF Injection')"
      owasp:
        - A03:2021 - Injection
      category: security
      technology:
        - django
      references:
        - https://owasp.org/Top10/A03_2021-Injection
      subcategory:
        - vuln
      likelihood: MEDIUM
      impact: MEDIUM
      confidence: MEDIUM
      license: Commons Clause License Condition v1.0[LGPL-2.1-only]
      vulnerability_class:
        - Improper Validation
    languages:
      - python
    severity: WARNING
    pattern-either:
      - pattern: $F.write(..., request.$W.get(...), ...)
      - pattern: |
          $DATA = request.$W.get(...)
          ...
          $F.write(..., $DATA, ...)
      - pattern: |
          $DATA = request.$W.get(...)
          ...
          $INTERM = $DATA
          ...
          $F.write(..., $INTERM, ...)
      - pattern: |
          $DATA = request.$W.get(...)
          ...
          $F.write(..., $B.$C(..., $DATA, ...), ...)
      - pattern: |
          $DATA = request.$W.get(...)
          ...
          $INTERM = $B.$C(..., $DATA, ...)
          ...
          $F.write(..., $INTERM, ...)
      - pattern: |
          $DATA = request.$W.get(...)
          ...
          $F.write(..., $STR % $DATA, ...)
      - pattern: |
          $DATA = request.$W.get(...)
          ...
          $INTERM = $STR % $DATA
          ...
          $F.write(..., $INTERM, ...)
      - pattern: |
          $DATA = request.$W.get(...)
          ...
          $F.write(..., f"...{$DATA}...", ...)
      - pattern: |
          $DATA = request.$W.get(...)
          ...
          $INTERM = f"...{$DATA}..."
          ...
          $F.write(..., $INTERM, ...)
      - pattern: $A = $F.write(..., request.$W.get(...), ...)
      - pattern: return $F.write(..., request.$W.get(...), ...)
      - pattern: $F.write(..., request.$W(...), ...)
      - pattern: |
          $DATA = request.$W(...)
          ...
          $F.write(..., $DATA, ...)
      - pattern: |
          $DATA = request.$W(...)
          ...
          $INTERM = $DATA
          ...
          $F.write(..., $INTERM, ...)
      - pattern: |
          $DATA = request.$W(...)
          ...
          $F.write(..., $B.$C(..., $DATA, ...), ...)
      - pattern: |
          $DATA = request.$W(...)
          ...
          $INTERM = $B.$C(..., $DATA, ...)
          ...
          $F.write(..., $INTERM, ...)
      - pattern: |
          $DATA = request.$W(...)
          ...
          $F.write(..., $STR % $DATA, ...)
      - pattern: |
          $DATA = request.$W(...)
          ...
          $INTERM = $STR % $DATA
          ...
          $F.write(..., $INTERM, ...)
      - pattern: |
          $DATA = request.$W(...)
          ...
          $F.write(..., f"...{$DATA}...", ...)
      - pattern: |
          $DATA = request.$W(...)
          ...
          $INTERM = f"...{$DATA}..."
          ...
          $F.write(..., $INTERM, ...)
      - pattern: $A = $F.write(..., request.$W(...), ...)
      - pattern: return $F.write(..., request.$W(...), ...)
      - pattern: $F.write(..., request.$W[...], ...)
      - pattern: |
          $DATA = request.$W[...]
          ...
          $F.write(..., $DATA, ...)
      - pattern: |
          $DATA = request.$W[...]
          ...
          $INTERM = $DATA
          ...
          $F.write(..., $INTERM, ...)
      - pattern: |
          $DATA = request.$W[...]
          ...
          $F.write(..., $B.$C(..., $DATA, ...), ...)
      - pattern: |
          $DATA = request.$W[...]
          ...
          $INTERM = $B.$C(..., $DATA, ...)
          ...
          $F.write(..., $INTERM, ...)
      - pattern: |
          $DATA = request.$W[...]
          ...
          $F.write(..., $STR % $DATA, ...)
      - pattern: |
          $DATA = request.$W[...]
          ...
          $INTERM = $STR % $DATA
          ...
          $F.write(..., $INTERM, ...)
      - pattern: |
          $DATA = request.$W[...]
          ...
          $F.write(..., f"...{$DATA}...", ...)
      - pattern: |
          $DATA = request.$W[...]
          ...
          $INTERM = f"...{$DATA}..."
          ...
          $F.write(..., $INTERM, ...)
      - pattern: $A = $F.write(..., request.$W[...], ...)
      - pattern: return $F.write(..., request.$W[...], ...)
      - pattern: $F.write(..., request.$W, ...)
      - pattern: |
          $DATA = request.$W
          ...
          $F.write(..., $DATA, ...)
      - pattern: |
          $DATA = request.$W
          ...
          $INTERM = $DATA
          ...
          $F.write(..., $INTERM, ...)
      - pattern: |
          $DATA = request.$W
          ...
          $F.write(..., $B.$C(..., $DATA, ...), ...)
      - pattern: |
          $DATA = request.$W
          ...
          $INTERM = $B.$C(..., $DATA, ...)
          ...
          $F.write(..., $INTERM, ...)
      - pattern: |
          $DATA = request.$W
          ...
          $F.write(..., $STR % $DATA, ...)
      - pattern: |
          $DATA = request.$W
          ...
          $INTERM = $STR % $DATA
          ...
          $F.write(..., $INTERM, ...)
      - pattern: |
          $DATA = request.$W
          ...
          $F.write(..., f"...{$DATA}...", ...)
      - pattern: |
          $DATA = request.$W
          ...
          $INTERM = f"...{$DATA}..."
          ...
          $F.write(..., $INTERM, ...)
      - pattern: $A = $F.write(..., request.$W, ...)
      - pattern: return $F.write(..., request.$W, ...)

Examples

request-data-write.py

import time
from django.contrib.auth.models import User
from django.http import HttpResponse
from . import settings as USettings

def save_scrawl_file(request, filename):
    import base64
    try:
        # ruleid: request-data-write
        content = request.POST.get(USettings.UEditorUploadSettings.get("scrawlFieldName", "upfile"))
        f = open(filename, 'wb')
        f.write(base64.decodestring(content))
        f.close()
        state = "SUCCESS"
    except Exception as e:
        state = u"写入图片文件错误:%s" % e
    return state

def save_file(request):
    # ok: request-data-write
    user = User.objects.get(username=request.session.get('user'))
    content = "user logged in at {}".format(time.time())
    f = open("{}-{}".format(user, time.time()), 'wb')
    f.write(content)
    f.close()