1. 개요
지난 2년 동안 보안 전문가들은 네트워크 애플리케이션 계층의 공격에 더 많은 관심을 기울여야 했습니다. 방화벽 규칙이 아무리 강력하거나 아무리 부지런히 패치하더라도 웹 애플리케이션 개발자가 보안 코드를 따르지 않으면 공격자가 포트 80을 통해 시스템에 침입할 것이기 때문입니다. 널리 사용되는 두 가지 주요 공격 기술은 SQL 삽입 [ref1] 공격과 CSS [ref2] 공격입니다. SQL 인젝션이란 백엔드 SQL 쿼리 실행을 조작하기 위해 인터넷 입력 영역을 통해 SQL 메타 문자(일부 데이터를 나타내는 특수 문자)와 명령을 삽입하는 기술을 말합니다. 이러한 공격은 주로 다른 조직의 웹 서버를 대상으로 합니다. CSS 공격은 URL에 스크립트 태그를 삽입한 다음 이를 신뢰하는 사용자가 해당 코드를 클릭하도록 유도하여 피해자의 컴퓨터에서 악성 Javascript 코드가 실행되도록 합니다. 이러한 공격은 사용자와 서버 간의 신뢰 관계를 이용합니다. 실제로 서버는 입력 및 출력을 감지하지 않으므로 JavaScript 코드를 거부하지 않습니다.
이 문서에서는 SQL 삽입 및 CSS 공격 취약점에 대한 탐지 기술에 대해 설명합니다. 공격을 구현하는 방법, 공격의 영향, 이러한 공격을 방지하기 위한 프로그램을 더 잘 준비하고 설계하는 방법과 같은 두 가지 유형의 웹 기반 공격에 대해 인터넷에서 많은 논의가 있었습니다. 그러나 이러한 공격을 탐지하는 방법에 대한 논의는 충분하지 않습니다. 우리는 인기 있는 오픈 소스인 IDS Snort [참조 3]를 사용하여 이러한 공격을 탐지하기 위한 규칙을 기반으로 정규식을 작성합니다. 덧붙여서, Snort의 기본 규칙 설정에는 CSS를 탐지하는 방법이 포함되어 있지만 이러한 방법은 쉽게 피할 수 있습니다. 예를 들어 대부분 탐지를 피하기 위해 <script> 대신 %3C%73%63%72%69%70% 74%3E와 같은 16진수 인코딩을 사용합니다.
편집증 수준의 조직 능력에 따라 동일한 공격을 탐지하기 위한 여러 규칙을 작성했습니다. 가능한 모든 SQL 주입 공격을 탐지하려면 작은따옴표, 세미콜론, 이중 대시와 같은 기존 SQL 메타 문자에 주의하면 됩니다. CSS 공격을 탐지하는 또 다른 극단적인 방법은 HTML 태그에서 꺾쇠 괄호를 주의하는 것입니다. 하지만 이렇게 하면 많은 오류가 감지됩니다. 이를 방지하려면 규칙을 수정하여 오류를 피하지 않으면서 탐지를 더욱 정확하게 해야 합니다.
Snort 규칙에서 pcre(Perl Compatible Regular Expressions) [ref4] 키워드를 사용하면 각 규칙은 다른 규칙 작업 유무에 관계없이 수행될 수 있습니다. 이러한 규칙은 grep(문서 검색 도구)과 같은 공용 소프트웨어에서 네트워크 서버 로그를 검토하는 데 사용될 수도 있습니다. 그러나 WEB 서버는 요청이 GET으로 제출된 경우에만 사용자의 입력을 일기에 기록하므로 요청이 POST로 제출되면 일기에 기록되지 않습니다.
2. SQL 주입을 위한 정규식
SQL 주입 공격을 위한 정규식을 선택할 때 공격자가 양식을 제출하거나 쿠키 필드를 통해 SQL 주입을 수행할 수 있다는 점을 기억하는 것이 중요합니다. 입력 감지 논리는 사용자가 구성한 다양한 유형의 입력(예: 양식 또는 쿠키 정보)을 고려해야 합니다. 규칙에서 많은 경고가 나오는 경우 작은따옴표나 세미콜론을 주의 깊게 살펴보세요. 이러한 문자는 웹 애플리케이션에서 생성된 쿠키에 유효한 입력일 수 있습니다. 따라서 특정 웹 애플리케이션에 대해 각 규칙을 평가해야 합니다.
앞서 언급했듯이, SQL 인젝션 공격을 탐지하기 위한 상세한 정규식은 작은 따옴표('), 이중 확장 기호(--)와 같은 SQL의 특수 메타 문자에 주의를 기울여야 합니다. 16진수에 해당하는 숫자인 경우 다음 정규 표현식이 적용됩니다.
2.1 SQL 메타 문자 감지를 위한 정규 표현식
/(%27)|(')|(--)|(%23)|(#)/ix
설명:
먼저 작은 따옴표에 해당하는 16진수, 작은 따옴표 자체 또는 큰 따옴표를 확인합니다. 확장 표시 . 이는 MS SQL Server 또는 Oracle 문자로, 다음 내용은 주석이며 이후의 모든 내용은 무시됨을 나타냅니다. 또한 MySQL을 사용하는 경우 '#' 및 이에 해당하는 16진수 발생에 주의해야 합니다. 이중 대시에 해당하는 16진수를 확인할 필요가 없습니다. 이는 HTML 메타 문자가 아니고 브라우저에서 인코딩되지 않기 때문입니다. 또한 공격자가 수동으로 이중 대시를 16진수 값 %2D로 수정하는 경우(Achilles[참조 5]와 같은 프록시 사용) SQL 주입이 실패합니다.
위의 정규식에 추가된 새로운 Snort 규칙은 다음과 같습니다:
Alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"SQL 주입 - Paranoid"; flow:to_server, Seted;uricontent:".pl";pcre: "/ (%27)|(')|(%23)|(#)/i"; classtype:Web-application-attack; rev:5
; 이 기사 토론에서 uricontent 키워드의 값은 ".pl"입니다. 테스트 환경에서는 CGI 프로그램이 Perl로 작성되었기 때문입니다. uricontent 키워드의 값은 특정 애플리케이션에 따라 다릅니다. 이 값은 ".php", ".asp" 또는 ".jsp" 등일 수 있습니다. 이러한 관점에서 해당 Snort 규칙을 표시하지 않지만 이러한 규칙을 생성하는 정규식을 제공합니다. 이러한 정규식을 통해 많은 Snort 규칙을 쉽게 만들 수 있습니다. 이전 정규식에서는 작은따옴표가 없어도 SQL 주입 지점이 있을 수 있으므로 이중 대시를 감지했습니다[참조 6]. 예를 들어 SQL 쿼리 항목에는 다음과 같이 숫자 값만 포함됩니다.
데이터베이스에서 value1, value2, num_value3 선택
여기서 num_value3=some_user_supplied_number
이 경우 공격자는 추가 SQL 쿼리를 실행할 수 있습니다.
3; 값을 some_other_table에 삽입합니다.
마지막으로 pcre 수정자 'i'와 'x'가 대소문자를 일치시키는 데 사용됩니다. 각각 공백을 무시하십시오. 위의 규칙을 추가로 확장하여 세미콜론이 있는지 확인할 수도 있습니다. 그러나 세미콜론은 일반 HTTP 응답의 일부일 수도 있습니다. 이 오류를 줄이고 작은 따옴표와 이중 확장 기호가 정상적으로 발생하는 것을 방지하려면 위의 규칙을 수정하여 = 기호가 있는지 먼저 검색해야 합니다. 사용자 입력은 GET 또는 POST 요청에 응답합니다. 일반적으로 입력은 다음과 같이 제출됩니다.
사용자 이름=some_user_supplied_value&password=some_user_supplied_value
따라서 SQL 주입 시도로 인해 사용자 입력은 a = 기호 또는 이에 상응하는 16진수 값 뒤에 표시됩니다.
2.2 SQL 메타 문자 감지를 위한 정규식 수정
/((%3D)|(=))[^n]*((%27)|(')|(--)|( %3B)|(:))/i
설명:
이 규칙은 먼저 = 기호 또는 해당 16진수 값(%3D)에 주의를 기울인 다음 개행 문자를 제외한 0개 이상의 문자를 고려하고 마지막으로 작은따옴표와 이중 대시를 감지합니다. 세미콜론.
일반적인 SQL 삽입은 유용한 값을 얻기 위해 작은따옴표 사용과 관련된 원래 쿼리를 조작하려고 시도합니다. 이 공격은 일반적으로 1'or'1'='1 문자열을 사용하여 논의됩니다. 그러나 1'or2>1 --을 사용하는 등 이 문자열의 탐지를 쉽게 피할 수 있습니다. 첫 문자, 작은따옴표 뒤에 'or'를 추가하세요. 다음에 나오는 부울 논리는 일반적인 스타일부터 매우 복잡한 스타일까지 다양한 스타일에 따라 달라질 수 있습니다. 이러한 공격은 다음 정규식을 사용하여 매우 정확하게 탐지할 수 있습니다. 2.3장에서 설명합니다.
2.3 일반적인 SQL 주입 공격 정규식
/w*((%27)|('))((%6F)|o|(%4F))((%72)|r| (% 52))/ix
설명:
w* - 0개 이상의 문자 또는 밑줄.
(%27)|' - 작은따옴표 또는 이에 상응하는 16진수입니다.
(%6 F)|o|(%4 F))((%72)|r|-(%52) - 'or' 및 해당 16진수에 해당하는 경우.
Union' SQL 주입의 SQL 쿼리 공격은 또한 다양한 데이터베이스에서 매우 일반적입니다. 이전 정규 표현식이 작은 따옴표나 다른 SQL 메타 문자만 감지하면 많은 오류가 발생할 수 있습니다. 이는 작은 따옴표와 키를 감지하도록 추가로 수정해야 합니다. 또한 'select', 'insert', 'update', 'delete' 등과 같은 다른 SQL 키워드로 더욱 확장될 수 있습니다.
2.4 SQL 삽입 감지, UNION 쿼리 키워드 정규식
/ ((%27)|(') )union/ix
(%27)|(') - 작은따옴표 및 해당 16진수
Union - Union 키워드는
>select, insert, update, delete, drop 등과 같은 다른 SQL 쿼리에 대한 표현식을 사용자 정의하는 데에도 사용할 수 있습니다.
이 단계에서 공격자가 웹 애플리케이션에 SQL 주입이 있음을 발견한 경우 그는 취약성을 이용하려고 노력할 것입니다. 백엔드 서버가 MS SQL 서버라는 것을 알게 되면 일반적으로 위험한 저장소와 확장 저장 프로시저를 실행하려고 시도합니다. 이러한 절차는 일반적으로 'sp' 또는 'xp' 문자로 시작됩니다. 일반적으로 그는 SQL Server를 통해 Windows 명령을 실행하는 'xp_cmdshell' 확장 저장 프로시저를 실행하려고 시도할 수 있습니다. SQL Server의 SA 권한에는 이러한 명령을 실행할 수 있는 권한이 있습니다. 마찬가지로 xp_regread, xp_regwrite 및 기타 저장 프로시저를 통해 레지스트리를 수정할 수 있습니다.
2.5 MS SQL Server SQL 주입 공격을 탐지하기 위한 정규식
/exec(s|+)+(s|x)pw+/ix
에 대한 설명:
exec - 저장 또는 확장 저장 프로시저의 실행을 요청하는 키워드
(s|+)+ - 하나 이상의 공백 또는 이에 상응하는 http 항목
(s|x) p- 'sp' 또는 'xp' 문자는 보관 또는 확장 보관 절차를 식별하는 데 사용됩니다.
w+ - 프로시저 이름과 일치하는 하나 이상의 문자 또는 밑줄
3. 크로스 사이트 스크립팅(CSS)을 위한 정규 표현식
CSS 공격을 시작하거나 웹 사이트 취약점을 탐지할 때 공격자는 먼저 다음과 같은 간단한 HTML 태그를 만들 수 있습니다. < b>(굵게), <i>(기울임꼴) 또는 <u>(밑줄) 또는 <script>alert("OK")</script>와 같은 간단한 스크립트 태그를 사용해 볼 수도 있습니다. 웹사이트에 인터넷을 통해 전파되는 CSS 취약점이 있는지 여부를 탐지하기 위한 예로 사용되었습니다. 이러한 시도는 쉽게 감지될 수 있습니다. 그러나 영리한 공격자는 전체 문자열을 16진수 값으로 바꿀 수 있습니다. 이런 식으로 <script> 태그는 %3C%73%63%72%69%70%74%3E로 표시됩니다. 반면 공격자는 Achilles와 같은 웹 프록시 서버를 사용하여 <를 %3C로, >를 %3E로 자동 변환할 수 있습니다. 이러한 공격이 발생하면 일반적으로 꺾쇠 괄호가 16진수 값으로 대체됩니다. URL에 있습니다.
다음 정규 표현식은 html에서 <, >가 포함된 모든 텍스트를 감지합니다. <b>, <u> 또는 <script>를 사용하려는 시도를 포착합니다. 이 정규식은 대소문자를 무시해야 합니다. 꺾쇠 괄호와 해당 16진수(% 3C|<)를 모두 감지해야 합니다. 전체 문자열을 16진수로 변환하여 탐지하려면 사용자가 입력한 숫자와 % 기호, 즉 [a-z0-9%]를 사용해야 합니다. 이로 인해 일부 버그가 나타날 수 있지만 대부분은 실제 공격을 감지하지 못합니다.
3.1 일반적인 CSS 공격에 대한 정규식
/((%3C)|<)((%2F)|/)*[a-z0-9%]+((%3E)|>)/ix
설명 :
((%3C)|<) - < 및 해당하는 16진수를 확인합니다.
((%2F)|/)* - 닫는 태그/ 또는 이에 상응하는 16진수
[a-z0-9%]+ - 태그의 문자 또는 해당하는 16진수를 확인하세요.
((%3E)|>) - > 또는 이에 상응하는 16진수
Snort 규칙을 확인합니다.
경고 tcp $EXTERNAL_NET 임의 -> $HTTP_SERVERS $HTTP_PORTS (msg:"NII 교차 사이트 스크립팅 시도"; 흐름:to_server,설정됨; pcre:"/((%3C)|<)((%2F)| /)*[a-z0-9%]+((%3E)|>)/i"; classtype:Web-application-attack; sid:9000; rev:5;)
크로스 사이트 스크립팅도 가능합니다. <img src=>기술을 사용했습니다. 현재 기본 snort 규칙은 쉽게 우회할 수 있습니다.
섹션 3.2에서는 이 기술을 방지하는 방법을 제공합니다.
3.2 "<img src" CSS 공격 정규식
/((%3C)|<)((%69)|i|(%49))((%6D)|m|(%4D) ) ((%67)|g|(%47))[^n]+((%3E)|>)/I
설명:
(%3 C)|<) -<또는 이에 상응하는 16진수
(%69)|i|(%49))((%6D)|m|(%4D))((%67)|g|(%47) -'img' 문자 또는 그 이상 대문자와 소문자 16진수 등가물의 변형 조합
[^n]+ - 개행 문자를 제외하고 <img 다음의 모든 문자
(%3E)|>) -> 또는 이에 상응하는 16진수
3.3 CSS 공격 극단적인 정규 표현식
/((%3C)|<)[^n]+((%3E)|>) /I
설명
:
규칙은 단순히 <+개행 문자를 제외한 모든 문자+>를 찾습니다. 웹 서버 및 웹 애플리케이션의 아키텍처에 따라 이 규칙으로 인해 일부 오류가 발생할 수 있습니다. 그러나 CCS 또는 CSS와 유사한 공격은 모두 포착할 수 있습니다.
요약:
이 기사에서는 SQL 주입 및 크로스 사이트 스크립팅 공격을 탐지하기 위해 다양한 종류의 정규식 규칙을 제안했습니다. 일부 규칙은 간단하고 극단적이므로 잠재적인 공격으로 인해 경보가 울릴 수 있습니다. 그러나 이러한 극단적인 규칙은 사전 예방적인 오류로 이어질 수 있습니다. 이를 염두에 두고, 보다 정확하게 확인할 수 있도록 이러한 간단한 규칙을 추가 스타일을 사용하도록 수정했습니다. 이러한 네트워크 애플리케이션에 대한 공격을 탐지할 때 이를 IDS 디버깅 또는 로그 분석 방법의 시작점으로 사용하는 것이 좋습니다. 몇 가지 수정을 더 거친 후에는 일반 네트워크 트랜잭션 부분에 대한 비악성 응답을 평가한 후 이러한 공격을 탐지할 준비가 되어 있어야 합니다.
참고
1. SQL 주입
http://www.spidynamics.com/papers/SQLInjectionWhitePaper.pdf
2. 크로스 사이트 스크립팅 FAQ http://www.cgisecurity.com/articles/xss -
faq.shtml
3. Snort IDS http://www.snort.org
4. Perl 호환 정규 표현식(pcre) http://www.pcre.org
5. 웹 애플리케이션 프록시, Achilles http://achilles.mavensecurity.com
3. 고급 SQL 주입
http://www.nextgenss.com/papers/advanced_sql_injection.pdf
7. 보안 프로그래밍 하우투, David Wheeler www.dwheeler.com
8. 위협 및 대응책, MSDN, Microsoft