JAVA安全-JWT安全及预编译CASE注入等

JAVA安全-JWT安全及预编译CASE注入等_第1张图片JAVA安全-JWT安全及预编译CASE注入等_第2张图片

JAVA中防止sql注入

//利用session防御,session内容正常情况下是用户无法修改的:
select * from users where user = "'" + session.getAttribute("UserID") + "'";

//参数绑定方式,利用了sql的预编译技术(PreparedStatement)
预编译讲解:https://www.cnblogs.com/klyjb/p/11473857.html

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

JWT安全

组成
JAVA安全-JWT安全及预编译CASE注入等_第3张图片JWT 分为三部分,头部(Header),声明(Claims),签名(Signature),三个部分以英文句号.隔开。 JWT 的头部,声明内容以 Base64进行了编码。
签名处通过头部和声明的内容以及特殊的密钥进行加密生成。

头部(Header)
{
"alg":"HS256",
"typ":"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"
}

声明(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"
}

靶场例子

无密钥-修改alg,删除签名
登陆用户时抓包,access_tocken为空
JAVA安全-JWT安全及预编译CASE注入等_第4张图片进行其它退出等操作后抓包,可以通过格式确定是JWT
JAVA安全-JWT安全及预编译CASE注入等_第5张图片在线jwt解码:https://jwt.io/
通过在线解密查看解密结果。此处alg:HS512的意思是,此签名(Signature)是通过头部(Header),声明(Claims),以及特殊的密钥进行HS512加密。
因为此处获取不了密钥,所以不能对签名进行解密。

JAVA安全-JWT安全及预编译CASE注入等_第6张图片当对方服务器上的验证不需要签名时,把对应的jwt进行修改后再base64加密
将alg修改为none进行base64编码
JAVA安全-JWT安全及预编译CASE注入等_第7张图片
将admin的值修改为true
JAVA安全-JWT安全及预编译CASE注入等_第8张图片将两个base64编码后的字符串去掉等号用.拼接为jwt的格式,进行提交(因为这里alg的值为none,所以就没有进行加密,不会生成签名)
JAVA安全-JWT安全及预编译CASE注入等_第9张图片
点击提交,登陆成功
JAVA安全-JWT安全及预编译CASE注入等_第10张图片
如果对方服务器上要验证签名,则此方法是无效的

你可能感兴趣的:(渗透笔记2,java,安全,开发语言)