———————————————特别说明————————————-
#本文只是对异或算法的科普文 逆向dede漏洞的原作者不是我
#我就是抱在大牛的大腿上的那个人- –
#研究对称算法的时候 对异或加密产生了X欲
#@phithon牛说,要多发帖在90sec
#老大说的话怎么能不听? 所以我来了 在此感谢phithon一直耐心的帮助
#刚刚高考完 高中闭关结束 I AM BACK~
科普文 帮助新手对算法的理解吧
———————————————-我是分割线————————–
异或加密是web应用中十分流行的加密算法。
通过将可信任(已安全过滤)的用户数据和加密key用算法加密,生成字符串再来传递以执行sql操作,但是这种算法极其不安全!
因为 在异或算法里面
A^K=E
E^A=K
有了A和E(加密前后的字符串)就等获得k
一旦我们知道了key 就能本地构造那个字符串(evilcode)进行攻击!
今天 我们研究DedeCMS(buy_action.php)
这是个简单的异或算法
0×01流程分析
string[0]^key[0] 然后是string[1]^key[1] 将他们添加到$code尾部
。。。如此循环
这时会有两种情况
case one
$key长度(18)<=$string长度
那么当$k=$i=17 就取尽了$key
下一次执行会变成$i=18 $k=0
也就是说 重新开始一遍位运算 示意图如下
key | i a m a k e y i m
string | i a m a s r i n g
等于key被重复了多次直到string被完全加密!
case two
$key长度(18)>$string长度
那么当$k=$i= strlen($string) -1就取尽了$string
下一次执行会直接跳出 也就是说 此时的key都没完整进入$code
示意图如下
key | i a m a k (e y )
string | i a m a s
红色表示没能进入$code部分
现在分析完了算法 我们就能够来思考如何注入到key了
0×02 利用思路
现在我们要得到key 当然是要完整的
所以是选择case one
所以思路应该是
也就是构造一个string>=18
然后在受害web上构造string 并且获得$code
再到本地$string^$code 就能得到 $key的…md5 破解得到密匙 就能构造$pr_verify骗取验证进入此支($pr_verify=md5(“payment”.$pr_encode.$cfg_cookie_encode);)
通过变量覆盖进行GLOBALS[cfg_dbprefix]覆盖注入
接下来看图看代码
我们先看看$string(代码中的$pr_encode)是如何获取的
$pr_encode = ”;
foreach($_REQUEST as $key => $val)
{
$pr_encode .= $pr_encode ? “&$key=$val” : “$key=$val”;
}
$pr_encode = str_replace(‘=’, ”, mchStrCode($pr_encode));
$pr_verify = md5(“payment”.$pr_encode.$cfg_cookie_encode);
$tpl = new DedeTemplate();
$tpl->LoadTemplate(DEDEMEMBER.’/templets/buy_action_payment.htm’);
$tpl->Display();
知道了获取办法 让我们控制它吧
此处的$string=product=card&pid=1.$_COOKIES (因为$_REQUEST获取参数是从$_GET->$_POST->$_COOKIE依次获取)
所以加密得到的$code(也就是$pd_encode) 包含了post和cookies全部内容如图
也就是符合$string>=$key
所以我们直接取post的巧合18位 进行破解 后面的其实不用管 要不然得到的key由于case one的不同重复
就是真正key的一遍遍重复
这样我们就得到了MD5形式的key 不过是18位 去掉最后两位开始跑吧
后来的故事就是变量覆盖 不在算法讨论之类
0×03 异或算法真的美吗?
简单异或算法实际上并不复杂,因为它并不比维吉尼亚密码多什么东西。它之所以被包括在这本书中,是因为它在商业软件包中很流行,至少在MS-DOS和Macintosh世界中是这样[1502,1387]。不幸的是,如果一个软件保密程序宣称它有一个“专有”加密算法(该算法比DES更快) —应用密码学
确实 异或算法轻巧 采用位运算 在速度方面有十分大的优势
但是轻巧简单却带来了弱逻辑,所以更应该小心使用 比如对$key的复杂程度 应该有更苛刻的要求
否则会让safe_code变成evil_code
0×04 异或算法魅力依旧
那么怎么样的异或才是安全简便的? 我们看看齐博cms的这个吧
优点有两个
一, 绝密字串有三部分 两部分可控 $webdb[mymd5].$rand.’5*j,.^&;?.%#@!’ 复杂程度令人发指
二,引入MD5code 把传入参数加入到key里面 $md5code=substr($string,-10); $key = md5($md5code.$secret_string);
使得key无比复杂
两次加盐加酱油的MD5
一定时间内
基本不可破解了
所以嘛 异或用得好,其实是强算法,不过前提是保证key安全
【via@90sec小飞】
Copyright © hongdaChiaki. All Rights Reserved. 鸿大千秋 版权所有
联系方式:
地址: 深圳市南山区招商街道沿山社区沿山路43号创业壹号大楼A栋107室
邮箱:service@hongdaqianqiu.com
备案号:粤ICP备15078875号