个人信息
战队名:先辈の队
比赛排名:4
联系方式:3011366557
WEB
(>﹏<)
看源码
1 | from flask import Flask, request |
看到 parser = etree.XMLParser(load_dtd=True, resolve_entities=True)
我们可以利用XXE攻击,即XML外部实体攻击。
首先我们要抓包将其改为POST方法,并访问/ghctf,页面上显示No System is Safe.
由于文件允许加载DTD和解析实体,我们xml字段中的内容可以写为
1 | <?xml version="1.0"?> |
其中<!ENTITY xxe SYSTEM "file:///flag">
定义了一个名为xxe的实体并且其值是本地文件中flag文件的内容
1 | <root> |
在根目录的name标签中引用xxe。
由于Content-Type是
application/x-www-form-urlencoded所以我们要把这个xml文本用url编码并复制到请求体的xml字段中再发送便能得到
flag:
NSSCTF{7e4db57a-3ded-4ff4-972f-9873e2168114}
upload?SSTI!
查看附件app.py
1 | def view_file(filename): |
发现render_template_string(tmp_str)
这个函数能渲染html模板,模板中有我们上传文件中的内容,那么我们可以想到在我们上传的文件中写入一些危险代码随后再进行访问来显示flag。
解法
我们首先在文件中写入49发现访问文件后回显的是49,说明存在模板注入。
接着我们就可以开始构造我们的攻击代码,基本的代码是这样的
1 | {{ [].__class__.__bases__[0].__subclasses__()[370]("cat /flag", shell=True, stdout=-1).communicate() }} |
其中__subclasses__()[370]是类<class ‘subprocess.Popen’>
但是由于过滤:
1 | dangerous_keywords = ['_', 'os', 'subclasses', '__builtins__', '__globals__','flag',] |
我们需要把_换成16进制的\x5f,把subclasses拆分成两个字符串,那么便可以得到
1 | {{ []|attr("\x5f\x5fclass\x5f\x5f")|attr("\x5f\x5fbases\x5f\x5f")|first|attr("\x5f\x5fsubcla"+"sses\x5f\x5f")()|list|attr("\x5f\x5fgetitem\x5f\x5f")(370)|attr("\x5f\x5fcall\x5f\x5f")("cat /fl\x61g", shell=True, stdout=-1)|attr("communicate")()}} |
这里|attr可以避免使用.
\x5f
绕过_,fl\x61g
绕过flag,利用 communicate()
方法来执行命令并获取输出。上传并访问便能得到
flag:
NSSCTF{f9359d63-c8f5-4f3a-ae52-d164bbc158c6}
SQL???
先使用联合查询判断显示位
?id=0 union select 1,2,3,4,5
但是不知道数据库是哪种,于是我问ai各种数据库查询版本的代码最后查出是sqlite
随后直接查询flag
成功。
POppppppp
分析
根据源码发现这题是反序列化
1 |
|
我们主要是要利用mystery类中的原生类来读取flag文件,构造如下
1 | <?php |
这里有两个难点,其中就是如何触发mystery中的get方法,我们可以想到利用Philosopher中的$this->fruit10->hey;,那么我们就需要一个字符串能两次md5后有666,因为这个是“==”弱比较所以只要有包含666的字符串就行了,扔给ai生成脚本:
1 | import hashlib |
运行得到结果“213”,我们将$fruit11赋值为213便能触发mystery的get方法,接下来便是寻找原生类的运用,搜索发现我们可以分别利用GlobIterator 类读取目录和SplFileObject类读取文件,我们只要将mystery设置一个新属性属性名为我们要用的类,值是我们的路径,便可以先通过GlobIterator 类找到flag的名字在用SplFileObject读取flag文件就行了。
flag
NSSCTF{e92e6ae9-2fd8-49cf-b5d2-8072e4f0862b}
upupup
分析
根据提示不影响 .htaccess 语法的 mine绕过(getimagesize&exif_imagetype绕过),我们可以在网上搜到文章php 文件上传.htaccess getimagesize和exif_imagetype绕过_getimagesize图片类型绕过-CSDN博客,发现我们只要将.htaccess的内容设置为
1 | #define width 1337 |
上传,再写一个图片马上传,再用蚁剑连接找到flag就行了。
flag
NSSCTF{09d16fca-9671-46e0-b912-3b5ef5621c53}
Goph3rrr
由提示,我们先访问/app.py下载源码.查看发现
根据hint可以想到利用gopher的ssrf漏洞再利用manage读取文件,要利用Manage那么我们就需要绕过127.0.0.0的检测如果直接通过浏览器访问/manage,会被拦截并返回forbidden,那么这时候我们就需要通过gopher访问本地服务再通过本地服务发送请求这样才不会拦截,那么我们就可以开始构造payload
1 | gopher://0:8000/_POST /Manage HTTP/1.1 |
构造过程参考CTFHub-SSRF过关攻略_hackhub攻略-CSDN博客,我们只需保留请求包需要的最基本的请求头,我们还需要编码两次,在向服务器发送请求时,首先浏览器会进行一次 URL解码,其次服务器收到请求后,在执行curl功能时,进行第二次 URL解码 。
由于127.0.0.1在黑名单中,所以我们需要改为0来绕过(参考ssrf学习2——内网ip绕过_ssrf 127.0.0.1绕过-CSDN博客) 且端口是8000,根据提示,flag在环境变量里,那么我们就利用env打开环境变量便能获取flag
flag:
NSSCTF{d334ec08-1ce4-4395-baa1-472f5e91273b}
MISC mybrave
下载附件得到加密文件
发现里面只有一个文件,结合提示明文攻击,那么我们就可以利用png固定的文件头进行破解
89504E470D0A1A0A0000000D49484452
写成二进制文件,然后利用bkcrack进行密钥破解,得到密钥再把文件解密得到
用vscode二进制打开发现IEND之后还有数据,利用ai生成python代码将数据分离
1 | def split_known_iend(file_path, iend_pos): |
,得到一个字符串TlNTQ1RGe0knbV9XaDFzcDNyaU5nX091Ul9MdTExYWJZX2Ywcl9ZMHVfdG9fQ29NZV9CNGNrX0hvbWV9
base64解码得到
flag
NSSCTF{I’m_Wh1sp3riNg_OuR_Lu11abY_f0r_Y0u_to_CoMe_B4ck_Home}