某shop 前台文件遍历&SSRF组合拳

isnull   ·   发表于 2019-05-19 11:09:55   ·   漏洞文章

0x01 前言

TPshop是国内应用范围大、覆盖面广的电商软件产品,基于此,历经5年的时间,而发展成为国内先进的具备成熟且标准化的电商平台技术解决方案提供商。“TPshop” 的每一次新产品发布都引带头中国电商软件研发领域的潮流,持续为中国电子商务服务行业。同时公司建立了由多名科学家构成的行业及技术研究中心,对电商行业发展趋势、软件产品架构、技术性、新技术应用与创新等都做出了卓越贡献。

代码来源:

http://www.tp-shop.cn/download/

0x02 分析

前台文件遍历

定位到/application/home/controller/Uploadify.php中的fileList方法



流程分析:

79 Line: 将用户传入的type赋值给变量$type
80~86 Line: 将变量$type带入swtch语句中,也就是设置获取文件的后缀是啥,这里随便输入一个就可以了
88 Line: 将cookie中的user_id、以及用户传入的path拼接到路径字符串中并赋值给$path
89 Line: 定义变量$listSize并将100000赋值给变量
90 Line: 定义变量$key并将get传入的key的值赋值给变量
93 Line: 定义变量$size并赋值
94 Line: 定义变量$start并赋值
95 Line: 定义变量$end并将$start + $size的值赋值给变量
98 Line: 将变量$path, $allowFiles, $key传入方法getfiles中

getfiles方法:


可以看到getfiles方法中并未进行任何过滤,注意142行的正则即可。

漏洞利用:

直接访问:

http://127.0.0.1/index.php/home/Uploadify/fileList?type=a&path=../../../application


前台SSRF

跟踪到/application/home/controller/index.php中的qr_code方法




(嘤嘤嘤~,一张图截不完,难受)

流程分析:

111~112 Line: 定义变量并将$_GET[‘data’]赋值给$url,并将$url解码赋值给自身
113~115 Line: 分别将get传入的参数head_pic、back_img、valid_date的值分别赋值给$head_pic、$back_img、$valid_date
117 Line: 定义图片存储目录
118~120 Line: 判断图片存储目录是否存在,不存在则创建
123 Line: 定义生成的二维码文件的名称
124 Line: 生成二维码并存储到目录
127~129 Line: 为二维码生成水印
132~137 Line: 为二维码添加背景图片
140 Line: 判断$head_pic是否为真,若为真则进入if中的代码块
142 Line: 判断http的位置是否在$head_pic中为0
144~154 Line: 将$head_pic中的url使用curl请求并存储到本地文件中。

$head_pic中的url使用curl请求并存储到本地文件中这里就造成了ssrf漏洞。

漏洞利用:

找台服务器配合一下,使用nc监听一下,命令如下:

nc -vv -l -p 2020



组合利用

http://127.0.0.1//index.php/home/Uploadify/fileList?type=a&path=../../upload/qr_code



先记录一下它原本存在的文件,访问:

http://127.0.0.1//index.php/home/index/qr_code?data=http://www.baidu.com&head_pic=http://127.0.0.1


报错不影响,遍历一下目录:



仔细看会发现较第一次多了个文件,访问看看:

view-source:http://127.0.0.1/public//upload/qr_code/15573123719552.png



Get it

比较难受的是个限制:

if (strpos($head_pic, 'http') === 0) {
    //下载头像
    $ch = curl_init();
    curl_setopt($ch,CURLOPT_URL, $head_pic); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    $file_content = curl_exec($ch);
    curl_close($ch);
    //保存头像
    if ($file_content) {
        $head_pic_path = $qr_code_path.time().rand(1, 10000).'.png';
        file_put_contents($head_pic_path, $file_content);
        $head_pic = $head_pic_path;
    }

无法使用其他协议进一步利用。


转自先知社区

打赏我,让我更有动力~

0 条回复   |  直到 2019-5-19 | 1467 次浏览
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.