在各种语言脚本的环境下,也会产生一些新的漏洞,如果是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