PHP是弱类型还是强类型,php弱类型比较(松散比较) | CN-SEC 中文网

总结一下关于php(拍h片)弱类型相关知识的梳理。

f09ac0a49888b7ca429bfd4bb2515263.png

27c1d3de8ea2be5a50a8588589737d43.png

a1d1f16e7535e65bd5518399ef0286ef.png

52ac43ab9d63c633b6af29fcceeb67b6.png

前言

0e4eb57fe4732ccce541adf89754615e.png

php有八种类型

标量类型:整数型integer,浮点型float,字符串类型string,布尔类型boolen

复合类型:对象 object,数组array

特殊类型:空null,资源resource

我们要知道php是一种弱类型的语言,它不同于C/Go/java等。

那么首先,说一下php中两个比较符号。

888edf7a689c910bce79a1b90d38305e.png

在这里要说明一下,==在这里是判断两边的值是否相等,等号两边为相同的值的时候,直接判断值是否相等,如果类型不一样,则先转换为相同的类型,再判断转换后的值是否相等。

(若是等号两边是数值和字符串比较,则字符串会转换为数值,字符串转为数值这里很有意思了,大家可以用var_dump去尝试一下不同的类型转换)

(比如像这样多尝试尝试)

2b3f002308a03a560ab9ca30da4207f7.png

其中为什么第11行为true呢,这里是php中的hash缺陷,如果hash值是以0e开头的,进行比较时候会变成0乘以10的多少次方,结果还是为0

(ps:如果MD5运算后为0e开头的字符串,是不是可以绕过强制(string)转换后的MD5比较呢)

提醒:0,"0",null,false,array()都是为空。

===,则是判断的是否全等,不仅要值相等,而且类型也要一致。

5b166de1c1bcbdc4bc802ac3ee7c18d2.png

而在有些语言中(比如Go),要比较的两个变量类型须相等并且Go没有隐式类型转换,要比较的两个变量必须类型完全一样,类型别名都也不行。

这里便可以先从一个简单的题目入手(题目来自攻防世界)。

692f4f940baa364d1348ebf692b14c5c.png

b5626a45e4c1b2c54c0500433290d933.png

6ffc1304460e3a3841dfe010bbf38463.png

3eb9230aa4a13ec150f33cc407c822dc.png

is_numeric() 函数

用于检测变量是否为数字或数字字符串(感觉说明这个函数,大家就没有生词了)。

然后就是一个很简单的弱类型比较了,大家随便输一下符合两个逻辑的就行了。

3a3809794db4356b5ade79574d1b061b.png

有了这些准备以后,我们可以进阶的再看一个题目(题目来自于BUUCTF)。

我们迈过第一关以后会看到这个页面,F12得到了提示。

e29e178fa95235e0d3cde82f714cee68.png

