场景一:simple_php
题目描述
小宁听说php是最好的语言,于是她简单学习之后写了几行php代码。
进入场景
- 给了php代码,分析一下
GET传入两个参数a,b
a = @ a=@ a=@_GET[“a”];其中的@是为了防止没有$_GET[‘a’]出现错误提示
$a==0 and a : a 等 于 0 , 且 a 是 T R U E 。 p h p 是 弱 语 言 , 在 执 行 关 系 运 算 “ = = ” 时 要 求 运 算 符 两 边 的 数 据 类 型 必 须 一 致 , 如 果 等 号 左 边 是 字 符 串 , 会 被 强 制 转 换 为 整 型 0 , 但 字 符 串 是 T R U E 。 i s n u m e r i c ( a :a等于0,且a是TRUE。php是弱语言,在执行关系运算“==”时要求运算符两边的数据类型必须一致,如果等号左边是字符串,会被强制转换为整型0,但字符串是TRUE。 is_numeric( a:a等于0,且a是TRUE。php是弱语言,在执行关系运算“==”时要求运算符两边的数据类型必须一致,如果等号左边是字符串,会被强制转换为整型0,但字符串是TRUE。isnumeric(b) :is_numeric() 函数用于检测变量是否为数字或数字字符串。如果指定的变量是数字和数字字符串则返回TRUE,否则返回FALSE。
接收参数 a 存 在 , 并 且 a存在,并且 a存在,并且a==0可用.绕过(非数字都可绕过)
flag1获取,需要a为0 且为true
flag2获取,需要b不是数字或数字字符串,且值大于1234
参考链接:https://blog.51cto.com/u_15300891/3060354
场景二:easyphp
进入场景
- 很长一串,定位flag,发现要使key1和key2为true。
往前看,key1要为1,需要变量a整数数值大于6百万,同时字符串长度小于等于3;变量b要md5加密后,后6位为8b184b
Intval()函数获取变量整数数值:
Intval最大的值取决于操作系统。 32 位系统最大带符号的 integer 范围是 -2147483648 到 2147483647。举例,在这样的系统上, intval(‘1000000000000’) 会返回 2147483647。64 位系统上,最大带符号的 integer 值是 9223372036854775807。
这个有个应用就是在判断数值是不是回文上,如果参数为2147483647,那么当它反过来,由于超出了限制,所以依然等于2147483647。即为回文。
- 变量a可以使用科学计数法来绕过,1e3=100
官网:https://www.php.net/manual/zh/function.intval.php
- 变量b可以爆破出对应的明文
变量b对应的结果是53724。
输入a,b变量值测试,回显no,说明变量a,b成功绕过,还剩变量c的绕过。
- 变量c是一个数组类型
使用json_decode()函数对变量c进行编码,返回数组类型。
c数组中存在m,n两个键名,m的键值不能是数字且大于2022。
n的键值是一个数组且长度为2的二维数组,随便输入一个二维数组给n键
5. 变量d
array_search() 函数在数组中搜索某个键值,并返回对应的键名。
三个等号也是等于的意思,与==相比的话,识别数字和字符类型。
foreach 循环用于遍历数组。foreach ($array as $key => $value){}每一次循环,当前数组元素的键与值就都会被赋值给 $key 和 $value 变量(数字指针会逐一地移动),在进行下一次循环时,你将看到数组中的下一个键与值。
参考链接:https://blog.csdn.net/m0_56107268/article/details/127830960
PHP2
- 进入场景,什么都没有
御剑扫一下,只有一个index.php文件
直接访问index.php还是什么都没有 - 将php改为phps,尝试查看php源码
GET方式获取参数id,对id进行url解码后判断是否为admin
要绕过,尝试对admin进行url加密
对admin进行二次加密
复制到url去访问