本篇为2019年DDCTF部分Web的write up,整体来说,能做的都算是中等难度,就是有些耗时间,其次就是思路的问题了,为了避免太长所以我分两篇来写,不喜勿喷,喷了我也不会理
打开题目,看到页面有图片,打开源代码看一下
网站前端做了这么一个操作,将图片内容直接以base64的方式写在了HTML文件中,这样的好处是节省HTTP流量,得出结论,这一处可以将其他文件一并包含出来
那么,网页通过GET的方式传入JPG参数的值,最后将文件内容包含出来,所以尝试逆向写一个别的文件名,先解密
Base64解码两次后,16进制转字符串可得出flag.jpg
第一次base64解码
第二次base64解码
第三次16进制转字
这里的步骤是 base64->base64->16进制转字符 所以反着来编码的操作是 字符串转16进制->base64->base64即可,通过这个操作后得到index.php的base64编码,传入给jpg这个参数
得到index.php的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?
*
*/
?>
最坑的部分来了,在第三行中,有一篇文章地址,点击进去后
没有任何内容,这里进作者的主页
在倒数第三篇文章中看到一个vim 异常退出 swp的文章,点进去后,看到一个文件名 practice.txt.swp
在网页中直接访问,获得提示
告诉你了当前目录下还有一个flag!ddctf.php的文件,所以我们利用上面的方法,将这个Php的内容包含出来 这里要注意一下,在index.php中,有一个过滤
$file = hex2bin(base64_decode(base64_decode($_GET['jpg'])));
$file = preg_replace("/[^a-zA-Z0-9.]+/","", $file);
echo $file.'</br>';
$file = str_replace("config","!", $file);
echo $file.'</br>';
这里代码的操作是 首先先二次解码base后16进制转字符串得到文件名,接着$file这个函数就是文件名了 到第二步,他会用pregreplace来正则匹配所有的字符串,但不包括符号,所以!到这一步就没了,我们从上面可以看到文件名是含有感叹号的,那么怎么办呢,不着急 第三步的操作是,用strreplace()这个函数来进行替换,将config替换为!,这样一来感叹号就又回来了,所以构造的时候,把config当成感叹号来写就好了 你可以这么写
Flag!configddctf.php
也可以
Flagconfigddctf.php
最后得到base64后,传入,打开源代码后解码就可以看到php的源代码了
<?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';
}
}
?>
这里就是典型的变量覆盖了,给这个php传入两个参数,uid和k,并且内容都会空,这样Php就会把这两个函数都覆盖掉为空,就符合if的条件了
一言不合把我ban了,那我只能说祝DDCTF你越办越好