【JAVA安全】---JWT安全及预编译CASE注入---day40

【Java安全】---JWT安全及预编译CASE注入---day40

一、思维导图

image-20210504171230516

image-20210504171735384

二、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 查询,然后是通过预编译的方法

抓包

image-20210504173429518

随便输入一个,报错,爆出了sql语句

image-20210504173531810

在过关技巧那里,有case when的绕过方法。

https://blog.csdn.net/u013553529/article/details/82765062

目的学习就是通过oder by 解决预编译注入。

三、JWT安全

1、结构

image-20210504174333666

头 声明 签名

image-20210504174431726

流程:

image-20210504174658769

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

image-20210504174803662

在webgoat里

image-20210507142725156

目的是使用普通用户的token,变为管理员。

点一下右上角的users,选择Tom。抓包

image-20210507142907526

然后点击重新设置Tom

image-20210507142955132

就出现了access_token,这就是JWT的类型格式。使用在线解密:

JWT.IO:

https://jwt.io/

image-20210507143915984

后面的签名,必须要密匙才能知道是啥。我们把上面的admin:false改为true就可以了。

image-20210507144049168

把修改后的JWT复制过去替换就可以了。但是发现会报错,就是因为使用了加密算法,需要签名的密匙的原因。

image-20210507144403887

我们只需要把第一部分算法改为none,然后拼接起来,复制过去应该就可以了。

image-20210507144835976

由于base64加密后有等于号,我们需要把等于号去掉。

image-20210507144935185

3、Javaweb-身份验证攻击-JWT密匙爆破攻击

image-20210507145224949

进行解密:

image-20210507145332871

脚本:

image-20210507145405076

用到了fuzz字典。找到了密匙

image-20210507145454355

image-20210507145809847

4、Javaweb-jwt伪造冒充

购物以其他用户购买,日志分析某用户的jwt数据,进行修改伪造提交。

image-20210507150110103

点击退房,抓包。

image-20210507150213318

补充jwt的交互原理:

image-20210507150252563

然后在题目那里,给了一个日志。查看一下。

image-20210507150344567

有个jwt_token。分析一下

image-20210507150411821

用户是Tom。由于我们不知道密匙,所以还是修改alg为none进行伪造,并且修改失效的时间戳。

image-20210507151153466

放到Authorization中:

image-20210507151253174

5、JWT-最终挑战

image-20210507151427271

点击Tom下面的删除,抓包:

image-20210507151722485

解密一下Token

image-20210507151747437

在源码中有SQL语句

image-20210507152013796

image-20210507152036164

也就是说上面的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

image-20210507155317063

注册个账号密码

image-20210507155531106

完事之后,在登录页面抓包:

image-20210507155954275

登陆之后点击,获取flag,显示权限被拒绝。

image-20210507160048041

说明就是要我们通过jwt改身份呗。

在下面的地址里可以查看源代码:

image-20210507160210406

注意这个函数:

image-20210507160243403

image-20210507160410091

还是把alg改为none,拼接形成payload。

image-20210507160818742

然后此时再点获取flag。

image-20210507160851470

得到flag。

posted @ 2021-05-17 21:07  DarkerG  阅读(420)  评论(0编辑  收藏  举报