zoey

谷歌浏览器可正常显示图片

0%

第四届海啸杯wp(部分)

web

web1

首先要使$login=true,想到的是md5弱类型比较,查看str_shuffle函数的用法,是随机地打乱字符串中的所有字符。如果是md5加密绕过的话,想到的是0e开头绕过和传入数组绕过。但是str_shuffle打乱之后这两种思路都行不通。试图查看str_shuffle函数有没有漏洞,没有找到。

接下来继续观察, $unserialize_str这个函数是可控的,它与$username弱类型比较的值要为真,而$username是不可控的,查看弱类型比较还有什么可以利用的地方,发现可以利用0与字符串弱类型比较的结果也为0(这里要注意的是,第一个字符不能为数字),到这里就清楚了,md5在这里就是混淆视线的,我们可以把$username,$password视为随机值。

那么接下来要思考的是,怎样让$unserialize_str[‘username’]和$unserialize_str[‘password’]的值为0

注意到 unserialize函数,想到反序列化漏洞,但是在反序列化漏洞中没有找到可以利用的地方。

还是继续从弱类型比较入手,PHP弱类型 - 简书 https://www.jianshu.com/p/90d235d4f745

在这篇文章中找到

这里的json_decode函数让我联想到了unserialize函数,都是可以触发反序列化漏洞的函数。

这里的payload为 item={“key”:0},尝试构造这到题的payload,没有成功。

继续找弱类型,发现这篇文章,ctf常见php弱类型分析_词语大杂烩-CSDN博客_ctf弱类型 https://blog.csdn.net/qq3401247010/article/details/77867399

发现这道题的payload用的是数组的方法,unserialize函数在数组中不会报错。

接着绕过正则,https://blog.csdn.net/silence1_/article/details/102835743参考了这篇文章,构造payload

1
?str=a:2:{s:8:%22username%22;i:0;s:8:%22password%22;i:0;}&code=eval(end(current(get_defined_vars())));&b=var_dump(highlight_file(end(scandir(pos(localeconv())))));

web2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?
$dir = 'sandbox/' . md5($_SERVER['REMOTE_ADDR']) . '/';
if(!file_exists($dir)){
mkdir($dir);
}
switch($_GET["action"] ?? "") {
case 'pwd':
echo $dir;
break;
case 'upload':
$data = $_GET["data"] ?? "";
waf($data);
file_put_contents("$dir" . "index.php", $data);
}
?>

$_SERVER[“REMOTE_ADDR”] 为获取IP

$a ?? 0 等同于 isset($a) ? $a : 0

$a ?: 0 等同于 $a ? $a : 0

可得$_GET[“action”] ?? “” 等同于isset($attion) ? $attion : “”

我们的目的就是要让$action=’upload’,执行file_put_contents函数

$dir并不是我们能控制的,也就是file_put_contents函数打开的文件路径是固定的,这里我在本地测试的时候遇到一个问题,文件名中不能含有’/‘

既然名不能有’/‘,我一开始想到的是注释,但是行不通,然后是文件流,base64编码,但是由于$dir不是我们能控制的,所以都行不通。接着发现mkdir函数在创建文件目录或文件是也不能有’/‘等特殊符号,如何存在’/‘,’/‘前面会被当成创建文件目录处理。而这道题中刚好有有mkdir函数if(!file_exists($dir)){ mkdir($dir);}

只要执行mkdir函数,file_put_contents函数打开的文件路径就不会报错了。

这道题还可以通过让$action=pwd,打印出$dir,也就是file_put_contents函数打开的文件路径。

接下来考虑的是$data变量,因为file_put_contents函数打开的文件后缀为php,也就是如果$data为输入php格式,可以执行php代码。

这里 waf($data)调用了两个函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 error_reporting(0);
highlight_file(__FILE__);
function check($input){
if(preg_match("/'| |_|php|;|~|\\^|\\+|eval|{|}/i",$input)){
// if(preg_match("/'| |_|=|php/",$input)){
die('hacker!!!');
}else{
return $input;
}
}

function waf($input){
if(is_array($input)){
foreach($input as $key=>$output){
$input[$key] = waf($output);
}
}else{
$input = check($input);
}
}

isArray() 方法用于判断一个对象是否为数组。如果对象是数组返回 true,否则返回 false。我们刚才分析$data的内容应该是php文件的格式,所以不会是一个数组。观察 check方法

php被过滤,我们可以采用短标签的格式,<?= ?>

到这里一开始的想法是构造一句话木马,但是这些符号被过滤了,构造失败

1
_  ^  ~  ;  { }

然后发现反引号没有被过滤,可以构造

