一、题目链接:
https://adworld.xctf.org.cn/challenges/list
二、解法步骤:
本题打开后是一段php代码,首先进行代码审计:
题目要求输入两个变量a和b(还有个c),都符合其对应条件即可拿到flag。
先来看变量a:
isset(a)是php中最常用来判断变量是否被设置以及非空 有值则返回true,否则返回false
intval(a)该函数会将输入的变为整型
intval() 转换字符串类型时,会判断字符串是否以数字开头
- 如果以数字开头,就返回1个或多个连续的数字
- 如果以字母开头,就返回0
1a2b3c———1
abc———0
此题中可以使用传入科学计数法来使值大于600000 并且长度小于等于3
a = 1e9
再来看变量b:
题目中需要使b的md5值的后六位等于 8b184b,这里我们可以写一个简单的python脚本来进行爆破(这里不展示了)
可以得出b=53724
现在我们已经完成了第一类判断
c:
json_decode 函数:对json格式的字符串进行解码
array(): 将其转化为数组类型
is_array(): 字面意思,判断是否是数组类型
is_numeric(): 判断输入是否可以转化为数字类型 对于数字加字符就不可以进行转换
后半部分是php弱类型比较
综合以上函数分析 输入2023a 即可进入下一层循环
array("m"=>"2023x")这是数组中只有m这一个元素的传参方式
下一层循环要求c【n】是一个数组且包含两个元素 且第一个元素是一个数组
array_search是在数组中查找字符串
下边的foreach其实就是在数组中进行遍历查找
也就是说在前一段中查找如果没有该字符串就返回no
在下一段循环中如果有该字符串就返回no,这看起来相互矛盾
但是arraysearch使用的是弱比较,因此我们可以使用0来进行绕过判断,元素2因此赋值为0
$c=array("m"=>"2023x","n"=>array(array(),0))
最后还需要对c进行json编码
c={"m":"2023x","n":[[],0]}
最后将得到的a,b,c使用get方式传入即可拿到flag!!!
You're right cyberpeace{233ee11925836ad185c691b9ad88bdf2}
标签:返回,Web,2023x,--,blogs,json,数组,字符串,array From: https://www.cnblogs.com/heck1ng/p/17745324.html