해당 문제의 정보는 다음과 같다.
주어진 접속 정보 페이지에 들어가니 아래와 같은 화면을 볼 수 있었다.
음 진짜 이것만 보고 어떻게 하라는지 모르겠다..
문제 풀이를 위해서 해당 문제를 풀기 위해서 중요한 개념을 우선 살펴보자.
Error Based SQL Injection
Error Based SQL Injection은 의도적으로 에러를 발생시켜서 데이터베이스 및 운영 체제의 정보를 획득하는 공격 기법이다. 따라서 쿼리 실행 결과가 에러가 발생했을 경우 에러가 화면에 출력된다면 발생할 수 있는 취약점이다.
만약 애플리케이션에서 발생하는 에러를 이용해 공격하려 한다면 문법 에러와 같이 DBMS에서 쿼리가 실행되기 전에 발생하는 에러가 아닌 런타임 (Runtime) 시점에 발생해야 한다.
즉, 쿼리가 실행되고나서 발생하는 에러 (논리적 에러)가 필요하다. 대표적으로 mysql에서는 ExtractValue()를 이용하여 Error based sql injection을 트리거한다.
해당 내용을 바탕으로 문제를 풀어보자
ExtractValue()를 사용하여 문제를 해결하기 위해 기본 형식을 확인하면 다음과 같다.
' union SELECT extractvalue(1,concat(0x3a,version()));
첫번째 인자에는 1을 넣었고, 두번째 인자에는 버전 함수를 사용했다. 여기서 concat 함수는 문자열을 합치는 함수이다. 여기서 1이라는 인자에 version의 문자열 찾을 수는 없는 것이고 오류가 날 것이라고 한다. 하지만 extractvalue 함수는 version() 함수를 실행한 값을 오류 메시지에 출력한다.
우선 위 값을 넣었더니 아래 이미지와 같이 에러가 뜨는 것을 확인할 수 있었다.
이후 바로 아래에 있는 값을 넣었더니
' union SELECT extractvalue(1,concat(0x3a,(select upw from user where uid = 'admin'))); --
아래 이미지와 같이 플래그 값이 나왔지만 조금 잘려있는 것을 볼 수 있다.
이후에 다음 값을 넣으면
' union SELECT extractvalue(1,concat(0x3a,(select substr(upw,20,50) from user where uid = 'admin'))); --
해당 이미지처럼 플래그 값의 나머지가 표시된 것을 볼 수 있었다.
따라서 두 부분을 합한 플래그 값을 넣으면
DH{c3968c78840750168774ad951fc98bf788563c4d}
문제를 해결할 수 있었다...!
우선 구글링해서 문제를 해결하기는 했지만 아직 이해 못한 부분이 많아서 Error Based SQL Injection에 대해 다시 공부하고 풀어보고 싶다.
'CTF' 카테고리의 다른 글
[Dreamhack] dreamhack-tools-cyberchef (0) | 2023.05.13 |
---|---|
[Suninatas] 1번 (1) | 2023.05.13 |
[Dreamhack] [wargame.kr] login filtering (0) | 2023.05.03 |
[Dreamhack] session-basic (0) | 2023.05.02 |
[Dreamhack] mongoboard (0) | 2023.04.12 |