| 취약점ID |
21835 |
| 위험도 |
40 |
| 포트 |
80, ... |
| 프로토콜 |
TCP |
| 분류 |
CGI |
| 상세설명 |
해당 웹 서버에는 Blind SQL 주입(injection) 취약점에 취약한 웹 페이지가 존재한다. SQL(Structured Query Language)은 데이터베이스들에 질의를 보내기 위한 특별한 형태의 프로그래밍 언어이다. 대부분의 소규모 및 대규모 데이터베이스 어플리케이션들은 SQL 문장들을 이용하여 액세스될 수 있다. SQL 주입은 사용자가 제공한 입력으로부터 SQL 문장들을 구축한 웹 사이트들을 도용하는 데 사용되는 공격 기법이다. 취약한 웹 스크립트 페이지는 SQL 질의로 사용하기 전에 영향을 받는 인수로 전달된 사용자가 제공한 입력을 적절하게 걸러 내지 못하는 어플리케이션 상의 결함으로 인하여, 원격지의 공격자가 임의의 SQL 문장들을 주입하고 실행할 수 있게 해 준다. 이 공격의 영향력은 원격지의 공격자가 데이터베이스의 완전한 제어권을 얻어내거나 심지어 시스템 상에 명령들을 수행할 수 있게 해 줄 수 있다. SQL 주입의 널리 알려진 방법들로는 두 가지가 있다: 일반 SQL 주입과 Blind(보이지 않는) SQL 주입이 그것이다. 첫번 째는 응답으로 반환되는 에러 메시지들에 포함된 정보를 이용하여 공격자는 자신의 질의가 개발자의 질의와 어울려 돌아가는 형태를 갖추는 SQL 주입 방법이다. Blind SQL 주입에서는, 서버가 데이터베이스 에러를 반환하지 않고 잘못을 일으킨 사용자에게 사용자가 알아보기 쉬운 형태의 에러 페이지를 반환한다. 이러한 상황에서는 SQL 주입은 여전히 가능하지만 발견하기는 쉽지 않다. Blind SQL 주입을 탐지해내는 일반적인 방법은 참과 거짓 문장을 인수 값에 집어넣는 것이다. 대개의 관리용의 안전장치는 데이터베이스 서버 에러 메시지들이 보여지지 않도록 단순히 차단만 한다. 유감스럽게도 이것 만으로는 충분하지 않다. 어플리케이션이 에러 메시지들을 반환하지 않더라도 여전히 "blind" (보이지 않는) SQL 주입 공격들에 취약할 수 있다.
* 참고 사이트: http://www.webappsec.org/projects/threat/classes/sql_injection.shtml http://www.securiteam.com/securityreviews/5DP0N1P76E.html http://www.net-security.org/dl/articles/IntegrigyIntrotoSQLInjectionAttacks.pdf
* 영향을 받는 플랫폼: 모든 HTTP 서버 모든 버전 모든 운영체제 모든 버전 |
| 해결책 |
SQL 주입에 대처하는 가장 간단한 방어 방법은 SQL 질의들을 구축함에 있어 직접적으로 CGI 변수들을 사용해서는 안 된다는 것이다. 모든 클라이언트 제공 데이터는 악의적으로 사용될 가능성이 있는 모든 문자들이나 문자열에 대한 세척과정을 필요로 한다. 이는 SQL 질의들을 사용하는 어플리케이션들 뿐만 아니라 모든 어플리케이션들에 대해 행해져야 한다.
- 원하는 형태의 문자들만 포함하도록 만들어야 한다. 입력이 문자열인지 숫자인지에 따라서 다른 방법들이 적용될 수 있다. 예를 들어, 문자열에 대해서는, 단일 인용부호, 이중 인용부호, 슬래쉬, 백 슬래쉬 그리고 세미콜론과 같은 문자, 그리고 NULL, 캐리지 리턴(carry return), 뉴 라인(new line), 등과 같은 확장된 문자는 필터링할 수 있다. ASP 스크립트에서는 replace() 함수가 다음과 같이 문자열들에 대해 사용될 수 있다:
Replace(Request.Querystring("foobar"), "'", "")
- 숫자 값에 대해서는, 입력을 SQL 문으로 해석하기 전에 정수로 변환한다. 실례로 ASP 스크립트에서는 IsNumeric() 그리고 Java 스크립트에서는 IsNaN() 함수가 사용 가능하다. |
| 관련 URL |
(CVE) |
| 관련 URL |
(SecurityFocus) |
| 관련 URL |
(ISS) |
|