※ "화이트 해커를 위한 웹 해킹의 기술" 강의 및 책에 수록된 실습이다.
※ 허가 받지 않은 웹사이트에 해킹을 시도 하는 것은 불법.
※ 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# 을 입력하면, 다음과 같은 에러가 발생한다.

따라서 컬럼의 개수는 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 #

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#

그런데 패스워드가 해시값의 형태로 저장되어 있다.
데이터베이스가 해킹 당해도 해시함수를 이용해 패스워드를 저장하면 패스워드를 복원하는 것이 까다로워 보안에 좋다.
dvwa에서는 보안에 취약한 MD5 라는 해시값을 사용하고 있어 패스워드를 쉽게 복원할 수 있다.
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 |