Information Security

Blind SQL Injection 공격 본문

Web Hacking/Web 취약점 분석

Blind SQL Injection 공격

leeeeye321 2017. 12. 8. 02:33

SQL 취약점 - Blind SQL Injection

 

1. 예제 작성

DB 구성: blind

news: no (int), title (text), news (text)

 

 

no의 값을 GET 방식으로 전달받아 blind DB에 저장된 내용을 출력하는 news.php를 작성한다.

 

2. 취약점 확인

이 사이트는 no의 값을 마음대로 변경할 수 있기 때문에 numeric injection 취약점이 존재한다.

 

no의 값으로 위와 같이 아무렇게나 입력하면 쿼리 에러가 발생해서 화면이 하얗게 출력된다.

 

로그를 통해서 수행된 쿼리를 확인한다.

-> 공백을 기준으로 앞은 값, 뒤는 쿼리로 인식한다.

-> 뒤에 새로운 쿼리를 삽입할 수 있다는 것이다.

 

※ string injection

news.php에서 위와 같이 전달받는 값을 쿼터로 묶어주면 값이 string이 될 것이다.

 

수행된 쿼리를 보면 이제 아무렇게나 값을 넣어도 no의 값으로 인식하고 새로운 쿼리로 인식하지 않는 것을 알 수 있다.

-> 쿼리 에러가 발생하지 않는다.

-> 하지만 string injection 공격을 하려면 새로운 쿼리로 인식하도록 에러를 발생시켜야 한다.

-> 아무렇게나 입력한 값을 쿼터 밖으로 빼줘야 한다는 의미이다.

 

news.php?no=1' fdkljskldjlg %23

-> 값 뒤에 쿼터를 넣어 닫고 뒤의 쿼터는 주석 처리 해버리면

 

이렇게 쿼터 밖으로 빼줄 수 있게 된다.

-> 쿼리 에러가 다시 발생한다.

 

그런데 만약 서버에서 addslashes() 함수를 이용하고 있다면 이를 우회할 방법은 없다.

 

값 뒤에 쿼터를 넣어도 아무런 소용이 없다.

-> 우리는 numeric injection 공격을 할 것이다.

 

2. 취약점 확인 - 참 or 거짓

-우리는 테이블, 서버를 직접 만들어 사용해서 모든 정보를 알고 있지만, 실제로 공격할 때는 그렇지 않다.

-모든 정보는 보이지 않는다. (blind)

-> 쿼리에 참 또는 거짓을 삽입(injection)하여 결과가 출력 또는 출력되지 않는다면 blind sql injection 취약점이 존재하는 것이다.

-> 이를 이용하여 정보를 알아내야 한다.

 

참 -> no=1의 결과 출력

 

거짓 -> 출력 없음

 

 

-> and는 교집합, or는 합집합이라고 생각하면 될 것 같다.

 

3. 부가적인 쿼리

취약점을 확인했고, 이제 취약점을 이용한 부가적인 쿼리를 작성하는 방법을 알아볼 것이다.

union은 첫 번째 쿼리의 결과와 두 번째 쿼리의 결과의 합집합을 출력한다.

-> union은 중복되는 결과는 제거하여 출력한다. 중복된 결과도 출력하려면 union all을 사용하면 된다.

-> union은 뒤의 쿼리에 select 문만 올 수 있다.

-> union을 사용하여 원래 쿼리의 결과 이외의 다른 결과도 출력되게 하는 것이 blind sql injection의 기본 방식이다.

-> 하지만 union을 사용하려면 앞의 쿼리와 뒤의 쿼리의 컬럼의 개수가 같아야 한다.

-> 컬럼의 개수를 어떻게 알아낼까요?

 

4. 컬럼의 개수

위의 쿼리는 세 번째 컬럼을 기준으로 정렬을 수행한 결과이다.

 -> order by를 이용해서 컬럼의 개수를 알아낼 수 있다.

 

네 번째 컬럼은 존재하지 않으므로 에러가 발생한다.

-> news 테이블의 컬럼은 3개인 것을 알 수 있다.

-> 이렇게 컬럼의 개수를 알아내서 union을 사용할 수 있을 것이다.

-> 이제 화면에 노출되지 않는 DB에 대한 정보들을 알아내 볼 것이다.

 

5. DB에 대한 정보 얻기 - information_schema DB

information_schema : Database 구조 정보에 대한 DB

-> MySQL에서만 사용한다.

 

...

information_schema DB의 column 테이블의 정보를 보면 table_name, column_name 필드가 존재한다.

-> 모든 테이블 이름, 컬럼 이름을 저장하고 있는 테이블임을 알 수 있다.

select table_name, column_name from columns;

...

 

이제 이 쿼리를 union을 통해 injection해서 테이블, 컬럼 이름을 화면에 노출시켜 볼 것이다.

news.php?no=1 union select table_name, column_name, 1 from information_schema.columns

-> 컬럼의 개수를 맞추고, 테이블은 경로를 입력한다.

-> 화면에 테이블, 컬럼 이름이 출력된다.

-> 이렇게 blind sql Injection 공격을 통해 DB 정보 가져오기에 성공했다.

'Web Hacking > Web 취약점 분석' 카테고리의 다른 글

Blind SQL Injection 공격2  (0) 2017.12.08
SQL Injection 공격  (0) 2017.12.06
PHP File Upload 공격  (0) 2017.12.05
XSS(Cross Site Scripting) 공격  (0) 2017.12.01
제로보드 환경설정  (0) 2017.11.30