XecureWeb(제큐어웹) 개요

  • Xecureweb은 공인인증서 처리를 위한 프로그램이며, 공인인증서 사용 시 많은 금융권 회사들이 Xecureweb 솔루션을 도입해서 사용
  • PKI 기반의 암호와 전자서명 기능을 제공하는 웹 구간 암호화 솔루션
  • SEED, ARIA, AES 등 국내외 표준 암호화 알고리즘을 사용하여 보안 기술 표준을 준수하며, 주민번호, 민감정보 등에 대한 암호화, 공인인증, 서명 기능을 제공
  • 요청값과 응답값 암호화 가능
  • 요청값 암호화 시, 
    • DLL에서 암호화
    • Javascript로 암호화 (일반적으로, xecureweb.js 등 xecureweb이 들어간다.) 

암호화 솔루션이기 때문에  시스템 개발 시 제큐어웹을 사용하면, 전송 시 데이터 노출이 되지 않아 해킹 위협을 피할 수 있다고 생각하는 개발자들이 많은 것 같다... 
하지만 암호화 전의 값을 볼 수만 있다면 ?!

dll을 통해 적용하면 리버싱을 하는 등의 많은 작업을 요하지만,
xecureweb.js (보통 비슷한 이름)를 사용할 때, 스크립트 파일 변조를 통해 쉽게 암호화 전의 파라미터를 확인하고 변조할 수 있다!!


Xecureweb.js 파일 확인 및 변조

** 항상 같은 방법으로 js 파일이 코딩되어 있는 것이 아니므로, IE 개발자 도구의 디버깅 기능을 사용하여 언제 어디서 암호화가 이루어지는지 확인하는 과정이 필요하다.
** 아래 설명할 내용은 두 개의 다른 업체에서 동일하게(함수명도 동일) 적용되었던 것으로 보아, xecureweb 사용 시 기본으로 제공되는 파일일 것으로 추측된다.
** 해당 포스팅을 활용하여 악의적인 행위를 하였을 경우, 책임은 본인한테 있음을 경고합니다.
** 테스트로 진행한 해당 사이트에 대한 정보 노출을 최소하하기 위하여 많은 정보가 모자이크되어 있으니 양해 부탁드립니다..

1) 공인인증서를 사용하여 로그인 시도




2) 프록시 도구를 이용하여 파라미터 암호화 확인




3)  JS 파일 변조 * 파일을 변조하는 방법에는 정답이 없다...
        
        01 - 해당 페이지에서 [개발자도구]를 열어 xecureweb.js 파일을 찾는다.
        02 - 파일을 분석 및 디버깅하여 파라미터가 암호화되는 구간 및 함수를 찾아낸다.



        03 - 함수를 변조한다.
                    
                - 이 파일을 분석해 보면 XecureMakePlain이라는 함수를 통해 암호화 전의 파라미터를 처리하는 것을 확인할 수 있다.
                - 따라서, 함수가 plain_text 변수를 return하기 전에 해당값을 prompt를 통해 띄움으로써 평문 파라미터 확인이 가능하다.
                - 자바스크립트에서 경고창을 띄우는 방법은 여러가지(alert, confirm 등)가 있지만 prompt를 사용하는 이유는 수정도 가능하게 하기 위해서이다.
return plain_text; → plain_text=prompt("p", plain_text); return plain_text; 
                



        04 - 파라미터가 암호화되기 전 보여지는 지 확인하고, 항상 변조된 파일을 사용하기 위해 버프에 replace 규칙을 추가한다.






아주 간단한 정규 표현식에 대해 정리한다...
훨씬 더 많은 방법이 있지만 가장 보편적으로 쓰이는 것만!
더 필요한게 있을 경우 추가할 예정임..

\d
숫자(0-9)
.
모든 char (숫자, 글자, 공백, 특수문자 등)
\. , \?
. (마침표),  ? (물음표)
[abc]
a,b,c
[^abc]
a,b,c 제외
[A-C]
A~C까지의 글자 검색
\w
알파벳 대소문자, 숫자(0-9), 공백 = [A-Za-z0-9_]
a{3}
aaa -> a 3번 반복
a{1,3}
a가 1번이상 3번 이하 반복
\d*
0개 이상의 숫자 (0 or more)
\d+
1개 이상의 숫자 (1 or more)
?
선택적 포함
\s
빈칸( ), 탭(\t), 줄바꿈(\r), LF(\n)
^Mission$
문장의 시작(^)과 끝($) 
()
그룹 묶을때 -> 묶인 순서대로 그룹 형성
|
OR
\D
non-digits
\S
non-whitespace
\W
non-alphanumeric


참고 URL



참고 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) : 외부 리소스를 불러오지 못하게 하는 함수



+ Recent posts