CTFer blogs--Web-easyphp

发布时间 2023-10-06 23:49:13作者: Heck1ng

一、题目链接

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}