$a = $GET['a'];$b = $_GET['b'];if($a != $b && md5($a) == md5($b)){// wow, glzjin wants a girl friend.

62435325f73de3d49547a932fb402390.png

知识补充

md5( string $str [, bool $raw_output = false ] ) : string

计算字符串的 MD5 散列值,md5函数告诉我们我们传入的参数应该是string类型的,但如果我们传入一个数组,它不会报错,也不会解析其值,导致两个数组的中无论什么值MD5都相同(出同样的错误是不是也是一样的呢)。

f7de419d423955ab72116042883b78c9.png

然后我们便可以传入两个数组来进行绕过了。

0a0f733446886f7b5f8c38d2a877dc9c.png

到了第三关,便和第二关大同小异了。

如果我们遇到强制类型转换比如再传参的参数前面有一个(string)类型转换,那怎么办,那边要用的MD5强碰撞了(记得以前看过一个cissp的题目讲的也是碰撞出MD5,也解释MD5的不安全性)。

这里我们大多可能要用一下工具(fastcoll)

讲完了MD5我们再将另一个,sha(题目来自于bugku,web29各种绕过)。

8514258c3ba421c33f53ea9789528fb0.png

977d7f60f60ab8012413f517324de438.png

知识补充

sha1( string $str [, bool $raw_output = false ] ) : string

——计算字符串的 sha1 散列值,测试sha1()函数和md5()函数"殊途同归"。

adcf5a374e63ad2d18ced66abfe25ae4.png

这里还有很多可以利用的函数,比如 json_decode() {传入json形式的数据,类Python中的字典},不可否认的是任何函数的绕过都需要相关的逻辑判断。

{json_decode()把接送格式的字符串解码成了数组,而通过相应的逻辑判断我们便可的绕过}

795c2d79b4d029fb7fd516171301c919.png

下面我们会介绍与弱类型相呼应的php函数。

8208ce1c0ffa3e56783493182fb57a52.png

310862ed9565c2f51e370caa2d502412.png

c8546eeb898b58e8a7d94290f932185a.png

unserialize函数问题

3f16a855b87631cff2e34adf4868b86c.png

知识补充

对单一的已序列化的变量进行操作,将其转换回 PHP 的值。

cfdca77890e881bea4e4ae672091ca43.png

key和value是我们可以通过POST数据传入的值,我们把它传入bool值,unserialize函数解析为了数组,下面又因为使用的是 ==,根据php弱类型,bool值跟任何字符串都相等。

故判断成立输出了OK。

ae61d0659402cd15fe455f59beafd10b.png

31d8eceb713a860db39188fd444a6466.png

da146d1df4c67033771cbfd90aff262d.png

strpos函数问题

5dbbf9805eb17859e73329710bb07b24.png

知识补充

strpos ( string $haystack , mixed $needle [, int $offset = 0 ] ) : int

返回 needle 在 haystack 中首次出现的数字位置。

d335cb8a966d7935d6f24c8b6be51145.png

问题的出现依然是出现了0=="admin"的弱类型比较的问题。

bd0a4be32f7442621be173b5b022be01.png

ea00717db82a1b8eba41d11752e463bf.png

02aed59783da2cbd2d57ee28a239fda9.png

php中的哲学问题

90ce77917640fbafd831545b6dcf3d57.png

(代码中还有哲学问题?)

bcf99b83b2094cfb45fbde9e5d0653b2.png

因为以前老师问过我们这个问题,为什么呢,用一句模糊的话来说"无限接近就是相等"。

bfd8e8c154a5995d05511a69c412827d.png

4edfa6001d1d6ba49415a52848c3468d.png

94e64d124065de5e1955d19c055df09e.png

in_array()函数问题

2d2727f8299c4b1e933bc3459f8900b6.png

知识补充

in_array( mixed $needle , array $haystack [, bool $strict = false ] ) : bool

— 检查数组中是否存在某个值,若第三个参数strict为默认的false,则使用松散比较。

fa12aa9fb0879f04a0a43e8b7bfdae7c.png

这是便我们尝试对比的结果了。

相关题目(php审计题目):

9cdfc9ad6ed62cbe04eca0230be8212e.png

首先我们发现in_array()并没有使用第三个参数,所以为默认值,可以进行松散比较。我们只要再*.php前面加上一个在range(1,24),比如23a.php。

f2e1968a22240d4a741d9413344c9fac.png

c8b790466b6786e79286d7c37d9fed5a.png

ac5d3626b445368071c33c117493bb92.png

array_search()问题

array_search ( mixed $needle , array $haystack [, bool $strict = false ] ) : mixed

— 在数组中搜索给定的值,如果成功则返回首个相应的键名,与in_array()函数类似。

93ba92e1c238cf22150d89c91b460dcc.png

ced16de800ecc59777cadc4a501f9e6e.png

34f6492911aba10e4e234a54f7e95735.png

516fd87523e5eeae9b4852ee20f9c354.png

strcmp()函数问题

ebb406b9520b232b82bcd58382c96df1.png

知识补充

比较两个字符串(区分大小写)

strcmp(string1,string2)

3ed53c878a13b5e7eca4647a945516aa.png

返回值:

• 0 - 如果两个字符串相等

• <0 - 如果 string1 小于 string2

• >0 - 如果 string1 大于 string2

测试缺陷的方法和MD5函数类似,我们不给予这个函数string类型,而是给它array类型的值。

bdf19bed1a1361c6184377dd649f2e5e.png

发现它依然是给出警告,但依然判断为ture,打印出了ok。(题目来自南京邮电大学网络攻防训练平台-pass check)

<?php $pass1=***********;//被隐藏起来的密码if(isset($pass)){if(@!strcmp($pass,$pass1)){echo "flag:nctf{*}";}else{echo "the pass is wrong!";}}else{echo "please input pass!";}?>/*wp:<?php $k[]=1;var_dump(!strcmp($k, "flag"));printf("n");?>*/

b644c4e5904f368ea4305373babcfd22.png

dc462c1f73e7db39ab227cb463784673.png

25e29ca9b525e84824d1321df03cb06f.png

121fff3dee249aa4fb85e4b2af61d40b.png

switch相关的问题

如果switch的case是数字类型的判断的时候。switch会将参数转换为int类型。

7b0116e633964e58a35aad90b213b37e.png

4ddc85886829719a35070b1452cda96b.png

不要慌张,继续加油哈。

end

本文始发于微信公众号(雷石安全实验室):php弱类型比较(松散比较)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值