CTF通关录-fakebook
打开题目
两个选项,给我感觉可能就是对注入的利用:
先试试login
这里用sqlmap跑一下:无果
再试试join
这里注册一般都是往数据库插入数据,这种无回显的判断注入,一般都是用时间注入
构建语句:测试了一下时间注入
db.php文件报错了,这里我不想去摸清他的sql语句,因为一旦语句正确,就会为你注册一个账号,又得重新起题目环境,很麻烦
注册一个账号试试
把御剑放在后台跑后台路径
然后点开了刚注册的账号:
又看到熟悉的注入点了
还好,没狗,不然祭出打狗棍法伺候!
存在注入数字型注入点:
直接手工爆库和字段:
漂亮!!!你不这样我拿flag还怪不好意思的,测试了一下,过滤了关键字 union select,尝试内联查询绕过:
成了鸭!,后面就是一顿操作了,查看了当前数据库的用户
root用户,爆出了物理路经,nice鸭,可能有读写文件权利哟
后面查看了有多少个数据库
这个test数据库?被黑了?算了,我是来拿flag的
查看了当前数据库存在哪些表:
看一下user表中的字段
这里存放着就是我刚才注册的账号
都看了一遍,data这个字段有点特殊,这里回顾上面还好没有继续探寻插入语句结构
把我刚才注册的账号信息进行了序列化,那么就可以猜测一定有一个用户类,但注册一名用户时,改类就实例化,传入用户信息数据,序列化实例对象,存入数据库!
但是这里并没有flag的信息!
这里我尝试写入webshell
漂亮!!!,没有写的权利
还好可以读!不过线索断掉了,就那么几个文件,看着也无法利用,打开御剑看看结果
flag.php,user.php 这个文件返回的状态码200
读取flag文件
flag到手,但还有个user.php,我想看看里面都有啥
好家伙果然有Userinfo这个类
简单代码审计了一下
看一下关键性代码
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
curl_setopt($ch, CURLOPT_URL, $url);//设置要抓取的网页
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//设置模式,保存进字符串,还是输出到屏幕,返回原生的(RAW)输出
$output = curl_exec($ch);//开始执行curl
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);//获取最后一次传输的相关信息。
if($httpCode == 404) {
return 404;
}
curl_close($ch);//关闭curl
return $output;
}
public function getBlogContents ()
{
return $this->get($this->blog);
}
public function isValidBlog ()//检查blog地址是否为标准形式
{
$blog = $this->blog;
return preg_match("/^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/i", $blog);
}
}
这里的关键点在于get()没有进行任何过滤,我既可以从远程加载网页进来,也可以加载本地文件,有点类似于远程文件包含,和本地文件包含,这里远程加载文件无法利用,因为curl只会抓取数据,并不会执行里面的代码
但是加载本地文件就有用了,我们已经知道flag物理路径!
因为看到了unserialize error,再结合刚才查询的data是一串序列化字符串,
可以想到代码执行逻辑,这里查询语句从数据库拿出序列化字符串,然后再进行反序列化,再输出到屏幕。
就可以利用一下反序列漏洞:
生成反序列化字符串:
‘O:8:“UserInfo”:3:{s:4:“name”;s:1:“1”;s:3:“age”;i:1;s:4:“blog”;s:29:“file:///var/www/html/flag.php”;}’
这里还用到了file://协议,标准本地文件读取
通过查询语句,把反序列化字符串送去反序列化,然后这个字符串就会利用类中的get()方法,就会加载"file:///var/www/html/flag.php"文件里的内容,这样flag就出来了
完美!!!
OK,顺利拿到flag
舒服了,总结一下,信息收集很重要,在漏洞利用中可以打组合拳,这里就的就是ssrf读取本地文件,这里还是好气啊,root居然没有写文件的权利,要是拿个shell
就更好了!