Easyphp 对于初学者其实一点也不easy哈
打开题目场景
<?php highlight_file(__FILE__); $key1 = 0; $key2 = 0; $a = $_GET['a']; $b = $_GET['b']; if(isset($a) && intval($a) > 6000000 && strlen($a) <= 3){ if(isset($b) && '8b184b' === substr(md5($b),-6,6)){ $key1 = 1; }else{ die("Emmm...再想想"); } }else{ die("Emmm..."); } $c=(array)json_decode(@$_GET['c']); if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022){ if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0])){ $d = array_search("DGGJ", $c["n"]); $d === false?die("no..."):NULL; foreach($c["n"] as $key=>$val){ $val==="DGGJ"?die("no......"):NULL; } $key2 = 1; }else{ die("no hack"); } }else{ die("no"); } if($key1 && $key2){ include "Hgfks.php"; echo "You're right"."\n"; echo $flag; } ?> Emmm...
经典的php代码审计题
首先我们大致浏览一下,想要输出flag
Flag的输出与key1 && key2有关
key1 && key2又与我们通过get方式提交的a,b,c三个参数有关
a,b决定key1,c决定key2
我们一点点来看
参数a
if(isset($a) && intval($a) > 6000000 && strlen($a) <= 3)
分析:
a的值需要大于 6000000,同时也需要长度小于3
尝试 科学技术法 7e6
参数b
if(isset($b) && '8b184b' === substr(md5($b),-6,6))
分析:
b的后六位md5值要等与8b184b,这个需要使用脚本跑一下了,我偷懒这里使用一下最近很火的chatgpt
不得不说这个玩意是真的强
import hashlib
for i in range(100000):
m = hashlib.md5()
m.update(str(i).encode())
h = m.hexdigest()
if h[-6:] == "8b184b":
print(i)
break
得到b为53724
接下来是最难的
参数c
$c=(array)json_decode(@$_GET['c'])
分析:
C参数应该是一个json数据,解析成数组
if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022)
判断c为数组 , is_numeric php内置函数判断是否为数字,题中不要数字,m键值要大于2022
想到了php弱类型比较 写一个2023a即可
if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0]))
n必须为数组,键值有两个,类似于[[*,*...],*]。
$d = array_search("DGGJ", $c["n"]);
$d === false?die("no..."):NULL;
array_search() 函数与 in_array() 一样,在数组中查找一个键值。如果找到了该值,匹配元素的键名会被返回。如果没找到,则返回 false
数组中找DGGJ,如果没找到DGGJ,die,这里我们肯定找到了,接着往下执行
foreach($c["n"] as $key=>$val){
$val==="DGGJ"?die("no......"):NULL;
}
$key2 = 1;
在php中,三个等号“===”是全等比较运算符,用于比较两个操作数的值是否相等,同时检测它们的类型是否相同;只有两边的值和数据类型都相等时,运算结果才是TRUE
匹配n的一个键值若等于DGGJ直接die
不能存在DGGJ,但array_search()又要查找并且要有结果,矛盾,这里肯定要绕过,全等肯定无法绕过
查到array_search()
的绕过
array_search()
没有设置strict参数(如果该参数被设置为 TRUE,则函数在数组中搜索数据类型和值都一致的元素),我们就可以用0
和DGGJ
进行弱比较,0 == 'DGGJ'
又0===='DGGJ'为false
即n
的值中有0
成功了
写payload
?a=6e7&b=53724&c={"m":"2023a","n":[[],0]}
提交payload
You're right cyberpeace{15ad787a1de7cf92b7fd50ee19e3c5cb}
提交
cyberpeace{15ad787a1de7cf92b7fd50ee19e3c5cb}