【愚公系列】2024年08月 《CTF实战:从入门到提升》 007-Web安全入门(PHP的弱类型特性)
🏆 作者简介,愚公搬代码
🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,51CTO博客专家等。
🏆《近期荣誉》:2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏
🚀前言
PHP的弱类型特性是指在PHP中,变量的数据类型可以根据上下文的需要而自动转换。换句话说,PHP不会严格要求变量在声明时就明确指定数据类型,而是根据需要自动转换数据类型。
这意味着,一个变量在不同的上下文中可以被当作不同的数据类型使用,而不会造成语法错误。例如,一个变量可以同时保存一个整数、一个字符串或一个数组。
弱类型特性的优点是使得编码变得更加灵活,简化了开发过程。但同时也可能导致一些不期望的结果,因为数据类型的自动转换可能引发意想不到的错误。因此,在使用PHP的弱类型特性时需要特别注意数据类型的转换和处理。
🚀一、PHP的弱类型特性
🔎1.什么是强类型与弱类型
强类型和弱类型是指编程语言的类型系统中的两种不同的类型约束方式。
强类型语言在变量使用前要明确定义其类型,并且不允许隐式地将一个类型转换为另一个类型。在强类型语言中,每个变量都有一个明确的类型,并且变量的类型在编译时就已经确定了。这种类型约束可以在编程过程中检测出类型错误,增加了代码的稳定性和安全性。常见的强类型语言有Java、C++和C#等。
弱类型语言在变量使用前不需要明确定义其类型,变量的类型可以隐式地根据赋值的数据类型来确定。弱类型语言允许变量的类型在运行时动态改变,也可以将一个类型隐式地转换为另一个类型。这种类型约束方式给了程序员更大的灵活性,但也增加了代码的复杂性和错误的可能性。常见的弱类型语言有JavaScript和PHP等。
例如下面这个例子:尝试让一个字符串’1’直接和数字1相加
当强类型语言(Python、Java等)遇到这个问题时会直接报错,如图所示
接下来仔细考虑一下为什么会报错呢?原因是字符串的1和数字类型的1相加时,这两者不是相同的数据类型,所以无法进行计算。
当弱类型语言(PHP、JavaScript等)遇到这类问题时,就会“随机应变”自动转换数据类型,以PHP为例,当字符串1和数字1要进行相加时因为它们不是同一类型,势必要对其中一个值进行类型转换,如果是运算,PHP会把所有数据都转换成整型如’1’→1、'1test→1、‘test’-0,全部转换成整型后再进行相加,如图所示
如果是拼接操作,PHP会把所有类型都转换成Str类型,然后进行字符串拼接,如图所示
🔎2.弱类型漏洞产生原理
先来思考这样一个问题,'admin’和0在某些情况下是否会相等?在上一节讲解了PHP会自动进行类型转换,涉及的都是拼接之类的操作,那么如果是两者比较,又会进行怎样的类型转换?看下面这个程序:
由于使用的是两个等于号,所进行的判断是弱类型判断,只比较值,不比较类型,所以它首先会把admin转换成整型,但又因转换失败结果为0,这时就会比较成功从而返回True。
在上面这个转换中,1test转换成整型,由于字符串开头有个1,是可以被转换成整型1的,而test不能被转换于是舍弃,所以1test被转换为1。至此,比较成功返回True。
总结一下,一共有如下几种情况。
- 如果能转换成另一个比较的类型则进行转换,如’1test’和1比较,'1test’转换成整型。
- 如果是相同类型,并且都能转换成同一类型则进行转换,如’1’和’01’比较,都能转换成整型,那就全部转换为整型然后比较,最后就是1==01。
- 如果是相同类型,但不能转换成同一类型,如’a’和’1a’,两者不能同时转换成整型,只能都当作字符串来比较。
🔎3.MD5、HASH相关漏洞利用
<?php
if (md5($_GET['a'])==md5($_GET['b'])){
echo $flag;
}
这段代码的大意就是要输入两个然后对其进行MD5加密,之后用值,(弱类型)去比较,如果两者“相等”则输出flag。
这就是典型的弱类型比较,只需要将两个符合如下条件的值输入即可。
1)MD5(值)计算后结果开头是0e。0e开头是让PHP把这段字符串认为是科学计数法字符串的先决条件。
2)0e后面全是数字。例如:0e123=-0e234,0的N次方始终是0,所以弱类型比较可以相等。
回到开始的问题上,满足这两个条件(MD5后结果开头为0e,且后面全部是数字)的字符串如下:
DNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a
md5(md5())后满足这两个条件的字符串也需要了解:
bDLytmyGm2xQyaLNhWn
770hQgrBOjrcqftrlaZk
7r41GXCH2Ksu2JNT3BYM
还需要了解MD4、SHA1中符合这两个条件(哈希计算后后结果开头为0e,且后面全部是数字)的字符串。
MD4符合这两个条件的字符串如下:
0e251288019
SHA1符合这两个条件的字符串:
aa30FF9m
aаO8zKZF
aaroZmOk
aaK1STfY
🚀感谢:给读者的一封信
亲爱的读者,
我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。
如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。
我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。
如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。
再次感谢您的阅读和支持!
最诚挚的问候, “愚公搬代码”
- 点赞
- 收藏
- 关注作者
评论(0)