참고 URL

1.1. XML이란? 

- Extensible Markup Language의 약자
- 다목적 마크업 언어로 인터넷에 연결된 시스템끼리 데이터를 쉽게 주고 받을 수 있게 하기 위해 사용
- 데이터를 저장하고 전달하는 목적으로 사용 (데이터를 보여주는 목적 X
- 태그가 미리 정의되어 있지않고, 사용자가 직접 정의 가능
- 종료 태그가 반드시 포함되어야함 → 생략 시 에러
- 태그 사용 시 대소문자, 띄어쓰기 구별
- 속성값은 반드시 따옴표로 구별

1.2. XPath란? 

- XML Path Language의 약자
- XML 문서의 특정 요소나 속성에 접근하기 위한 경로를 지정하는 언어
- XML 문서를 탐색하기 위해 경로 표현식(path expression) 사용
- 절대경로(/로 시작하며 루트 노드부터 탐색)와 상대경로(기준으로 지정되는 노드부터 탐색)로 나타냄


2. XPATH(XML Path Language) Injection

2.1. XPATH Injection이란?  

- SQL Injection과 비슷하지만 서버에 XPATH 쿼리를 조작하여 요청 후 로그인 우회 및 데이터 추출 등이 가능한 취약점
- form 필드나 URL 파라미터에 인젝션 시도
- XML 기반의 인증 시스템이 구현된 경우, 인증 우회가 가능

2.2. 공격방법 

다음의 users.xml을 기반으로 로그인 처리가 된다고 가정하자. 
[users.xml]
<?xml version="1.0" encoding="UTF-8"?>
<users>
    <user>
        <username>admin</username>
        <password>admin123</password>
        <role>admin</role>
    </user>
    <user>
                <username>testest</username>
                <password>testest123</password>
                <role>guest</role>
        </user>
</users>

정상적으로 admin으로 로그인할 경우, XPath 쿼리는 다음과 같으며,  role에 들어있는 값을 반환한다.

string(//user[username/text()='admin' and password/text()='admin123']/role/text())

이 때, 사용자 입력값을 적절하게 필터링하지 않는 경우, SQL Injection과 동일하게  username과 password 입력창에 ' or '1'='1을 입력하면 Xpath Injection이 가능하다. 
공격 시 완성되는 쿼리문은 다음과 같다.

string(//user[username/text()='' or '1'='1' and password/text()='' or '1'='1']/role/text())

위의 쿼리는 결과값이 항상 참이므로 로그인 우회가 가능하다. 


2.3. 대응 방안 

- SQL Injection과 동일하게 방어 (싱글쿼터('), 더블쿼터(") 등의 특수 문자 필터링)


3. XXE(XML External Entities) Injection

3.1. XXE Injection이란?  

- Server-side Request Forgery(SSRF)의 일종
- XML의 DTD (Document Type Definition)를 조작하여 가능 
                     ** DTD : 문서의 구조 및 해당 문서에서 사용할 수 있는 적법한 요소와 속성을 정의
                                   XML 문서 하나에 오직 1개의 DTD만 존재 가능
- XML 문서의 외부참조 기능을 이용하여 서버의 중요정보 파일을 가져오거나, 오픈포트 등을 확인하는 공격


3.2. 공격방법

    3.2.1. 환경 구성

[xxe.php]
<html>
<body>
<meta charset='utf-8'/>
<php?
    $xml=$_POST['xml'];
    if($xml){
        $doc = simplexml_load_string($xml);
    }
?>
    <form method="post">
        <textarea name="xml" rows="12" cols="100">
<?
    echo $xml;
?>
    </textarea>
        <input type="submit">
    </form>
<?
    echo $doc;
?>
</body>
</html>

    3.2.2. DTD 변경 시도




    3.2.3 SYSTEM 함수 이용한 로컬파일 읽기
  • SYSTEM 함수 - 외부 문서를 불러올 수 있는 기능 제공
         



3.3. XXE Injection의 한계 

- DTD 선언이 가능해야 함
- 불러오는 외부 리소스가 DTD 문법에 어긋나지 않아야 함
- Binary 파일 불러오기 불가 
- 파일 불러오기의 경우, 서버 구동 사용자((예) apache, nobody 등)가 해당 파일에 대한 읽기(r)권한이 있어야 불러오기가 가능함

3.4. 대응 방안 

- 근본적인 해경방안으로는 entity 기능을 비활성화
- 안전한 함수 사용(PHP 기준)::
-> libxml_use_internal_errors(true) : XML 파싱 도중 오류가 발생했을 경우, 오류 메시지 출력을 하지 않게 막아주는 함수
-> libxml_disable_entity_loader(true) : 외부 리소스를 불러오지 못하게 하는 함수



참고 URL

  • http://www.securiteam.com/unixfocus/6X00P0ANFM.html
  • http://pjongy.tistory.com/131
  • http://rootable.tistory.com/entry/addslashes-mysqlrealescapestring-%EC%9A%B0%ED%9A%8C

개요

magic_quotes_gpc 란? 

- php에서 사용되는 설정값으로 값을 입력 받을 때 필터링이 필요한 문자 앞에 백슬래시(\)를 붙임
- 기본적으로 php.ini 파일에 ON으로 설정되어 있음
- GET, POST, COOKIE 데이터 내 해당 문자가 있을 경우 필터링하여 반환함.
addslashes()와 동일 

' (싱글쿼터)
\'
" (더블쿼터)
\"
\ (백슬래시)
\\
NULL (널바이트)
\

mysql_real_escape_string() 란?

- php 내장 함수로 SQL Injection을 방어하기 위해 사용됨
- DB로 전달되는 파라미터에 필터링이 필요한 문자가 입력된 경우 이스케이프 문자(백슬래시, \)를 붙여 공격을 방어
- 위의 magic_quotes_gpc와 비슷하지만 더 많은 문자열 치환

' (싱글쿼터)
\'
" (더블쿼터)
\"
\ (백슬래시)
\\
\x00 (널바이트)
\\x00
\n (line feed )
\\n
\r (carriage return)
\r
\x1a (EOF)
\\x1a


우회

원리
  • 멀티바이트를 사용하는 언어셋 환경에서는 백슬래시(\) 앞에 %a1 ~ %fe 와 같은 값을 입력하면 %a1\를 하나의 문자로 취급함
  • 따라서, 백슬래시(\)가 사라지므로 이스케이프 처리가 되지 않아 공격자의 의도대로 SQL Injection 등의 공격이 가능해짐

예 시
입력값
magic_quotes_gpc / mysql_real_escape_string()
결과값
%aa' or 1=1#
%aa\' or 1=1#
�' or 1=1#


** 이 포스팅은 추후에 필터링 패턴 발견 시 계속 추가할 예정임

1. substr 우회
   ord, right, left, mid 사용
   (ex) substr('admin',1,1) = 'a'   → left('admin',1) 

2. ascii 우회
   ord, hex 사용
   (ex) ord('admin')=97    ord()는 가장 왼쪽의 문자를 아스키코드 10진수로 전환    

3. =, like, or, and 우회
  =    like, between, in, instr 
 !=  →  <>
  or    ||  (%7c%7c)
  and    && (%26%26)

4. 빈칸(공백) 우회
  ' '    ( ), /**/, %09, %0a, %0b, %0c, %0d, %a0, +, %20, 
  주석(-- -, #)    ;%00

5. ' (싱글쿼터) 우회
  '     %27, char, " (더블쿼터)

6. ereg, eregi 우회  : case-sensitive
  - 특수문자  %00(널바이트) : %00(널바이트)까지 패턴 검색
  - 문자열  대소문자 변경

7. preg_match 우회
 \ 

TIP

  • 영어가 아닌 문자 Blind-Injection 시, 한글자 당 바이트 추출: length(mid(pw,1,1))=4
  • error based SQL Injection
    •  ' or id='admin' and if((select id='admin' and length(pw)=16),true,(select 1 union select 2))#
    •  ' or id='admin'&&power((length(pw)>10)+1,999999999999999999)#

참조 URL

  • 여러 우회패턴 정리 : http://blog.daum.net/bada0217/149
  • 워게임 사이트 - 여러 우회패턴을 익히는데 유용 : http://los.eagle-jump.org


+ Recent posts