Information Security
Blind SQL Injection 공격 본문
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 |