之前9月份事情很多没有打CSAW ,听说题质量不错就去做了做,不会的就去复现了一波,跟着师傅们的wp学到了不少东西。
Web
Ldab
这道题开始做的时候试了一波注入姿势,没有什么卵用,后来才知道考察的是 LDAP 的注入。
关于 LDAP 及注入的知识点,可以参考这几篇博客:
看这道题,flag 应该就藏在某一项中,试一下查出所有项:
*)(uid=*
没有 flag,应该是做了什么过滤,猜测后台查询语句可能是这样的:
(&(name=输入)(name!=flag))
在&的条件下,我们的 payload 带入,变为
(&(name=*)(uid=*)(name!=flag))
flag 依然无法查询到。
所以思路是闭合掉前面的 &,再构造一个查询语句,payload:
*)(uid=*))(|(uid=*
代入查询语句变为:
(&(name=*)(uid=*))(|(uid=*)(name!=flag))
这样过滤flag前面限制变成了 “ | “,查询到flag:
flag{ld4p_inj3ction_i5_a_th1ng}
sso
题目描述:
1 | Don't you love undocumented APIs |
查看源码:
1 | <h1>Welcome to our SINGLE SIGN ON PAGE WITH FULL OAUTH2.0!</h1> |
应该是基于 OAuth2.0 协议的身份验证,去补一波知识…
关于OAuth2.0的知识,可以参考以下几篇博客:
这道题涉及的验证模式是授权码模式。流程如下:
- 用户访问客户端,后者将前者导向认证服务器。
- 用户选择是否给予客户端授权。
- 假设用户给予授权,认证服务器将用户导向客户端事先指定的”重定向 URI “(redirection URI),同时附上一个授权码。
- 客户端收到授权码,附上早先的”重定向URI”,向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。
分析此题,我们要拿到 token 去访问 http://web.chal.csaw.io:9000/protected 得到flag,过程基本如下:
先去访问 /oauth2/authorize,构造 Post 请求拿到 code,带着这个code去访问 /oauth2/token,得到token去访问 /oauth2/protected 去找flag。
首先访问 /oauth2/authorize,注意要在 Post 请求中加 “response_type=code”。redirect_uri 是重定向的url,与后面填的一致就可以。
拿着这个 code 去访问 /oauth2/token,注意 Post 参数的格式:
payload:
1 | grant_type=authorization_code&code=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZWRpcmVjdF91cmkiOiJodHRwOi8vd2ViLmNoYWwuY3Nhdy5pbzo5MDAwL3Byb3RlY3RlZCIsImlhdCI6MTUzODk3OTY4OCwiZXhwIjoxNTM4OTgwMjg4fQ.EmiNRIdeLAij3UUnBP2763GTsBtu-BFMi14yAoQRWFk&redirect_uri=http://web.chal.csaw.io:9000/protected |
得到 token,进行 jwt 在线解码:
这里的 ufoundme! 就是加密的密钥,根据题目提示把 user 改为 admin ,下面密钥换成 ufoundme!
拿着这个新的 token 去访问 http://web.chal.csaw.io:9000/protected 得到flag:
1 | flag: flag{JsonWebTokensaretheeasieststorage-lessdataoptiononthemarket!theyrelyonsupersecureblockchainlevelencryptionfortheirmethods} |
参考:
Crypto
babycrypto
题目描述:
yeeeeeeeeeeeeeeeeeeeeeeeeeeeeeet
single yeet yeeted with single yeet == 0
yeeet
what is yeet?
yeet is yeet
Yeetdate: yeeted yeet at yeet: 9:42 pm
密文给了一串base64:
1 | s5qQkd+WjN+e34+NkJiNnpKSmo3fiJeQ356Mj5aNmozfi5DfnI2anoua34+NkJiNnpKM34uXnovfl5qTj9+PmpCPk5rfm5Dfk5qMjNHft5rfiJ6Ri4zfi5Dfj4qL356Ki5CSnouWkJHfmZaNjIvT356Rm9+MnJ6Tnp2Wk5aLht+ek5CRmIyWm5rR37ea35uNmp6SjN+Qmd+e34iQjZOb34iXmo2a34uXmt+akZuTmoyM356Rm9+Ll5rflpGZlpGWi5rfnZqckJKa342anpOWi5aajN+LkN+SnpGUlpGb09+ekZvfiJeajZrfi5ea34uNiprfiZ6TiprfkJnfk5aZmt+WjN+PjZqMmo2JmpvRmZOemISblpmZlprSl5qTk5KekdKYz4+XzI2FjZ6wps61npPLnLeeuabGrKithr6uyZ63gg== |
密文解码是乱码
说了这么多,yeet 到底是什么,通过第二句猜测可能是异或(自己和自己 yeet 为0)
逐字节异或 只有 256 种情况,写出爆破脚本:
1 | import base64 |
flag: flag{diffie-hellman-g0ph3rzraOY1Jal4cHaFY9SWRyAQ6aH}
lowe
I personally prefer Home Depot
XOR Passes are the easiest way to use numbers to encrypt!
By Kris Kwiatkowski, Cloudflare
附件有三个:
- file.enc
- key.enc
- pubkey.pem
file.enc 是一串 base64 编码,解码是一串乱码,看起来像是加密过。
kStoynmN5LSniue0nDxli9csSrBgexZ/YOo5e+MUkfJKwvht8hHsYyMGVYzMlOp9sAFBrPCbm4UA4n7oMr2zlg==
key.enc是 1533bit 的一个数。
1 | 219135993109607778001201845084150602227376141082195657844762662508084481089986056048532133767792600470123444605795683268047281347474499409679660783370627652563144258284648474807381611694138314352087429271128942786445607462311052442015618558352506502586843660097471748372196048269942588597722623967402749279662913442303983480435926749879440167236197705613657631022920490906911790425443191781646744542562221829319509319404420795146532861393334310385517838840775182 |
pubkey.pem 是RSA公钥文件。
1 | -----BEGIN PUBLIC KEY----- |
首先在线提取出 RSA 公钥的n和e (选择 openssl 提取也可以)。发现 n 是1536bit,而 e 仅仅为 3。
分析以上条件,不难得出 key.enc 是 RSA 加密的 c,位数相近。 此题 e 这么小,猜想可能直接开三次方开出来,或者 *c + i\ n **能够直接开三次方,其中 i 穷举。
试了一下发现成功,得到 RSA 明文 m,根据题目提示和 file.enc 进行异或,得到 flag,解题脚本如下:
1 | import gmpy2 |
flag: flag{saltstacksaltcomit5dd304276ba5745ec21fc1e6686a0b28da29e6fc}
Misc
bin_t
题目描述:
1 | Binary trees let you do some interesting things. Can you balance a tree? |
ACM入门级,AVL树的生成和树的前序遍历,贴上python代码:
1 | #coding:utf-8 |
flag: flag{HOW_WAS_IT_NAVIGATING_THAT_FOREST?}
Short Circuit
Start from the monkey’s paw and work your way down the high voltage line, for every wire that is branches off has an element that is either on or off. Ignore the first bit. Standard flag format.
图片:
题都没看懂… 太真实了
网上搜到师傅的 wp,就是一张图片,绝了:
打扰了。
flag:flag{owmyhand}
Algebra
计算一元一次方程,开始想一个一个手算,实在算不动,太多了。写个python脚本:
因为我的那个计算算法可能会出错…所以加了捕获异常,捕获到异常直接重新连接…
1 | # -*- coding:utf-8 -*- |
flag: flag{y0u_s0_60od_aT_tH3_qU1cK_M4tH5}