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

在各种语言脚本的环境下,也会产生一些新的漏洞,如果是java又能产生那些漏洞,思维导图里面常规漏洞之前都有;

java的访问控制,jwt令牌(php几乎没有)组件安全,这些都是java特有的

#综合漏洞,sql注入

防御sql注入,接受session,参数绑定,存储过程中这样注入;

接受session:这个意思就是他取sql语句不是你发什么他就接受什么,取你s型里面的,类似于cookie的数据,这里的值,一般s型都存储在对方服务器里面,一般不去操作对方服务器,这个s型数据是不可伪造的。从服务器上面取固定值,而不是网站上发送什么数据,接受什么数据。

参数绑定方式:采用了预编译技术,这个就是,

---PreparedStatement ,SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。(这里是PreparedStatement不允许一个占位符(?)有多个值,注入的语句也就不会被执行)

使用整个PreparedStatement,可以阻止大部分sql注入,但还是可以尝试绕过;在使用参数化查询时,数据库系统不会将参数作为sql语句去执行,他不会将你的参数值当作sql语句去执行,就等于个字符串,没有意义,在参数化查询中,sql语句格式是已经规定好的,要查的数据也固定好了,

假如他只接受一个1,在1后面写上注入语句之后,他之后代入1正常sql查询,后面的sql攻击语句不给予执行的机会。

这种情况该如何去绕过,我们可以case when 语句去绕过预编译的,语句可以将 order by 后的 orderExpression 表达式中添加 select 语句。(原理类似堆叠注入,一条语句出现多条命令)

为什么可以绕过,在后面可以添加select语句,而case when,他把注入代码写到后门来,

预编译注入是围绕着order by绕过的,

打开靶场,在靶场哪里点排序,抓住数据包

发送到重发器,正常数据包发送一下就正常返回我们把参数ip随便改一下,在发送出去,看下报错信息 因为这里涉及了预编译,所以不能用常规的注入思路了,必须结合用到case when语句,如何根据报错信息里面有一些表名之类的信息,直接用。

所以我们可以写一个python的脚本去跑sql注入,

java内置了预编译,所以很难sql注入到,怎么发现order by,这个字符串的功能是排序,如果对方涉及到了排序的话,就有,对方没有order by就直接算了。

 但是并不妨碍我看不懂这个代码

##重点,jwt安全

经常出现,

jwt是一种跨域验证身份的方案,身份凭据。比如你的网站是xioadi8.com,而另一个网站是xiaohei1.com而要实现两个网站的用户通讯问题,这个时候他就可以跨域进行身份的验证,比如你是xiaodi上面的xiaodi用户,可以实现这样的认证方式。

第一步先学习组成部分,分三个部分,头部,声明,签名,

涉及到攻击就伪造攻击,爆破,或配合其他漏洞去攻击。

如何检测,先看是不是javaweb的语言,第二个看有没有authorization的存在,第三个就是看数据包的格式,

JWT颁发流程

1、用户端登录,用户名和密码在请求中被发往服务器

2、(确认登录信息正确后)服务器生成JSON头部和声明,将登录信息写入JSON的声明中(通常不应写入密码,因为JWT是不加密的),并用secret用指定算法进行加密,生成该用户的JWT。此时,服务器并没有保存登录状态信息。

3、服务器将JWT(通过响应)返回给客户端

4、用户下次会话时,客户端会自动将JWT写在HTTP请求头部的Authorization字段中

5、服务器对JWT进行验证,若验证成功,则确认此用户的登录状态

6、服务器返回响应 

首先看一下结构

 jwt在数据包里面传输的时候是这样的,这是加密后的值,没加密的值是这样的

上面这些都是base64加密方式,签名整合前面两个,但是签名哪里在base64之前有一个密匙,就是随机的密码,组合这个密码加密之后的签名,所以它需要得到密匙才能还原,重新加密也需要密匙,

头部(Header)

    {

    "alg":"HS256",

    "typ":"JWT"

    }

“alg”是该JWT的签名使用的算法参数,常见值用HS256加密(默认),HS512等,也可以为None。

“typ”是该token的类型,值为“JWT” 

##javawen身份认证绕过----jwt修改伪造攻击, 

打开靶场

 更改jwt信息类似于之前更改cookie

老规矩,用burp抓包

 然后这个一直点发生出去,就是一片空白,所以在抓一次这个数据包,点一下那个垃圾桶按钮,抓重置投票的数据包

 数据包里面就出现了这个值,这个就符合jwt的验证方式,

 我门需要解密一下这个字符串,就直接去这个网站,复制粘贴

