网安学习---Java安全之JWT安全及预编译CASE注入

目录

Java安全之SQL预编译

JDBC编程之sql预编译

JWT​编辑

解释

JWT与session的区别

组成


通过前面的WEB漏洞的学习,大体上了解了大部分的安全漏洞的原理以及利用,但在各种脚本语言开发环境的差异下,会存在新的安全问题,其中脚本语言类型PHP、Java、Python等主流开发框架会有所差异。

Java安全之SQL预编译

之前学习了sql注入产生的原理:未经检查或者没有经过充分的过滤用户输入的数据,从而意外的导致用户输入的数据,被代入到数据库中进行的查询,产生了意外的结局。SQL注入的本质就是利用SQL拼接存在的缺陷进行攻击。

JDBC编程之sql预编译

JDBC(Java Database Connectivity)是Java提供对数据库进行连接、操作的标准API。Java自身并不会去实现队数据库的连接、查询、更新等操作而是通过抽象出数据库操作的接口(即JDBC)。

常用的就是三种方式来执行查询语句,分别是Statement、PreparedStatement和CallableStatement。

其中的Statement用于执行静态SQL语句,并返回执行的结果。

PreparedStatement:SQL语句被预编译并存储在PreparedStatement对象中,然后可以使用此对象多次高效的执行该语句。

看了一些关于三者的联系和去别的文章:Statement,PreparedStatement和CallableStatement的联系和区别_奔跑的狮子a的博客-CSDN博客

总体上来说:

  • Statement每次执行sql语句,数据库都要执行sql语句的编译,最好是用于仅一次执行就返回结果的情况,其效率高于PreparedStatement。
  • PreparedStatement是预编译的,使用它还有几个好处。其中的一个好处就是安全性好,能够有效的防止大部分的SQL注入问题。
  • CallableStatement接口扩展于PreparedStatement,用来调用存储过程,它提供了对输出和输入/输出参数的支持。CallableStatement 接口还具有对 PreparedStatement 接口提供的输入参数的支持。

使用PreparedStatement的参数化的查询可以阻止大部分的sql注入,在使用参数化查询的情况下,数据库系统不会将参数的内容视为SQL指令的处理,而是在数据库预编译之后,才套用参数进行运行,因此就算参数中含有恶意的指令,也不会带入数据库中运行,因为对于参数化查询来说,SQL语句的格式是已经规定好了的,需要查询的数据也设置好了,缺的只是具体的某几个数据而已,所以用户能提供的只是数据,无法做出影响数据库的其他行为。

关于sql预编译的笔记查看XD安全 学习笔记 | Java

JWT

解释

JSON Web Token(JSON Web令牌)是一种跨域验证身份的方案,JWT不加密传输的数据,但能够通过数字签名来验证数据未篡改。

JWT与session的区别

两者的主要目的都是存储用户信息,但是session将用户信息存储在服务器端,但是JWT则是将用户的信息存储在客户端,JWT方式将用户状态分散到了客户端中,可以明显减轻服务器端的内存压力。

组成

JWT格式由三部分组成,分别是头部(header)、声明(Claims)和签名(signatures)。

其中的参数authorization的值就是JWT的一般格式。

其中的HEADER部分,包含着两个部分,分别是alg和typ,alg表名这个JWT的签名使用的算法,默认的值是HS256,还有HS512等,也可以为none。HS256表示的是HMAC SHA256。typ表示的是这个token的类型。

payload(声明):载荷就是存放有效信息的地方。这些有效信息包含着三个部分:

  • 标准中注册的声明
  • 公共的声明
  • 私有的声明

signature(签名):签证的信息由三部分组成:hearder(base64UrlEncode后)、payload(base64UrlEncode后)、secret。

关于base64UrlEncode:在HTTP传输过程中,base64编码中的"="、"+"、"/"等特殊的符号通过URL编码后容易产生歧义,因此产生了base64UrlEncode,其中的"+"会变成"-"、"="会被去掉、"/"会变成"_"。

这里放上了一个CTF的题目,是XD老师上课讲到的。

2020-数字中国创新大赛虎符杯-easy_login

进入题目是这样的,我们先来注册一个账号,尝试登陆进去是什么。

 这里创建了账号,并进行了登录,登陆进去之后显示flag is here 然后点击了一下,但是显示,我们没有权限。之后便进行了抓包。

发现了数据包中的JWT,就是上面的例子中的数据,对数据进行了修改,其中的alg改为none,这里的意思就是没有密钥,因为我们不知道原来的数据使用的密钥是什么,在JWT中的第三部分,也就是签名部分,他的生成是在header和payload进行base64之后,在使用密钥对二者的结合进行操作得到的,所以这里我们使用的密钥为空,得到的第三部分让其为空。payload中的参数secretid的值修改为空([],),username尝试修改为admin(管理员的名字),这里我是猜出来,XD老师讲了admin的来源,有点没听懂,相当于后台敏感文件一样找到的。

最终将三部分的答案进行拼接,注意其中的.号不要忘记。

 payload为

ewogICAgImFsZyI6ICJub25lIiwKICAgICJ0eXAiOiAiSldUIgp9.ewogICAgInNlY3JldGlkIjogW10sCiAgICAidXNlcm5hbWUiOiAiYWRtaW4iLAogICAgInBhc3N3b3JkIjogInhpYW9kaSIsCiAgICAiaWF0IjogMTY1NTA0MTAxMgp9.

猜你喜欢

转载自blog.csdn.net/weixin_44770698/article/details/125229507