欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

一道DDCTF题–滴~

程序员文章站 2022-03-04 19:41:28
...

一道DDCTF题–滴~

这道题涉及到常见的编解码、变量覆盖、过滤等知识点,接下来看题。

01.实战

题目地址:http://117.51.150.246

打开网页显示如下:

一道DDCTF题–滴~

可以看到jpg参数是一串字符串,而且提到了base64,

1.试图对其解密得到:

NjY2QzYxNjcyRTZBNzA2Nw==

2.发现还是base64的内容,再次解密得到:

666C61672E6A7067

3.看这串数字和字母的组合字符串,像是十六进制数,试着用十六进制解密得到:

flag.jpg

4.通过一系列操作得到了flag.jpg,那么我们可以联想到,通过修改jpg参数的内容来获取想要的内容,这就是本地文件泄露。

然后我们逆序对index.php经过十六进制加密,两次base64加密,让jpg=加密后的内容。传入jpg参数,得到:

一道DDCTF题–滴~

显然,我们可以尝试把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?
 *
 */

?>

得到这样一段代码后,看到注释里有一个博客地址,打开看一下:

一道DDCTF题–滴~

感觉没什么关系,再回过来看看注释,发现还有一个日期的注释,于是顺着线索找到了下面这篇文章:

一道DDCTF题–滴~

文章讲的是swp文件泄露,那到底应该去找哪一个swp文件呢?应该博客里有提到,于是试一试博客里说到的.practice.txt.swp,果然得到了

一道DDCTF题–滴~

这个flag!ddctf.php里面应该有我们想要的,但是不能直接在地址栏里输入这个文件名字,因为代码里提到有正则的存在,过滤掉了!,但是另一条str_replace语句提示,config和!之间有替换关系,所以最终构造的应该是f1agconfigddctf.php的三次编码后的值,最后传入jpg参数,得到:

一道DDCTF题–滴~

和上面相同的思路再来一遍,得到:

<?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了

一道DDCTF题–滴~

还有一种就是变量覆盖+php伪协议,?k=php://input&uid=1 post数据传1

一道DDCTF题–滴~

02总结

这道题偏脑洞,但是套路还是在其它的ctf题里见过,可以多练练,干巴爹!

相关标签: ctf