通过前期的WEB漏洞的学习,掌握了大部分的安全漏洞的原理及利用,但在各种脚本语言开发环境的差异下,会存在新的安全问题,其中脚本语言类型PHP,Java,Python等主流开发框架会有所差异。
SQL Injection(mitigation)
防御sql注入,其实就是session,参数绑定,存储过程这样的注入。
//利用session防御,session内容正常情况下是用户无法修改的
select *from users where user = “’” + session.getAttribute (“UserID”")+ “’” ;
参数绑定方式,利用了sql的预编译技术
string query = "SELECT * FROM users WHERE last_name = ? ";
Preparedstatement statement = connection.preparestatement ( query) ;
statement .setstring ( 1, accountName ) ;
Resultset results = statement.executeQuery ( );
上面说的方式也不是能够绝对的进行sql注入防御,只是减轻。
如参数绑定方式可以使用下面方式绕过。
通过使用case when语句可以将order by后的orderExpression表达式中添加select语句。
https://www.cnblogs.com/klyjb/p/11473857.html
什么是JWT?
JSON web Token (JSON web令牌是一种跨域验证身份的方案。JWT不加密传输的数据,但能够通过数字签名来验证数据未被篡改〈但是做完下面的webGoat练习后我对这—点表示怀疑)。
JwT分为三部分,头部(Header),声明(claims),签名(signature),三个部分以英文句号.隔开。JWT的内容以Base64URL进行了编码。
头部(Header)
{“alg”:“HS256”,
“typ” : ““JwP””}
alg
是说明这个JwT的签名使用的算法的参数,常见值用s256(默认),Hs512等,也可以为None。HS256表示HMAC SHA256。
typ
说明这个token的类型为JWT
JwT固定参数有:
iss:发行人
exp:到期时间
sub:主题
aud:用户
nbf:在此之前不可用
iat:发布时间
jti: JwT ID用于标识该JwT
签名(signatura)
服务器有一个不会发送给客户端的密码(secret),用头部中指定的算法对头部和声明的内容用此密码进行加密,生成的字符串就是JwT的签名。lL
下面是一个用Hs256生成JwT的代码例子
HMACSHA256(base64UrlEncode (header) + “.”+base64URlEncode(payload) ,secret)
1、用户端登录,用户名和密码在请求中被发往服务器
2、(确认登录信息正确后)服务器生成json头部和声明,将登录信息写入JsoN的声明中(通常不应写入密码,因为JwT是不加密的),并用secret用指定算法进行加密,生成该用户的JwT。此时,服务器并没有保存登录状态信息。
3、服务器将JwT (通过响应)返回给客户端
4、用户下次会话时,客户端会自动将JwT写在HTTF请求头部的Authorization字段中
5、服务器对JwT进行验证,若验证成功,则确认此用户的登录状态