进入页面,看到uid,flag的价格和现有的JinKela(货币),点work会增加。
进入robots.txt,看到存在文件filebak
进入该文件发现源码,存在erb模板注入(ssti)。
大概看一下后端代码的逻辑,uid的JinKela被写在了cookie里,并且cookie签名用的是jwt。可能是要伪造cookie了。
首先在https://jwt.io/#debugger-io里面解密一下cookie
确实写在了cookie里,但是伪造cookie需要知道后端签名的密钥,这里我们并不知道密钥,无法伪造cookie,继续去源码看看。
这里存在erb模板注入,存在字数限制。但是源码中可以发现在前面出现了一个对密钥的正则
于是可以用ruby的预定义字符$对匹配的字符串进行读取,可读取到secret
构造payload:
/work?SECRET=&name=%3c%25%3d%24%27%25%3e&do=%3c%25%3d%24%27%25%3e%20is%20working
用密钥得出cookie
Buy flag
然后对其解密
得到flag
我们这里引出jwt的安全问题
先了解一下什么是jwt
JWT是JSON Web Token的缩写,它是一串带有声明信息的字符串,由服务端使用加密算法对信息签名,以保证其完整性和不可伪造性。Token里可以包含所有必要的信息,这样服务端就无需保存任何关于用户或会话的信息了。JWT可用于身份认证,会话状态维持以及信息交换等任务。
JWT由三部分构成,分别称为header,payload和signature,各部分用“.”相连构成一个完整的Token,形如xxxxx.yyyyy.zzzzz
下面就是一些jwt的安全问题
1、敏感信息泄露
由于Header和Payload部分是使用可逆base64方法编码的,因此任何能够看到令牌的人都可以读取数据。要读取内容,您只需要将每个部分传递给base64去解码,比如说burp上的decode模块
2、将算法修改为none
JWT支持将算法设定为"None"。如果"alg"字段设为" None",那么签名会被置空,这样任何token都是有效的。设定该功能的最初目的是为了方便调试。但是,若不在生产环境中关闭该功能,攻击者可以通过将alg字段设置为"None"来伪造他们想要的任何token,接着便可以使用伪造的token冒充任意用户登陆网站。示例:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiYWRtaW4iLCJhY3Rpb24iOiJ1cGxvYWQifQ.y2k9SJDRU81ybXm-anxpD2p1N-rKekDJtJGKGJlemjY
设置 "alg": "none"不带签名,生成Token:
eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJ1c2VyIjoiYWRtaW4iLCJhY3Rpb24iOiJ1cGxvYWQifQ.
解构:
{"typ":"JWT","alg":"none"}.
{"user":"admin","action":"upload"}.
[No signature!]
页面是否仍然返回有效?如果页面返回有效,那么说明存在漏洞。如何抵御这种攻击? JWT配置应该指定所需的签名算法,不要指定"none"。
3、密钥混淆攻击
JWT最常用的两种算法是HMAC和RSA。HMAC(对称加密算法)用同一个密钥对token进行签名和认证。而RSA(非对称加密算法)需要两个密钥,先用私钥加密生成JWT,然后使用其对应的公钥来解密验证。如果将算法RS256修改为HS256(非对称密码算法=>对称密码算法)?那么,后端代码会使用公钥作为秘密密钥,然后使用HS256算法验证签名。由于公钥有时可以被攻击者获取到,所以攻击者可以修改header中算法为HS256,然后使用RSA公钥对数据进行签名。示例:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.I3G9aRHfunXlZV2lyJvWkZO0I_A_OiaAAQakU_kjkJM
解构:
{"typ":"JWT","alg":"HS256"}.
{"login":"ticarpi"}.
[使用HS256签名,使用RSA公钥文件作为密钥验证。]
后端代码会使用RSA公钥+HS256算法进行签名验证。如何抵御这种攻击?JWT配置应该只允许使用HMAC算法或公钥算法,决不能同时使用这两种算法。
4、无效签名
当用户端提交请求给应用程序,服务端可能没有对token签名进行校验,这样,攻击者便可以通过提供无效签名简单地绕过安全机制。示例:一个很好的例子是网站上的"个人资料"页面,因为我们只有在被授权通过有效的JWT进行访问时才能访问此页面,我们将重放请求并寻找响应的变化以发现问题。
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoidGVzdCIsImFjdGlvbiI6InByb2ZpbGUifQ.FjnAvQxzRKcahlw2EPd9o7teqX-fQSt7MZhT84hj7mU
user 字段改为 admin,重新生成新 token:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiYWRtaW4iLCJhY3Rpb24iOiJwcm9maWxlIn0._LRRXAfXtnagdyB1uRk-7CfkK1RESGwxqQCdwCNSPaI
结构:
{"typ": "JWT", "alg": "HS256"}.
{"user": "admin","action": "profile"}.
[新的签名]
将重新生成的Token发给服务端效验,如访问页面正常,则说明漏洞存在。
5、暴力破解密钥
HMAC签名密钥(例如HS256 / HS384 / HS512)使用对称加密,这意味着对令牌进行签名的密钥也用于对其进行验证。由于签名验证是一个自包含的过程,因此可以测试令牌本身的有效密钥,而不必将其发送回应用程序进行验证。因此,HMAC JWT破解是离线的,通过JWT破解工具,可以快速检查已知的泄漏密码列表或默认密码。