文章目录
- 函数特性
- 匹配数组报错
- 进制转换绕过
- 正则表达式匹配换行
- 绝对路径绕过
- 弱类型语言隐式转换
- 核心概念
- 转换规则
- 运算符优先级
函数特性
匹配数组报错
以此为例,如果传入参数是一个数组,则preg_match()函数报错返回0,完成绕过,而intval()函数只关心数组的元素数量,其中有元素则返回1,无元素则返回0.
同样的道理,MD5函数在处理数组时会报null
payload:a[]1=&b[]=2
注意是post请求
进制转换绕过
- 接下来是类似的原理,但是需要绕过判断而让函数正常执行,显然数组匹配不行,那么有没有其他方法呢?
继续了解intval函数,发现intval($num,0)是将num转为十进制形式,而num在与4476做判断时,不会自动进行进制的转换,利用这一点采取十六进制即可绕过 - 在此基础上,如果我们绕过的限制继续增加
- 字符被禁用,所以十六进制不可行,采用八进制010574,但是strpos会返回字符串中第一个值为0的字符的位置,如果第一个字符是0,取非后变成1,将无法完成绕过,因此我们采取在八进制前加上空格
payload:%20010754
正则表达式匹配换行
在这个例子中,我们在第一个if中需要从开头到结尾是php,i为不区分大小写,m为每一行都要进行匹配检测,只要其中一行满足即可,再第二个if中,我们只看第一行满不满足,所以可以基于此特性在第一行构造
cmd=f%0aphp
%0a是换行符的url编码形式
绝对路径绕过
直接给flag.php会被过滤,我们猜测flag所在的绝对路径
\var\www\html\flag.php
这样在进行比较时能顺利完成绕过
弱类型语言隐式转换
核心概念
PHP 是 弱类型语言(动态类型),意味着变量的数据类型 不会固定,且在不同操作中会自动隐式转换类型。字符串和整数比较时,PHP 会先将字符串转换为整数,再进行数值比较。
转换规则
当字符串和整数比较时,PHP 会按照以下规则处理字符串:
- 从左到右扫描字符串,直到遇到第一个非数字字符为止
- 提取前面的数字部分转换为整数
- 如果没有数字部分,则转换为 0
由此我们知道,传入2.php跟传入2会产生相同的效果
运算符优先级
看似需要三个变量值都为数字,实际上在判断完v1之后赋值运算就结束了,涉及到php运算符优先级的问题
另外一个问题在于v2中不能含有;而v3中必须含有;
解决方案:用?>代替; 用注释符除去冗余信息
payload:v1=1&v2=system(‘tac ctf*’)/&v3=/;
继续看,过滤程度加深,学习一种新方法
echo new ReflectionClass('ctfshow');
通过反射类查看ctfshow类的具体信息
开始构造
v1=1&v2=echo new ReflectionClass&v3=;