解码、验证和生成JWT:https://jwt.io/#encoded-jwt 

 这个只能识别前面两个,最下面那个要在白色框里面输入密匙之后才能识别;最后面的签名是由头部内容决定的,哪里有个hs512,所以他的加密方式是hs512再加上这个密匙。把hss512加密方式改一下为空,就相当于签名没有加密,密匙也就没有了。

不过先不说这个,按照题目来讲

根据数据吧分析,他是根据admin哪里判断,把admin哪里改为true(翻译中文是真)就可以了,因为false是假的意思,

 额。。。数据包抓错了,抓成登录的了,应该删除一个然后进入操作用户的数据包

 然后没有修改jwt发送出去,它会提示我们不是管理用户,所以不能点垃圾桶重置投票

换好jwt之后发送

 他有提示,token不对。

这是因为刚刚修改admin为true,但是签名不对。没有密匙就更改头部内容为不加密,所以这时候就把头部base64解密之后,把hs512改为none,意思就是不加密,在修改声明的admin为true。

然后因为--注意:在HTTP传输中,base64编码中的=,+,/等等特殊符号通过URL解码容易产生歧义,因此产生了与URL兼容的base64 URL编码,所以把那些符号都取消掉,然后因为头部选择的不加密,所以签名就可以不用写,只写一个点好。

 

 修改后jwt,发送过去了,成功了。

这一关就告诉我们jwt是什么,如果没有加密方式就把加密方式改为none,签名就为空,实现这个伪造,就涉及到思维导图里面攻击方式,伪造,没有那个签名加密方式就修改none,由密匙就直接用密匙加密;如果对方有签名认证这种方法就不行了。

##javawen身份认证绕过----jwt密匙爆破攻击

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

打开靶场

 这时候就可以通过已经获取的令牌,进行暴力破解,先拿去已经有的令牌去破解

这里要进行的解密的话用到一个python脚本在这里插入图片描述

他这里是把利用那个网站里面每次修改密匙,然后对应的签名就会改变,之后就是用那个字典里面就很多钟密匙,去调用下面的模块,进行一个jwt的加密,然后再去和上面的jwt进行一个对比,一模一样的,而他引用字典里面的值,就是密匙。

爆破出来了。然后要对这个里面的信息修改,声明里面的用户名,失效时间要修改好

 

 完整数据包。

##javawen身份认证绕过----jwt伪造修改冒充

打开下一关

点绿色的按钮抓一下数据包 

 用户下次会话时,客户端会自动将JWT写在HTTP请求头部的Authorization字段中

但是用户为空,我们不知道。发送出去

然后我们打开她的日志看看,就是在主页的在此处那个蓝色的字体,点开就是

 发现token传参使用的jwt令牌,然后就拿去网站翻译和,这个思路也是把头部加密方式改为none就是空,然后把声明里面的有效时间改好,然后base64编译好,去掉url不好接受的特殊符号,就不用再写签名,然后修改到数据包的指定对方。

 发送出去成功了。

这个就是从日志里面获取到别人的身份令牌来伪造登录,重新把数据包构造。

如果你有之前别人的令牌,就可以修改失效时间,再一次有效;这是建立在对方没有检测签名的情况下,检测失效时间的判断没有在jwt数据包体现,

##Javaweb-身份验证attack-JWT安全结合sql注入

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

 点一下汤姆猫的删除,抓一下数据包

 这是删除汤姆买的,同样拿去jwt解密

这里是jerry用户,所以只能删除Jerry,这里要把用户修改为tmo,我们没有签名,修改上面的加秘密方式,发现有一个kid,这是什么,看一下源代码

这里有一个sql语句,kid这里就可以构造sql语句,进行sql注入,老师没有去做,不过可以看看上面的参考文章。

##CTFHub-历年真题:https://www.ctfhub.com/#/challenge 

 打开靶场

 先注册一个账户

注册好,点登录抓一下数据包 把这个数据包发送到重发器,然后这个数据包发送出去,看看网页有什么变化,

但是点下面的蓝色按钮会提示权限被拒绝,这个就告诉我们要实现一个权限的跨越,一般管理员是admin,还有提示这个网站涉及到nodejs 框架,nodejs简介(猜测是一个前端框架) 

通过/controllers/api.js查看框架信息(这里发现管理员帐号:admin,而且他的JWT验证在前端)

 这里也有提示在查看权限的时候是admin用户才可以,

所以把刚刚在重发器的数据包的jwt语言拿去解密一下,然后把用户名修改为admin

因为不知道密匙,所以把上面加密方式改为none,签名就可以为空。构造新的jwt语言

在输入刚刚注册的账户密码登录,然后把账户修改为admin,改好jwt 

 然后进入之后,直接查看falg

 游戏就结束了。

 怎么去发现jwt呢,1就是javaweb是很常见有jwt,第二个就是关键字,authorization,第三个就看数据包的数据格式。

s

s

s

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值