간혹 PHP와 MSSQL 조합을 사용하는 사이트가 있다. (해당 조합의 사용이 문제는 아니다.)

PHP에서의 환경 설정(php.ini)에는 보안 기능 중의 하나로 magic_quotes_gpc가 있다. 해당 옵션은 SQL Injection 공격 차단을 위해서 많이들 사용하고 있지만 PHP와 MSSQL 조합에서는 몇가지 예상치 못한 문제점이 발생한다.

먼제 자세한 사항을 알아보기 전에 magic_quotes_gpc에 대해서 알아보자.

MAGIC_QUOTES_GPC
이 옵션은 php.ini의 magic_quotes_gpc boolean으로 설정하는 옵션 값이다.

의미는 gpc(GET,POST,COOKIE)에 대하여 magic_quotes 상태를 설정한다는 의미이다. 여기서 magic_quotes 상태란 ',",\,NULL 문자에 대해서 백슬래쉬로 이스케이프 한다는 의미로 아래의 표를 참조하면 쉽게 이해가 가능하다.

magic_quotes_gpc

off

on

'

'

\'

"

"

\"

\

\

\\

NULL

%00

\0

표1. magic_quotes_gpc 옵션 설정 결과

즉, 매직 키워드 역활을 하는 문자를 일반 문자로 인식하게 변환시켜 준다는 의미이다.

※ 참조
해당 옵션을 사용할때는 GET,POST,COOKIE의 데이터에 addslashes() 함수를 중복 사용하게 되면 두번 이스케이프하게 되어서 보안에 문제가 발생하게 된다. 그래서 이를 확인하기 위해서 get_magic_quotes_gpc()를 사용 할 수 있다.


■ MSSQL에서의 백슬래쉬

백슬래쉬의 용도는 PHP와 MySQL을 사용하는 환경에서 특수문자를 DB에서 문자로 사용하기 위해서 사용하는 예약어이다. 하지만 이것은 MySQL에서 백슬래쉬가 포함된 특수문자는 문자로 처리하기 때문에 가능한 것이다.

그렇지만 PHP와 MSSQL조합을 사용할 경우는 상황이 다르다. MSSQL은 백슬래쉬가 포함된 특수문자를 익스케이프 처리가 아니라 백슬래쉬를 일반 문자로 인식한다. 여기서 취약점(문제)이 발생하게된다. 그래서 익스케이프 처리되라고 생각해던 예상과 다르게 특수문자 그대로 인식하여 우회가 가능하게 된다.

사용자 삽입 이미지
그림1. MSSQL에서 백슬래쉬 처리 화면

그림1과 같이 1번,2번 Query의 질의 결과가 동일하다 2번 Query에 백슬래쉬가 삽입되어 있으나 MSSQL에서는 문자열로 인식하지 않기 때문에 에러가 발생하지 않고 뒤의 or 1=1의 구문에 의해서 동일한 결과가 반환되었다.

실제 진단을 수행해 보면 많은 관리자들이 magic_quotes_gpc 옵션에 대해서 많이들 신뢰하고 있다. 하지만 이 옵션이 On으로 설정되어 있어도 SQL Injection이 가능한 몇가지 포인트가 발생하게 된다. 이러한 보안적인 이슈 사항을 알고 해당 옵션을 사용하는 것이 좋다.


■ MAGIC_QUOTES_GPC 우회기법

PHP와 MSSQL 환경에서의 SQL Injection 점검을 위해서 몇가지 참고 사항만을 기술하고자 한다.

1. magic_quotes_gpc = on에서 (')의 역활
DB에서 문자열 입력을 위해서는 Single Quote를 쌍으로 사용해야 한다. 여기서 첫번째는 시작이고 두번째는 종결 역활이라고 한다면은 magic_quotes_gpc옵션이 활성화 될 경우에는 종결 의미로서만 사용이 가능하다. 즉, Single Quote를 시작의 의미로는 사용이 어렵다.

/*1번*/select name from sysobjects where xtype=0x55 and name like 'sysobjects\'--' or 1=1
/*2번*/
select name from
sysobjects where xtype=0x55 and name like 'sysobjects\' and 1=1 and \'' or 1=1

위의 1번 질의어 처럼 \'-- 로 사용은 가능하지만 \' and 1=1 and \' 는 사용이 불가하다. 질의어에 \ 문자가 삽입되어 있어 구문에러가 발생하게 된다.

2. (')사용 방법
Pentration testing을 수행 할 경우 꼭 (')를 사용해야하는 경우가 발생하게 된다. 이럴 경우는 동일한 효과가 있는 (')를 사용하지 않는 다른 함수나 치환(인코딩) 등등을 사용하면 가능하다.
(몇몇 함수는 (')를 사용해야만 사용이 가능한 함수도 있다.)

→ 질의어
exec master..xp_cmdshell
'ping 10.10.10.10'

→ 치환된 질의어
DECLARE @N3015M VARCHAR(1000);
SET @N3015M=CAST(0x6D61737465722E2E78705F636D647368656C
6C202770696E672031302E31302E31302E313027
AS VARCHAR(1000));
EXEC(@N3015M)
;

이와 같이 치환해서 사용하면 얼마든지 우회가 가능하게 된다. magic_quotes_gpc 기능 또한 완벽한 보안 기능은 아니며 보완을 위해 사용하는 것이 좋을거 같다.


PHP와 MSSQL 환경에서 SQL Injection 방법에 대해서 알아 보았다. 해당 내용은 보안 담당자나 해당 관련 업무 담당자에게 도움이 되었길 바라며 학습과 공부 용도로 활용해 주시기 바랍니다.
Posted by n3015m
:
BLOG main image
'네오이즘'의 보안LAB 블로그입니다........... n3oism@gmail.com by n3015m

카테고리

분류 전체보기 (228)
[ HappyDevTool ] (29)
[ HappyToolRelease ] (4)
[Book] (6)
[ Security Studies ] (0)
- CII (2)
- BigData (2)
- Web Hacking (10)
- SQL Injection (25)
- Mobile Security (9)
- Network (6)
- OperatingSystem (4)
- Malware & Reversing (4)
- Phishing (5)
- Compliance (0)
- Programming (13)
- Tools (13)
- IoT (6)
- etc (21)
[Pentration Testing] (3)
[OS X] (4)
[ Security Trends ] (16)
[ Fixing Guideline ] (7)
My Way, My Life (34)
About Me (2)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

Total :
Today : Yesterday :