Web hacking/기법

SQL injection_(3) column 개수 알아내기, UNION 공격

jin_li 2023. 4. 18. 03:33

※ "화이트 해커를 위한 웹 해킹의 기술" 강의 및 책에 수록된 실습이다.
※ 허가 받지 않은 웹사이트에 해킹을 시도 하는 것은 불법.
※ dvwa 등 테스트 가능하게 만들어진 곳에서만 모의해킹을 해야한다.
 
 
 
 
 
UNION을 이용하여 두 개의 쿼리를 결합하려면,
 
원래 쿼리문에서의 SELECT문의 column 개수와
UNION뒤의 SELECT문의 column 개수가 같아야 한다.
 
따라서 원래 쿼리문이 몇 개의 column을 리턴하는지 알아야 한다.
 
 
 
 

column 개수 알아내기

(1) union
(2) order by

 
 
 
(1) UNION 이용해서 알아내는 방법
 
 
1' union select 1# 을 입력한다. select 뒤에 상수 값을 주면 상수 그대로 출력하므로, 다음과 같은 화면이 나온다.
 

열 개수 다르다고 오류 떴다. 그러면? 상수를 하나씩 추가하면서 일일이 확인해보자.
 
 
다행히 여기서는 1' union select 1,1# 을 입력했을 때 바로 나왔다.
 

 
보다시피 ID가 1인 원래의 계정정보와 입력했던 1,1이 같이 출력됐다. union이 합집합이라 그렇다.
 
참고로, 1을 3개 넣으면 아까와 같이 컬럼 개수 안 맞다고 에러뜬다.
 
 
 
 
 
 
 
(1) ORDER BY 이용해서 알아내는 방법
 
 
컬럼 개수를 다른 방법으로도 알아낼 수 있다. ORDER BY를 이용하는 것이다.
 
ORDER BY는 어느 컬럼을 기준으로 정렬할 때 사용하는데,
컬럼의 개수보다 큰 값을 입력하면 정렬을 할 수 없으니 에러를 발생시킨다.
 
 
 
예를 들어 1' order by 1# 또는 1' order by 2# 입력하면 에러가 생기지 않고 정상적으로 출력된다.
 

 
 
 
 
그러나 1' order by 3# 을 입력하면, 다음과 같은 에러가 발생한다.
 

3이라는 컬럼 없던데? 라는 에러문구...

 
따라서 컬럼의 개수는 2라는 걸 알 수 있다.
 
union으로 일일이 넣어보는 거나 order by 이용하는 거나 별 차이 없어보이지만, 
그나마 order by가 예상되는 컬럼 개수부터 입력해가며 범위를 좁힐 수 있으니 좀 더 효율적일 듯 하다.
 
 
 
 
 
 
 
 
 
 

UNION 공격 실습

 
데이터베이스 이름부터 알아내보자.
 
mysql에서는 information_schema 데이터베이스에서 데이터베이스, 테이블, 컬럼 정보 등을 관리한다.
 
 
따라서 다음 구문을 입력하면,
information_schema라는 데이터베이스의 schemata라는 테이블에서 schema_name을 셀렉해온다.
즉, 모든 데이터베이스의 이름을 출력한다.
 
1' union select schema_name,1 from information_schema.schemata #
 

first name 과 surname은 웹페이지에서 항상 리턴되는 단순 문자열이라고 함...

 
 
 
 
 
dvwa 데이터베이스에 주목하자. 안의 모든 테이블 이름을 출력하려면 다음 구문을 사용하면 된다.
 
1' union select table_schema, table_name from information_schema.tables where table_schema = 'dvwa' #
 

 
 
 
 
users 테이블에 모든 계정 정보들이 있을 것 같다. 다음 구문을 입력한다.
 
1' union select table_name, column_name from information_schema.columns where table_schema = 'dvwa' and table_name = 'users'#
 

 
모든 컬럼이름이 나온다. 여기서 패스워드만 출력하자.
 
 
 
union을 이용해, 다음 구문을 입력한다.
 
1' union select user,password from users# 

user정보는 first name에, password는 surname에 출력되었다

 
그런데 패스워드가 해시값의 형태로 저장되어 있다.
데이터베이스가 해킹 당해도 해시함수를 이용해 패스워드를 저장하면 패스워드를 복원하는 것이 까다로워 보안에 좋다.
 
 
 
dvwa에서는 보안에 취약한 MD5 라는 해시값을 사용하고 있어 패스워드를 쉽게 복원할 수 있다.
 
 
admin 계정의 패스워드 해시값을 구글링해보자.

패스워드가 admin이다.

쉽게 찾을 수 있었다.

'Web hacking > 기법' 카테고리의 다른 글

XSS_(1) 공격 개요  (0) 2023.05.10
SQL injection_(4) Blind SQLi / medium, high 단계 및 대응  (0) 2023.04.18
SQL injection_(2) WHERE문 우회  (0) 2023.04.18
SQL injection_(1) 공격 개요  (0) 2023.04.18
파일 인클루전  (0) 2023.04.03