🇮🇱HexionCTF 2020 Writeup 2 min read
本文最后更新于 477 天前,其中的信息可能已经有所发展或是发生改变。

Author:颖奇L’Amore

Blog:www.gem-love.com


Well Known(100pt)

Well… it’s known (:

https://wk.hexionteam.com

Author: Yarin

考点:Recon

难度:简单

打开之后是404,丢进扫描器发现了robots.txt,在robots.txt告知了sitemap.xml,访问是站点地图

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://wk.hexionteam.com/404.html</loc>
</url>
<url>
<loc>https://wk.hexionteam.com/robots.txt</loc>
</url>
<url>
<loc>https://wk.hexionteam.com/.well-known/security.txt</loc>
</url>
</urlset>

/.well-known/security.txt得到flag:hexCTF{th4nk_y0u_liv3_0v3rfl0w}


Notes(881pt)

http://challenges2.hexionteam.com:2001

Author: Yarin

考点:Flask SSTI

难度:简单

是一个创建笔记的web应用

在源代码发现如下注释:

<!-- DEPRECATED <script>
    $.getJSON("/notes", (res) => {
        res.forEach(o => {
            notesList.append(document.createTextNode(o));
        });
    });
</script> -->

所以我们可以访问/notes来查看我们创建的笔记

尽管在主页上显示的笔记内容没有造成模板注入:

但是在/notes内成功进行了SSTI

之后就常规的SSTI套路了,直接RCE:

{{ config.__class__.__init__.__globals__['os'].popen('cat flag').read() }}

flag:hexCTF{d0nt_r3nder_t3mplates_w1th_u5er_1nput}


JACC(977pt)

Say hello to JACC – Just Another Cookie Clicker 🍪

http://challenges2.hexionteam.com:2002

Author: Yarin

考点:Flask Session、XML元素注入、XML外部实体注入

难度:难

截止到写本wp,ctftime上还没有本题目的任何wp:

Flask Session

打开之后是这样的:

输入用户名之后,出现一个🍪,点🍪可以增加上面的数字,点save state可以把数字保存:

<img onclick="cookies.innerText = parseInt(cookies.innerText) + 1;" src="/static/cookie.png"></img>
<br>
<button onclick="fetch('/site?cookies=' + cookies.innerText);" type="submit">Save State</button>

保存cookie之后,查看一下当前的cookie:

.eJxFjM1ugyAAgF9l4bwDurmsJjuMDLQutEEFKjctJlgRXWtSS9N3Xw9Ld_5-rmA_jn3XnkD8_gzsMlgQX8FTA2LA8YZovJSsz0QuZyeGQLaSXppUdfWwcqWgUMPlh0lNuf88snB6beX6si0RU-HKFXyDVIBSPpg-h_zOLVLQft39jEHiODaytVNVOKGEJyeeRMc2yebKG0oD9Sat-dbC7qhc_n9_fZ6ac-VxVJMppTvU1Yf8hWMa7RO6bKWpc0_O1TDC4uHrUPY6ocTyDZ4Z8zaqDuuIEuQaDz_A7fYL2KRYag.XpVchQ.X6Jx1ACDFEtlRPb-XKmY0mk73Nk

看得出来是一个flask session,以前也考过类似的题,比如MetasequoiaCTF的Easy Calc,这个session可以直接被解密的,直接上解密脚本:

可以看到lxml对应的键值是个base64,解码得到:

<!-- API Version: 1.0.0 -->
<root>
    <data>
        <username>y1ng</username>
        <is_admin>0</is_admin>
    </data>
</root>

XML元素注入

可以看到有一个<is_admin>为0,感觉需要把它改成1。但是,因为flask session若想要encode需要先知道一个secret key,而如果没有这个key就不能encode,也就不能进行session的覆盖

但是可以看到,用户名也是在XML这的,因此可以通过注入XML来手工设置<is_admin>为1,后文再次出现<is_admin>且为0并不会对它进行重写。来到主页,输入如下用户名:

y1ng</username><is_admin>1</is_admin></data><data><username>test

可以来看看新的session:

界面现在也变了,也不再是那个饼干了,反而是一个admin login的界面:

但是不知道password是什么,查看源代码得到一行注释:

<!-- If you are an admin and you forgot the password it's located on the server at /admin_pass-->

但是访问/admin_pass会得到一个404,说明他可能是一个文件,但是flask没有添加相关路由

XXE

再次回到主页的输入用户名处,查看源代码,发现有一个隐藏的<input>

<form class="centered" action="login" method="post">
    <div style="text-align: center;"><h4>Just Another</h4><h1>Cookie Clicker</h1></div>
    <input class="good" name="username" placeholder="Username" />
    <input name="version" value="1.0.0" hidden>
    <button class="good" type="submit">Play</button>
</form>

他是一个version,值为1.0.0,好像在哪见过,刚刚的session解密+base64解码得到的xml中的第一行就是<!-- API Version: 1.0.0 -->

所以这个1.0.0很有可能是在这里被刚刚的隐藏的<input>输入的,那么如果真的是这样,这就意味着这里可以XXE,用burp抓包修改version为xxe的Payload,username为&y1ng;,注意HTML注释符需要手工闭合:

之后带着新的session去访问,就通过XXE读取到了/admin_pass内的内容:

重新伪造<is_admin>为1,输入这个密码:

flag就出来了:

颖奇L'Amore原创文章,转载请注明作者和文章链接

本文链接地址:https://www.gem-love.com/ctf/2266.html

注:本站定期更新图片链接,转载后务必将图片本地化,否则图片会无法显示

暂无评论

发送评论 编辑评论

上一篇
下一篇