漏洞概述
在CmsEasy7.6.3.2版本中,存在订单金额任意修改逻辑漏洞,攻击者利用业务逻辑层的应用安全问题,在提交订单时抓取数据包并修改,以及对订单的数量进行任意修改(打到资本家!)。此漏洞可能造成企业的资产损失和名誉受损,传统的安全防御设备和措施收效甚微,危害还是比较大的捏。
观察源码
进入靶场发现直接给了源码:
<?php
highlight_file('index.php');
extract($_GET);
error_reporting(0);
function String2Array($data)
{
if($data == '') return array();
@eval("\$array = $data;");
return $array;
}
if(is_array($attrid) && is_array($attrvalue))
{
$attrstr .= 'array(';
$attrids = count($attrid);
for($i=0; $i<$attrids; $i++)
{
$attrstr .= '"'.intval($attrid[$i]).'"=>'.'"'.$attrvalue[$i].'"';
if($i < $attrids-1)
{
$attrstr .= ',';
}
}
$attrstr .= ');';
}
String2Array($attrstr);
分组密码的模式
分组密码与流密码
密码算法可以分为分组密码和流密码两种。
分组密码(block cipher)是每次只能处理特定长度的一块数据的一类密码算法,这里的“一块”就称为分组(block)。此外,一个分组的比特数就称为分组长度(block length)。
例如,DES 和三重 DES 的分组长度都是64比特。这些密码算法一次只能加密 64 比特的明文,并生成64比特的密文。AES 的分组长度可以从128 比特、192比特和256比特中进行选择。当选择 128 比特的分组长度时,AES一次可加密 128 比特的明文,并生成 128 比特的密文。
流密码(streamcipher)是对数据流进行连续处理的一类密码算法。流密码中一般以1比特、8比特或32比特等为单位进行加密和解密。
分组密码处理完一个分组就结束了,因此不需要通过内部状态来记录加密的进度;相对地,流密码是对一串数据流进行连续处理,因此需要保持内部状态。
什么是模式
分组密码算法只能加密周定长度的分组,但是我们需要加密的明文长度可能会超过分组密码的分组长度,这时就需要对分组密码算法进行迭代,以便将一段很长的明文全部加密。而迭代的方法就称为分组密码的模式 (mode)。说人话就是对分组密码加密的方式。在学习之前,我觉得大部分都会认为:如果明文很长的话,将明文分割成若干个分组再逐个加密不就好了吗?因为我自己就是这么认为的QAQ。事实上可没有那么简单。将明文分割成多个分组并逐个加密的方法称为 ECB模式,这种模式具有很大的弱点(后续介绍)。如果在编写加密软件使用 ECB 模式,会在不经意间产生安全漏洞,所以千万不能使用 ECB模式。
模式有很多种类,分组密码的主要模式有以下5种:
ECB模式:Electronic CodeBook mode(电子密码本模式)
CBC模式:Cipher Block Chaining mode(密码分组链接模式)
CFB模式:Cipher FeedBack mode(密文反馈模式)
OFB模式:Output FeedBack mode(输出反馈模式)
CTR模式:CounTeR mode(计数器模式)