这里空格被过滤,用%09代替。

这里当前目录只有index.php,一开始的想法是通过返回上级目录查看内容,也就是cd%09..&&ls,但发现没有执行成功,最后是通过返回根目录

可以看出最后xxxaf14gss.php即为我们想找的文件,cat /xxxaf14gss.php,php被过滤,用*绕过

misc

隐藏的书

用Bandzip解压成功

打开pdf是一篇隐写的论文,到这里就很清楚了,就是需要根据论文的解密方法解开flag.txt的内容

隐写信息的编码

编码算法首先应获取秘密信息每一位的 ASCII 码,之后把 ASCII 码转换为十六进制 数,最后用 Unicode 编码字符表示从 ASCII 码转换过来的十六进制数。考虑的中文 ASCII 编码的特殊性,中文一个字符占两个字节,则我们将每个字节分别转为对应 的 ASCII 码,即一个英文字符用两个不可见字符表示,而一个中文字符用四个不可 见字符表示。

隐写信息的一个英文字符用两个不可见字符表示 ASCII码 –> 十六进制数 –> Unicode编码

隐写信息的嵌入

第一步:找到’.’字符

第二步:以字符‘.’为界截成 Ca 和 Cb 两部分,并且‘.’字符在 Ca 中

第三步:Ca、不可见字符串、Cb 的顺序形成新的字符串

这道题中Ca为Hello. Cb为Gzmtu,中间为不可见字符串

隐写信息的解码

对每一个字符逆的 Unicode编码找到对应的 ASCII 编码;最后,根据 ASCII 码转换出相应的实际字符;

首先,我们可以从Unicode编码推出hex编码(16进制),再推出ASCII码。

这道题的不可见字符从0606开始,到070D结束。

因为隐写信息的一个英文字符用两个不可见字符表示,也就是0606代表一个英文字母,060c代表一个英文字母,以此类推到070D。

一般的flag形式为flag{****},也就是0606表示的是f,060c表示的是l,可以猜测,该算法的0606表示的是16进制66,转换为ASCII码是f。

1
2
3
4
5
6
7
8
9
例:隐写flag 

f:102(ascii码)--->66(十六进制)

l:108(ascii码)--->6c(十六进制)

a:97(ascii码)---->61(十六进制)

g:103(ascii码)--->67(十六进制)

神秘的铃声

010脚本安装

Templates(模板,范本)—Template Repository

选中脚本(.bt文件),使用F5运行分析,如果没有窗口,那么手动打开窗口 View—Inspector Windows—Show/Hide All Inspector Windows

参考文章:http://www.cxyzjd.com/article/iamsongyu/84674337

打开题目给的wav文件,发现有一个struct UNKNOWNCHUNK unkown模块,发现是一串base64字符串,复制到burpsuit进行解码。

解码完是以PK开头的,保存为zip文件,复制到repeater模块,右键保存为zip文件。

打开文件需要解码,想到WAV文件播放是一段DTMF音频,也就是电话机按键的声音

识别音频的网站:http://dialabc.com/sound/detect/index.html

D#*C9A16B即为zip文件的密码,解压得到flag.txt是一串坐标,将其转换为图片得到二维码扫码得到flag:

1
2
3
4
5
6
7
8
9
10
from PIL import Image
img = Image.new('RGB',(500,500),(0,0,0))
#创建Image对象
f = open('flag.txt')#打开flag.txt文件
for line in f.readlines():
point = line.split()
img.putpixel((int(point[0]),int(point[1])),(255,255,255))
#读取文件中的每一行,并修改像素
f.close()
img.show()

也可以安装gnuplot

神秘的网站

扔到wireshark分析根据题目提示是一个神秘的网站,只需要找HTTP即可。hint提示了上传包那么:直接filter过滤出所有POST协议迅速就能找到上传包。(http.request.method==”POST”)

追踪该HTTP流,发现有zip文件

右键,导出分组字节流

解压得到一个文件和一张图片

看到最后是KP,想到应该是zip文件开头的PK,自然想到该文件是倒转。

1
2
3
4
<?php 
$a = file_get_contents('flag');
file_put_contents("flag.zip",strrev($a));
?>

得到zip文件,解压发现需要密码。

  • 图片只能看到一部分说明chunk被破坏过用010打开可以发现chunk4长度很奇怪应该被改过

将其改大可以恢复图片得到一串字符串

得到的这个字符串是zip文件的密码,解压得到一个音频文件,不过该音频文件也是需要倒放,打开au,效果—反向(时间)即可。最后用网易云音乐听歌识曲,flag在评论区。