728x90
반응형

선행 학습 필요 개념

 

Union SQL Injection

2개 이상의 쿼리를 요청하여 결과를 얻는 UNION 연산자를 이용해 SQL Injection 공격을 가하는 것을 말하며 공격자는 이 연산자를 이용하여 원래의 요청에 한 개의 추가 쿼리를 삽입하여 정보를 얻어낸다.

공격이 가능한 전제 조건은 컬럼의 수가 같아야 하며 데이터 형식도 같아야 한다.

 

step 1. 컬럼 갯수 알아내기

갯수를 알아내기 위해 앞의 쿼리문에 이어서 union select 1, %23 으로 쓴다면 에러가 뜰 것이다.

 

그러나 union select 1, 2, %23 => union select 1, 2, 3, %23 ... 순으로  컬럼의 갯수를 늘려가다보면 에러가 나지 않는 때가 나올때, 즉 컬럼의 갯수가 일치할 때를 알 수 있다.

 

컬럼 전체가 출력되는 것이 아니라 몇몇 걸럼들만 결과만 나오게 되는데 이를 사용하여 우리가 결과값을 불러올 수 있는 걸럼을 알 수 있게 된다.

 

또한 order by 절을 이용하여 컬럼의 갯수를 알아낼 수 있다.

 

where 절의 뒤에 order by 1 %23 => order by 2 %23... 순으로 하나 씩 올려가다 보면 에러가 뜰텐데 이 에러가 뜨지 않는 최대의 수가 바로 컬럼의 갯수이다.

 

step2. 버전, 사용자 DB명 알아내기

컬럼의 갯수를 확인하였다면 숫자 대신 version(), user(), database()를 넣어준다.

 

이때 유의할 점은 아까 컬럼의 갯수를 알아낼 때 같이 알아낸, 우리가 결과값을 불러올 수 있는 컬럼에 넣어줘야 한다.

 

my sql의 버전, 사용중인 user의 이름과 권한, 그리고 현재 database의 이름을 알아냈다면 table의 이름을 알아낼 차례이다.

 

table의 이름을 불러오는 구문은 `union select table_name from information_schema.tables where table_schema = database() 이다.

 

이때, web에서는 가장 상위에 있는 하나의 줄만을 가져오기 때문에 limit절을 사용해주어야 한다.

union select table_name from information_schema.tables where table_schema = database() limit 0,1 %23

union select table_name from information_schema.tables where table_schema = database() limit 1,1 %23...

순으로 한 줄씩 내려가며 필요해보이는 table의 이름을 찾을 수 있다.

 

table의 이름을 찾았다면 컬럼의 이름도 찾아야 한다.

찾아낸 table의 이름을 user라고 하자.

그렇다면 컬럼의 이름을 불러오는 구문은 table과 동일하게

union select column_name from information_schema.columns where table_name = 'user'입니다.

당연하겠지만, table_name에는 아까 찾은 이름을 넣고 컬럼의 이름을 불러올때도 똑같이 limit 0,1 %23 => limit 1,1 %23 => limit 3,1 %23... 순으로 limit절을 사용하여 한줄씩 내려가며 찾아야 한다.

 

WebGoat SQL Injection chapter 3 문제

문제를 보게 되면 user_system_data 테이블에 대한 내용이 나와있고, union이나 join을 이용하여 Dave's의 password를 풀이하라고 나와있다.

 

우선, Name에 쿼리를 참으로 만들어 컬럼 개수를 확인해보기로 한다.

컬럼의 갯수가 총 7개인 것을 확인할 수 있었다.

이제 컬럼의 갯수에 맞는 쿼리문을 UNION SELECT 구문을 활용하여 작성해본다.

'or 1=1 UNION SELECT userid, user_name, password, cookie, NULL, NULL, NULL FROM user_system_data--

해당 값을 입력하게 되면 dave의 패스워드를 확인할 수 있다.

이제 패스워드 값을 입력하여 결과를 확인해본다.

728x90
반응형

+ Recent posts