网络安全常见漏洞篇
反序列化漏洞
反序列化漏洞(Deserialization Vulnerability)是一种安全漏洞,存在于应用程序中对数据进行反序列化操作的过程中。当应用程序接收到外部传递的恶意序列化数据并进行反序列化时,攻击者可以利用这个漏洞执行未经授权的代码或导致应用程序受到攻击。
01
反序列化漏洞原理
要了解反序列化漏洞,首先我们得知道什么是序列化和反序列化,简单来说序列化:就是将对象转化为字符串进行存储;反序列化:就是将字符串转化为对象;反序列化漏洞:就是在反序列化过程中,如果恶意者可以对将要转换的字符串进行操控,从而达到任意代码执行的操作,就是反序列化漏洞。
反序列化漏洞的主要原理是应用程序在反序列化过程中没有对传入的数据进行足够的验证和过滤,导致攻击者可以利用构造的恶意序列化数据来执行任意代码或远程代码执行攻击。
一般情况下,应用程序在接受到序列化数据后会使用反序列化操作将数据还原成对象。反序列化操作通常涉及到解析输入流,创建对象实例,读取对象属性等操作,在这个过程中,应用程序需要根据序列化的格式和规范来还原对象的状态。而攻击者可以通过构造特定的序列化数据来利用应用程序中的反序列化操作,从而实现代码注入和执行。
例如,攻击者可以构造恶意的Java序列化数据,其中包含可执行的Java代码,当应用程序使用反序列化操作将该数据还原成对象时,就会执行其中的恶意代码,造成安全威胁。
为了利用反序列化漏洞,攻击者需要了解目标应用程序所使用的序列化库和协议,以及应用程序如何处理序列化数据。攻击者可以通过手动构造序列化数据或利用已有的工具来生成恶意序列化数据。
02
反序列化漏洞简单案例
以下以pikachu靶场中一个简单的反序列化漏洞案例来说明:
序列化serialize()
序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象:
class S{` `public $test="pikachu";``}`` ``$s=new S(); //创建一个对象`` ``serialize($s); //把这个对象进行序列化`` ``序列化后得到的结果是这个样子的:O:1:"S":1:{s:4:"test";s:7:"pikachu";}` `O:代表object` `1:表示该对象的类名的字节数(即类名长度为1)` `S:对象的名称` `1:表示该对象有 1 个属性。` `s:数据类型` `4:变量名称的长度` `test:变量名称` `s:数据类型` `7:变量值的长度` `pikachu:变量值
反序列化unserialize()
就是把被序列化的字符串还原为对象,然后在接下来的代码中继续使用。
$u=unserialize("O:1:"S":1:{s:4:"test";s:7:"pikachu";}");`` ``echo $u->test; //得到的结果为pikachu
序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题。
pikachu内反序列化漏洞靶场页面如下:
当我们输入序列化数据
O:1:"S":1:{s:4:"test";s:7:"pikachu";}
此时反序列化函数将输入的序列化数据还原为了对象。
如果攻击者在此输入页面中输入恶意代码,则会被该反序列化函数还原为对象,进行执行。
如结合XSS漏洞,在该输入框内输入:
O:1:"S":1:{s:4:"test";s:30:"<script>alert('haha')</script>";}
则会弹出XSS攻击页面
03
反序列化漏洞的危害
黑客通常会利用反序列化漏洞来执行远程代码执行攻击或实现任意代码执行。反序列化漏洞的危害包括但不限于:
-
执行任意代码:攻击者可以利用反序列化漏洞来注入恶意代码,从而执行任意操作,比如篡改数据、窃取敏感信息等。
-
拒绝服务攻击:攻击者可以构造大量的恶意序列化数据,来消耗程序的资源,使其无法正常运行。
-
身份伪造:攻击者可以篡改序列化数据,以伪造身份,来绕过认证机制。
-
数据泄露:攻击者可以通过注入恶意代码来窃取程序中存储的敏感信息,比如用户凭证、密码等。
04
反序列化漏洞的防范策略
常见的反序列化漏洞函数通常是应用程序中用于反序列化操作的函数或方法。由于不同的编程语言和框架在序列化和反序列化方面有各自的特点,因此反序列化漏洞函数也会有所不同。以下是一些常见的反序列化漏洞函数:
Java 中的 ObjectInputStream.readObject():ObjectInputStream 类的 readObject() 方法用于将序列化的对象数据还原成实际的对象实例。如果未对传入的序列化数据进行充分验证和过滤,攻击者可以构造恶意的序列化数据来执行任意代码。
PHP 中的 unserialize():PHP 中的 unserialize() 函数用于将序列化的字符串转换为 PHP 变量。如果应用程序在接收用户输入后直接使用 unserialize() 函数进行反序列化操作,而没有对输入进行严格的验证和过滤,就可能存在反序列化漏洞。
.NET 中的 BinaryFormatter.Deserialize():在.NET Framework 中,BinaryFormatter 类的 Deserialize() 方法用于将二进制数据反序列化为对象。如果应用程序在使用 BinaryFormatter 进行反序列化时没有实施有效的安全措施,就可能受到反序列化攻击。
为了防止反序列化漏洞的利用,可以采取以下措施:
输入验证和过滤:对于外部传入的序列化数据,应该进行严格的输入验证和过滤,确保数据的来源可信和完整。
应用程序安全配置:在应用程序的安全配置中,禁用或限制不必要的反序列化操作,只允许从受信任的源进行反序列化。
使用安全的序列化库:选择使用安全性较高的序列化库,这些库通常提供了更多的安全特性和保护机制。
持续更新和修补:及时更新和修补应用程序中使用的序列化库,以确保已知的反序列化漏洞得到修复。
检测和监控:实施日志记录和监控机制,及时检测和响应可能的反序列化攻击。
题外话
黑客&网络安全如何学习
今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。
1.学习路线图
攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。
2.视频教程
网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。
内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。
(都打包成一块的了,不能一一展开,总共300多集)
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源
3.技术文档和电子书
技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源
4.工具包、面试题和源码
“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。
还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。
🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源
最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。
这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。
参考解析:深信服官网、奇安信官网、Freebuf、csdn等
内容特点:条理清晰,含图像化表示更加易懂。
内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。