//利用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安全 组成
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为空
进行其它退出等操作后抓包,可以通过格式确定是JWT
在线jwt解码:https://jwt.io/
通过在线解密查看解密结果。此处alg:HS512的意思是,此签名(Signature)是通过头部(Header),声明(Claims),以及特殊的密钥进行HS512加密。
因为此处获取不了密钥,所以不能对签名进行解密。
当对方服务器上的验证不需要签名时,把对应的jwt进行修改后再base64加密
将alg修改为none进行base64编码
将admin的值修改为true
将两个base64编码后的字符串去掉等号用.拼接为jwt的格式,进行提交(因为这里alg的值为none,所以就没有进行加密,不会生成签名)
点击提交,登陆成功
如果对方服务器上要验证签名,则此方法是无效的