[TryHackMe] SQL Injection - 2

코준·2025년 7월 9일

TryHackMe

목록 보기
24/32

Type of SQL Injections

지난 포스팅에서 In-Band SQL Injection 유형의 취약점을 이야기했는데, 총 3가지의 유형을 이야기하고자 한다. In-Band SQLi, Blind SQLi, Out-of-Band SQLi의 유형 중 In-Band SQLi에 대해서 먼저 이야기해보자.

In-Band SQLi

가장 쉽게 탐지하고 악용할 수 있는 유형이다. 인밴드(In-Band)는 취약점을 악용하고 결과를 보는 데 같은 통신방법을 사용하는 것을 의미한다.

Error-Based SQLi

데이터베이스의 오류 메세지가 브라우저 화면에 직접 출력되기 때문에 데이터베이스 구조에 대한 정보를 쉽게 얻을 수 있다.

Union-Based SQLi

SELECT문과 함께 UNION연산자를 활용해 추가 결과를 반환해서 많은 양의 데이터를 추출하는 매우 일반적인 방법이다.

위와 같은 페이지에서 URL에 '를 붙여보면

에러를 출력해주므로 In-Band SQLi 취약점을 확인했다.

id=1뒤에 1 UNION SELECT 1을 추가해서 결과를 받을 수 있나 봤더니 원래 쿼리와 column 수가 다르다고 한다. 열을 추가해서 확인해보자.

1,2도 같은 에러를 뱉었고 1,2,3으로 입력했더니 오류가 사라지고 ID:1의 기사가 나왔다.

기사가 아니라 데이터를 보기 위해서 id=0을 검색했는데 쿼리가 결과를 생성하지 않도록 해서 반환값을 확인했다.

우리가 접근할 수 있는 데이터베이스의 이름을 database()로 가져와봤는데, sqli_one이라는 이름을 확인할 수 있었다. 이제 우리는 sqli_one 데이터베이스에 접근할 수 있게 됐다.

그럼 테이블을 가져오는 것이 가능하다. 우리는 이렇게 입력할 것이다.

0 UNION SELECT 1,2,group_concat(table_name) FROM information_schema.tables WHERE table_schema = 'sqli_one'
여러 메서드와 문자 등이 나온다.

  • group_concat() : 지정된 columns을 여러 반환된 행에서 가져와 쉼표로 구분된 하나의 문자열로 만든다. (위 경우 table_name)
  • information_schema : 모든 데이터베이스 사용자가 접근할 수 있는 데이터베이스로, 사용자가 접근할 수 있는 모든 데이터베이스 및 테이블에 대한 정보를 포함한다. 위 쿼리에서는 sqli_one의 모든 테이블을 나열한다.

우리는 martion의 패스워드를 알아야하므로 staff_users 테이블을 확인해보면 알 것 같다.

0 UNION SELECT 1,2,group_concat(column_name) FROM information_schema.columns WHERE table_name = 'staff_users'
이렇게 입력하면 이제 어떤 의미인지 알 것 같다.

  • group_concat(column_name)으로 column_name 열을 정리하고
  • information_schema.columns으로 tables가 아닌 columns테이블을 쿼리하며
  • table_name값이 'staff_users'인 행을 찾는다.그 결과로

위와 같은 정보를 열람할 수 있고, staff_users 테이블에 있는 3개의 열을 가져왔다.

0 UNION SELECT 1,2,group_concat(username,':',password SEPARATOR '<br>') FROM staff_users
하나의 문자열로 반환하는 내용을 username:password로 표시하도록 했고, 출력이 HTML로 나오기 때문에 <br> 태그로 분리했다.

martin의 비밀번호가 나왔다 !

profile
Hi !

0개의 댓글