常见的JavaWeb安全问题及修复
1.SQL注⼊:程序向后台数据库传递SQL时,⽤户提交的数据直接拼接到SQL语句中并执⾏,从⽽导⼊SQL注⼊攻击。
字符型注⼊:⿊⾊部分为拼接的问题参数
select*from t_user where name='';
数字型注⼊:⿊⾊部分为拼接的问题参数(对于强类型语⾔,字符串转int类型会抛异常。所以这种注⼊⽅式⼀般出现在php等弱类型语⾔上)select*from t_user where id=1;
搜索型注⼊:对表名进⾏猜测
select*from t_user where userName like ‘%1212';
修复⽅法:
a、在mybatis中使⽤#把参数当做⼀个字符串,不能使⽤$符号
b、在JDBC中使⽤预编译的⽅式对参数进⾏绑定,详细如下:
String userName = Parameter("userName");
String sql = "select*from t_user where userName = ?";
JdbcConnection conn = new JdbcConnection();
PreparedStatement pstmt = conn.preparedStatement(sql);
pstmt.setString(1,userName);
2、XSS跨站脚本攻击(恶意将脚本代码植⼊到供其他⽤户使⽤的页⾯中)
反射型:经过后端,不经过数据库
存储型:经过后端经过数据库
DOM型:基于⽂档对象模型DOM,通过控制url参数触发
修复⽅法:
a、后台设置XSSFilter,继承RequestServletWrapper类,对前端请求中的可控参数进⾏过滤
b、服务端设置Http-only安全属性,使浏览器控制cookie不被泄露
c、对引⼊到DOM中的参数使⽤htmlEncodeByRegExp编码,在对应的展⽰框中⽤htmlDecodeByRegExp进⾏解码(⽐较常⽤)
var HtmlUtil = {
/*1.⽤正则表达式实现html转码*/
htmlEncodeByRegExp:function (str){
var s = "";
if(str.length == 0) return "";
s = place(/&/g,"&");
s = s.replace(/</g,"<");
s = s.replace(/>/g,">");
s = s.replace(/ /g," ");
s = s.replace(/\'/g,"'");
s = s.replace(/\"/g,""");
return s;
},
/*2.⽤正则表达式实现html解码*/
htmlDecodeByRegExp:function (str){
var s = "";
if(str.length == 0) return "";
s = place(/&/g,"&");
s = s.replace(/</g,"<");
s = s.replace(/>/g,">");
s = s.replace(/ /g," ");
s = s.replace(/'/g,"\'");
s = s.replace(/"/g,"\"");
return s;
}
};
3、敏感信息泄露
程序造成的泄露:
1、服务端返回冗余敏感数据:⽤户只申请了单个账户的信息,却返回了多个⽤户的信息
2、将敏感信息直接写在前端页⾯的注释中
3、写在配置⽂件的密码未进⾏编码处理
4、请求参数敏感信息未脱敏处理(可以将数据在前端⽤RSA加密,后台在进⾏解密)
5、前端展⽰的敏感信息,没有在后台进⾏脱敏处理(后台对数据进⾏处理,可以将中间部分使⽤*号代替)
6、越权
4、越权:攻击者能够执⾏本⾝没有资格执⾏的权限
⽔平越权:权限类型不变,权限Id变化(同等⾓⾊下的⽤户,不但能够访问⾃⼰私有的数据,还能访问其他⼈私有的数据)
垂直越权:权限ID不变,权限类型变化(即低权限的⾓⾊通过⼀些途径,获得⾼权限的能⼒)
交叉越权:上⾯两者的交集
修复⽅法:
1、根据请求携带的⽤户信息进⾏鉴权操作,对当前请求携带的⽤户信息进⾏⽤户⾓⾊和数据权限匹配。每⼀个重要操作的功能、分步操作的每个阶段都进⾏权限判断。权限不⾜就中断操作。
5、⽂件下载:
任意⽂件下载:下载服务器的任意⽂件,web业务的代码,服务器和系统的具体配置信息,也可以下载数据库的配置信息,以及对内⽹的信息探测等等
⽂件越权下载:
修复⽅法:
1、针对任意⽂件下载的修复,增加当前请求下载的⽂件上⼀级的绝对路径同配置⽂件中允许下载的路径直接的⽐较
(CanonicalFile().getParent()获取上⼀级的绝对路径)
if(!CanonicalFile().getParent().equals(new File(Constants.TMP_PATH).getCanonicalPath())){
return ;
}
2、⽂件越权下载:允许下载之前对请求所带的⽤户信息进⾏判断,拥有⾜够的权限菜允许下载。
6、⽂件上传:⽹络攻击者上传了⼀个可执⾏的⽂件到服务器并执⾏。这⾥上传的⽂件可以是⽊马,病毒,恶意脚本或者WebShell等。
修复⽅法:
1、客户端、服务端⽩名单验证(不建议⽤⿊名单),客户端的校验不够安全,很容易被绕过。
String fileName = OriginalFilename();
String extName = fileName.subString(fileName.lastIndexof(".")+1);
java replace方法获取上传⽂件的后缀名,并同⽩名单上的后缀名进⾏⽐较,包含在⽩名单上则允许通过,不包含则直接中断请求。
2、MiME类型检测:⽂件上传时浏览器会在Header中添加MIMETYPE识别⽂件类型,服务端要对此进⾏检测。
String mime = ContentType();//获取⽂件的ContentType类型值
同⽩名单上的contentType类型名进⾏⽐较,包含在⽩名单上则允许通过,不包含则直接中断请求。
3、⽂件内容检测:⽤不同的⽅法将不同的⽂件内容流的进⾏读取。
BufferedImage image = InputStream());
7、CSRF:跨站请求伪造,完成CSRF攻击,需要完成两个步骤:1、登录受信任的⽹站A,并在本地⽣成cookie;2、在不登出A的情况下,访问危险⽹站B
CSRF本质原因:Web的隐式⾝份验证机制。Web的⾝份验证机制虽然可以保证请求来⾃⽤户的浏览器,但是⽆法保证该请求时⽤户批准发送的。
修复⽅法:
CSRF Token校验:在页⾯中添加⼀个hidden⽤于存放token字段,请求发送时携带token到服务端,服务端校验token值是否准确。不准确直接中断操作
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论