OWASP 2023 TOP10 A8 软件和数据完整性失败

Posted by DDW on 08-06,2022

一、什么是软件和数据完整性失败

软件和数据完整性故障与不能防止完整性违规的代码和基础设施有关。一个例子是应用程序依赖来自不受信任的来源、储存库和内容交付网络的插件、库或模块。不安全的CI/CD管道可能会导致未经授权的访问、恶意代码或系统受损。最后,许多应用程序现在包括自动更新功能,其中更新在没有成分验证完整性的情况下被下载并应用于以前一个受信任的应用程序。攻击者可能会上传自己的更新以分发并在所有安装上运行。另一个例子是对象或数据被编码或序列化为攻击者可以看到和修改的结构,容易收到不安全的反序列化。

二、如何防范

  • 使用数据签名或者类似机制来验证软件或数据来自预期来源且并未被更改
  • 确保使用安全工具验证组件不包含已知漏洞
  • 确保未签名或未加密的序列化数据不会在没有检查或数字签名的情况下发送到不被信任的客户端
  • 例如每个从网上下载的数据都存在一个哈希值,下载完之后,验证文件的哈希值看是否与原哈希值相同。

三、反序列化

就以 PHP 为例吧,实际上大部分面向对象语言的序列化思路也是如此。
序列化,说简单点就是把对象变成可以传输的字符串。
下面是一段 PHP 代码,可以达到简单的序列化。

class Demo{
    public $test="Hello,World!"
}
$s=new Demo();
$se=serialize($s);
print_r($se)

序列化:O:4:“Demo”:1:{s:4:“test”;s:12:“Hello,World!”;
序列化从左到右的意思:

O:代表object
4:是对象名称长度
Demo:对象名称
1:代表对象里面有一个变量
s:数据类型
4:变量名称长度
test:变量名称
s:数据类型
12:变量长度
Hello,World!:变量值

那么反序列化,就是把这个语句从序列化变成一个可以交互执行的对象

class Demo{
    public $test="Hello,World!"
}


$classtest = 'O:4:"Demo":1:{s:4:"test";s:12:"Hello,World!";'

$unclasstest = unserialize($classtest);