[Dreamhack Web - Lv 1] simple_sqli

문제 정보

로그인 서비스입니다. SQL INJECTION 취약점을 통해 플래그를 획득하세요.

플래그는 flag.txt, FLAG 변수에 있습니다.

풀이 힌트

1. 공격 백터 파악

2. DBMS 파악

3. SQLi 이해

문제 풀이

더보기

Home, Abuot, Contact 메뉴는 아무 작동도 안한다.

 

Login에 들어가니, 로그인 페이지가 나왔다.
아마 로그인 기능에서 SQLi를 시도하라는 것으로 보인다.

나는 일단 guest/guest로 로그인을 시도하였다.

 

그 결과 guest로 로그인이 성공하였다.
그럼 admin으로 로그인을 하는게 인지상정인데, admin으로 SQLi하기 전에 어떤 DB을 쓰는지 또 쿼리문이 어떻게 생겼는지 추측을 해야한다.

어떤 DB를 쓰는지에 대한 추측은 이번 문제에선 추측을 안 해도 될거 같다.
그 이유는 Level 1의 간단한 문제라서 DBMS의 특성을 쓸 일이 없을 거 같다. 다만 주석 처리에 대해서는 알아야 할 것 같다.

쿼리문이 어떻게 생겼는지 추측은 쿼리문이 어떻게 생겼는지를 생각해야한다.
보통 로그인 쿼리문은 SELECT id FROM Table WHERE id='입력값' and pw='입력값'으로 되어있다. 하지만 해당 쿼리문이 문자열에 대한 처리를 할 때 ' , " 둘 중 하나를 쓰기 때문에 어떤 것을 쓰는지를 알아야 한다.

위 두 개를 알아보기 위해 pw 부분을 guest'#, guest'--, guest"#, guest"--로 넣어서 확인해보겠다.

 

실패하면 위와 같이 wrong이 뜬다.

 

guest"-- 를 넣으니, 로그인이 되었다.
이로써 DBMS가 Oracle DB, SQLite, MsSQL 중 하나인 것으로 보인다.

그 이유는 Mysql, Postgresql, MairaDB은 --로 주석 처리할 땐 맨 뒤에 띄어쓰기를 해야한다.
ex). SELCT * FROM Table WHERE id='admin'-- ' and pw='admin'

하지만 Oracle DB, SQLite, MsSQL은 -- 뒤에 띄어쓰기를 안 해도 된다.
ex). SELCT * FROM Table WHERE id='admin'--' and pw='admin'

일단 나는 드림핵의 웹 해킹 강의를 봤는데, 드림핵은 python의 Flask를 사용하여 웹을 구축하였다고 했었다. Flask의 기본 DB는 SQLite이기 때문에 SQLite로 추측을 하겠다.

이제 쿼리문은 "을 사용하고, DB는 SQLite을 사용하는 것을 알았으니, admin을 SQLi 공격 시도하겠다.

제일 먼저 생각나는 SQLi은 SELECT id, pw FROM Table WHERE id="admin"--" and pw=""이다.
이렇게 되면 Table 테이블에 저장된 id가 admin인 id와 pw을 반환하라는 쿼리문으로 되기 때문이다.

 

아주 간단하게 우회가 되었다.

다른 방법으로 SELECT id, pw FROM Table WHERE id="admin" and pw="" or id="admin" and 1=1--"이다.
위 쿼리문은 id="admin" or pw=""이 False가 되고, id="admin" and 1=1--" 은 True가 된다. 이는 Flase or True로 되기 때문에 or 연산에 따라 True가 나온다.
DB는 이 True의 쿼리문을 반환하게 된다. 그럼 id가 admin인 Table 테이블에 저장된 id와 pw을 반환하라는 결과를 얻게 된다.

 

하지만 SERVER ERROR가 발생하였다.
Mysql에선 가능한 쿼리인데, SQLite에선 불가능한 쿼리인가 궁금하여 직접 SQLite를 설치하여 테스트를 해봤다.

 

직접 확인한 결과 아주 잘 되는 것을 볼 수 있다.
안되는 이유는 잘 모르겠지만 해당 서버는 안 되는 것으로 보인다.

이번엔 Union Based SQLi를 통해서 공격을 시도해봤다.

 

SELECT id, pw FROM Table WHERE id="admin" and pw="" UNION SELECT 1,2--

일단 내가 추측한 SELECT에 설정된 컬럼이 2개인지를 확인해봤다. hello 1이 뜨는 것을 보니, 내가 생각한 id, pw가 맞는 것으로 보인다.

 

SELECT id, pw FROM Table WHERE id="admin" and pw="" UNION SELECT "admin",2--를 한다면, 반환 값이 id은 admin, pw은 2로 되기 때문에 admin 계정으로 로그인이 성공하였다.

해당 결과로 해당 로그인 기능은 쿼리문의 반환 값 id으로만 로그인을 처리하는 것으로 보인다.

 

'Wargame > Dreamhack' 카테고리의 다른 글

[Dreamhack Web - Lv 1] file-download-1  (0) 2021.10.25
[Dreamhack Web - Lv 1] xss-1  (0) 2021.10.23
[Dreamhack Web - Lv 1] welcome  (0) 2021.10.15
[Dreamhack Web - Lv.1] pathtraversal  (0) 2021.10.14
[Dreamhack Web - Lv 1] cookie  (0) 2021.10.14