总结一下关于php(拍h片)弱类型相关知识的梳理。
前言
php有八种类型
标量类型:整数型integer,浮点型float,字符串类型string,布尔类型boolen
复合类型:对象 object,数组array
特殊类型:空null,资源resource
我们要知道php是一种弱类型的语言,它不同于C/Go/java等。
那么首先,说一下php中两个比较符号。
在这里要说明一下,==在这里是判断两边的值是否相等,等号两边为相同的值的时候,直接判断值是否相等,如果类型不一样,则先转换为相同的类型,再判断转换后的值是否相等。
(若是等号两边是数值和字符串比较,则字符串会转换为数值,字符串转为数值这里很有意思了,大家可以用var_dump去尝试一下不同的类型转换)
(比如像这样多尝试尝试)
其中为什么第11行为true呢,这里是php中的hash缺陷,如果hash值是以0e开头的,进行比较时候会变成0乘以10的多少次方,结果还是为0
(ps:如果MD5运算后为0e开头的字符串,是不是可以绕过强制(string)转换后的MD5比较呢)
提醒:0,"0",null,false,array()都是为空。
===,则是判断的是否全等,不仅要值相等,而且类型也要一致。
而在有些语言中(比如Go),要比较的两个变量类型须相等并且Go没有隐式类型转换,要比较的两个变量必须类型完全一样,类型别名都也不行。
这里便可以先从一个简单的题目入手(题目来自攻防世界)。
is_numeric() 函数
用于检测变量是否为数字或数字字符串(感觉说明这个函数,大家就没有生词了)。
然后就是一个很简单的弱类型比较了,大家随便输一下符合两个逻辑的就行了。
有了这些准备以后,我们可以进阶的再看一个题目(题目来自于BUUCTF)。
我们迈过第一关以后会看到这个页面,F12得到了提示。
$a = $GET['a'];
$b = $_GET['b'];
if($a != $b && md5($a) == md5($b)){
// wow, glzjin wants a girl friend.
知识补充
md5( string $str [, bool $raw_output = false ] ) : string
计算字符串的 MD5 散列值,md5函数告诉我们我们传入的参数应该是string类型的,但如果我们传入一个数组,它不会报错,也不会解析其值,导致两个数组的中无论什么值MD5都相同(出同样的错误是不是也是一样的呢)。
然后我们便可以传入两个数组来进行绕过了。
到了第三关,便和第二关大同小异了。
如果我们遇到强制类型转换比如再传参的参数前面有一个(string)类型转换,那怎么办,那边要用的MD5强碰撞了(记得以前看过一个cissp的题目讲的也是碰撞出MD5,也解释MD5的不安全性)。
这里我们大多可能要用一下工具(fastcoll)
讲完了MD5我们再将另一个,sha(题目来自于bugku,web29各种绕过)。
知识补充
sha1( string $str [, bool $raw_output = false ] ) : string
——计算字符串的 sha1 散列值,测试sha1()函数和md5()函数"殊途同归"。
这里还有很多可以利用的函数,比如 json_decode() {传入json形式的数据,类Python中的字典},不可否认的是任何函数的绕过都需要相关的逻辑判断。
{json_decode()把接送格式的字符串解码成了数组,而通过相应的逻辑判断我们便可的绕过}
下面我们会介绍与弱类型相呼应的php函数。
unserialize函数问题
知识补充
对单一的已序列化的变量进行操作,将其转换回 PHP 的值。
key和value是我们可以通过POST数据传入的值,我们把它传入bool值,unserialize函数解析为了数组,下面又因为使用的是 ==,根据php弱类型,bool值跟任何字符串都相等。
故判断成立输出了OK。
strpos函数问题
知识补充
strpos ( string $haystack , mixed $needle [, int $offset = 0 ] ) : int
返回 needle 在 haystack 中首次出现的数字位置。
问题的出现依然是出现了0=="admin"的弱类型比较的问题。
php中的哲学问题
(代码中还有哲学问题?)
因为以前老师问过我们这个问题,为什么呢,用一句模糊的话来说"无限接近就是相等"。
in_array()函数问题
知识补充
in_array( mixed $needle , array $haystack [, bool $strict = false ] ) : bool
— 检查数组中是否存在某个值,若第三个参数strict为默认的false,则使用松散比较。
这是便我们尝试对比的结果了。
相关题目(php审计题目):
首先我们发现in_array()并没有使用第三个参数,所以为默认值,可以进行松散比较。我们只要再*.php前面加上一个在range(1,24),比如23a.php。
array_search()问题
array_search ( mixed $needle , array $haystack [, bool $strict = false ] ) : mixed
— 在数组中搜索给定的值,如果成功则返回首个相应的键名,与in_array()函数类似。
strcmp()函数问题
知识补充
比较两个字符串(区分大小写)
strcmp(string1,string2)
返回值:
• 0 - 如果两个字符串相等
• <0 - 如果 string1 小于 string2
• >0 - 如果 string1 大于 string2
测试缺陷的方法和MD5函数类似,我们不给予这个函数string类型,而是给它array类型的值。
发现它依然是给出警告,但依然判断为ture,打印出了ok。(题目来自南京邮电大学网络攻防训练平台-pass check)
$pass=@$_POST['pass'];
$pass1=***********;//被隐藏起来的密码
if(isset($pass))
{
if(@!strcmp($pass,$pass1)){
echo "flag:nctf{*}";
}else{
echo "the pass is wrong!";
}
}else{
echo "please input pass!";
}
/*
wp:
$k[]=1;
var_dump(!strcmp($k, "flag"));
printf("n");
*/
switch相关的问题
如果switch的case是数字类型的判断的时候。switch会将参数转换为int类型。
不要慌张,继续加油哈。
end
本文始发于微信公众号(雷石安全实验室):php弱类型比较(松散比较)
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论