攻防世界WEB(新手模式)18-easyphp
打开题目,直接开始代码审计
-
条件1:
$a
必须存在,且intval($a)
必须大于 6000000,同时strlen($a)
必须小于等于 3。-
这意味着
$a
必须是一个字符串,且它的整数值大于 6000000,但字符串长度不能超过 3。这看起来是不可能的,因为一个长度不超过3的字符串,其整数值不可能大于6000000。 -
这里可能存在一个漏洞:
intval()
函数在处理字符串时,会从字符串的开头解析数字,直到遇到非数字字符为止。因此,我们可以利用科学计数法来绕过这个限制。例如,$a = "1e9"
,它的整数值是1,但intval("1e9")
会返回1,而strlen("1e9")
是3。
-
-
条件2:
$b
必须存在,且md5($b)
的最后6个字符必须是8b184b
。-
我们需要找到一个字符串
$b
,使得md5($b)
的最后6个字符是8b184b
。这可以通过暴力破解或使用彩虹表来实现。
-
-
条件1:
$c
必须是一个数组,且$c["m"]
必须存在,不能是数字,且必须大于2022。-
这里的关键是
!is_numeric(@$c["m"])
和$c["m"] > 2022
。我们需要一个非数字的值,但它仍然可以比较大小。PHP中的字符串比较是按字典序进行的,因此我们可以使用一个字符串,比如"2023a"
,它大于2022
,但不是数字。
-
-
条件2:
$c["n"]
必须是一个数组,且长度为2,且第一个元素也是一个数组。-
我们需要构造一个数组
$c["n"]
,其中包含两个元素,第一个元素是一个数组。
-
-
条件3:
array_search("DGGJ", $c["n"])
必须返回一个非false
的值,但在遍历$c["n"]
时,不能有任何元素等于"DGGJ"
。-
这里的关键是
array_search
返回的是键名,而不是值。因此,我们可以构造一个数组,其中"DGGJ"
是键名而不是值。例如:
-
-
设置
$a
为"1e9"
,使得intval($a)
大于6000000且strlen($a)
小于等于3。 -
找到一个字符串
$b
,使得md5($b)
的最后6个字符是8b184b
。 -
设置
$c
为一个JSON字符串,解码后满足以下条件:-
$c["m"]
是一个非数字的字符串,且大于2022。 -
$c["n"]
是一个包含两个元素的数组,第一个元素是一个数组,且"DGGJ"
是第一个元素的键名。
-
最终的GET请求可能类似于:
?a=1e9&b=53724&c={"m":"2023C","n":[[],0]}
得到flag