【JAVA安全】---JWT安全及预编译CASE注入---day40
【Java安全】---JWT安全及预编译CASE注入---day40
一、思维导图
二、SQL Injection
1、防御sql注入,其实就是session,参数绑定,存储过程这样的注入。
//利用session防御,session内容正常情况下是用户无法修改的:
select * from users where user = "'" + session.getAttribute("UserID") + "'";
//参数绑定方式,利用了sql的预编译技术
预编译讲解:https://www.cnblogs.com/klyjb/p/11473857.html
String query = "SELECT * FROM users WHERE last_name = ?";
PreparedStatement statement = connection.prepareStatement(query);
statement.setString(1,accountNmae);
ResultSet results = statement.executeQuery();
上面说的方式也不是能够绝对的进行SQL注入防御,只是减轻。
比如参数绑定的方式可以使用下面的方式绕过:
通过使用case when语句可以将order by后的orderExpression表达式中添加select语句。
案例:WEBGOAT sql注入
在参数ip可以操作,可以去查看源码有oder by 查询,然后是通过预编译的方法
抓包
随便输入一个,报错,爆出了sql语句
在过关技巧那里,有case when的绕过方法。
https://blog.csdn.net/u013553529/article/details/82765062
目的学习就是通过oder by 解决预编译注入。
三、JWT安全
1、结构
头 声明 签名
流程:
2、Javaweb-身份验证攻击-JWT修改伪造攻击
在webgoat里
目的是使用普通用户的token,变为管理员。
点一下右上角的users,选择Tom。抓包
然后点击重新设置Tom
就出现了access_token,这就是JWT的类型格式。使用在线解密:
JWT.IO:
https://jwt.io/
后面的签名,必须要密匙才能知道是啥。我们把上面的admin:false改为true就可以了。
把修改后的JWT复制过去替换就可以了。但是发现会报错,就是因为使用了加密算法,需要签名的密匙的原因。
我们只需要把第一部分算法改为none,然后拼接起来,复制过去应该就可以了。
由于base64加密后有等于号,我们需要把等于号去掉。
3、Javaweb-身份验证攻击-JWT密匙爆破攻击
进行解密:
脚本:
用到了fuzz字典。找到了密匙
4、Javaweb-jwt伪造冒充
购物以其他用户购买,日志分析某用户的jwt数据,进行修改伪造提交。
点击退房,抓包。
补充jwt的交互原理:
然后在题目那里,给了一个日志。查看一下。
有个jwt_token。分析一下
用户是Tom。由于我们不知道密匙,所以还是修改alg为none进行伪造,并且修改失效的时间戳。
放到Authorization中:
5、JWT-最终挑战
点击Tom下面的删除,抓包:
解密一下Token
在源码中有SQL语句
也就是说上面的kid是从jwt的头部得到的。那么更改kid就可以形成注入。
6、Javaweb-身份验证攻击-JWT安全结合SQL注入
https://www.freebuf.com/vuls/216457.html
7、CTF-Node.js-前端jwt登录安全-伪造admin实现getflag
#结题思路:
注册用户登录-分析/controllers/api.js-用户admin可获取flag
抓取登录数据包,进行反解密修改再加密,伪造登录获取flag。
靶场:CTFHUB
注册个账号密码
完事之后,在登录页面抓包:
登陆之后点击,获取flag,显示权限被拒绝。
说明就是要我们通过jwt改身份呗。
在下面的地址里可以查看源代码:
注意这个函数:
还是把alg改为none,拼接形成payload。
然后此时再点获取flag。
得到flag。