Java-web安全01

打印 上一主题 下一主题

主题 807|帖子 807|积分 2421

学习书籍: Web应用安全权威指南
http请求时对于中文参数大概特殊符号是颠末URL编码(英文颠末URL编码后不变)后才传输,在Java中可用java.net.URLEncoder类进行编码大概解码,URL编码又称百分号编码
百分号编码是将字符以字节为单位转换成 %xx 的情势。xx 为该字节的十六进制写法。参照如下代码示例
  1. public static void main(String[] args) throws UnsupportedEncodingException {
  2.         System.out.println(URLEncoder.encode("德", "UTF-8"));
  3.         byte[] bytes = "德".getBytes(StandardCharsets.UTF_8);
  4.         System.out.println(bytesToHex(bytes));
  5.     }
  6.     public static String bytesToHex(byte[] bytes) {
  7.         StringBuilder result = new StringBuilder();
  8.         for (byte b : bytes) {
  9.             result.append(String.format("%02X", b));
  10.         }
  11.         return result.toString();
  12.     }
复制代码
同源计谋-跨站攻击

协议,host,端口号3个保持同等即为同源计谋,JavaScript的跨域访问受到同源计谋的严酷限制
假如不存在同源计谋,使用JavaScript可以在iframe外层访问内层的数据及其伤害
可以进行跨域访问的元素
1.frame和iframe元素可以进行跨域访问,X-FRAME-OPTIONS 被定义在响应头信息中用来限制frame和iframe的跨域访问,值为 DENY(拒绝)或 SAMEORIGIN(仅限同源)
2.img元素
3.script元素
4.form元素的action属性—CSRF攻击
5.CSS元素,高版本欣赏器一般都有安全补丁已经解决该问题,

输入处置处罚

对输入值做如下处置处罚
字符串标准化

Unicode标准答应同一个字符有多种表示情势,表现是一样,但在计算机内部表示不同,避免比力字符串大概搜索操纵出现不精确效果,Java中字符串标准化使用Normalizer
  1. String normalized = Normalizer.normalize(input, Normalizer.Form.NFKC);
复制代码
字符编码校验

1.检验字符编码有用性
2.须要时转换字符编码
3.校验参数字符串的有用性
校验输入值格式

页面表现

XSS攻击

攻击方式:
1.窃取Cookie,document.getCookie
2.篡改网页-更改原先HTML元素,提交数据跳转到新的url
场景1

产生原因:HTML中字符没有被转义
解决办法
1.元素内容中转义<和&
2.属性值用双引号括起来,转义<和"和&
示例:
前端传入”
   24     “ 字符串,后台原样输出,页面就不是预期边幅   
处置处罚办法:
对字符串进行转义处置处罚-发起使用Apache Common-Text库中StringEscapeUtils.escapeHtml4(userInput);
注意点:
1.@RequestParam 传参 和@RequestBody传参 两种方式 在filter过滤写法不同
2.注意对于文件上传下载接口不要进行xssfilter过滤,否则会功能异常.文件上传和下载请求会使用multipart/form-data内容类型,通过这个区分平凡请求和文件上传下载请求
代码:
  1. import org.springframework.web.filter.OncePerRequestFilter;
  2. import javax.servlet.FilterChain;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import java.io.IOException;
  7. public class XssFilter extends OncePerRequestFilter {
  8.     @Override
  9.     protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
  10.             throws ServletException, IOException {
  11.         if (isMultipartContent(request)) {
  12.             // 对于文件上传请求不做XSS过滤
  13.             filterChain.doFilter(request, response);
  14.         } else {
  15.             // 对其他类型的请求进行XSS过滤
  16.             XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request);
  17.             filterChain.doFilter(xssRequest, response);
  18.         }
  19.     }
  20.     private boolean isMultipartContent(HttpServletRequest request) {
  21.         String contentType = request.getContentType();
  22.         return contentType != null && contentType.toLowerCase().startsWith("multipart/");
  23.     }
  24. }
复制代码
  1. import org.apache.commons.lang3.StringEscapeUtils;
  2. import javax.servlet.ReadListener;
  3. import javax.servlet.ServletInputStream;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletRequestWrapper;
  6. import java.io.ByteArrayInputStream;
  7. import java.io.IOException;
  8. import java.io.InputStream;
  9. import java.nio.charset.StandardCharsets;
  10. import com.alibaba.fastjson.JSON;
  11. public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
  12.     public XssHttpServletRequestWrapper(HttpServletRequest request) {
  13.         super(request);
  14.     }
  15.     @Override
  16.     public String getParameter(String name) {
  17.         return cleanXss(super.getParameter(name));
  18.     }
  19.     @Override
  20.     public String[] getParameterValues(String name) {
  21.         String[] values = super.getParameterValues(name);
  22.         if (values == null || values.length == 0) {
  23.             return values;
  24.         }
  25.         String[] cleanValues = new String[values.length];
  26.         for (int i = 0; i < values.length; i++) {
  27.             cleanValues[i] = cleanXss(values[i]);
  28.         }
  29.         return cleanValues;
  30.     }
  31.     @Override
  32.     public ServletInputStream getInputStream() throws IOException {
  33.         final byte[] body = IOUtils.toByteArray(super.getInputStream());
  34.         String jsonBody = new String(body, StandardCharsets.UTF_8);
  35.         if (jsonBody != null && !jsonBody.trim().isEmpty()) {
  36.             jsonBody = cleanJson(jsonBody);
  37.             return new DelegatingServletInputStream(new ByteArrayInputStream(jsonBody.getBytes(StandardCharsets.UTF_8)));
  38.         }
  39.         return super.getInputStream();
  40.     }
  41.     private String cleanXss(String value) {
  42.         if (value == null || value.isEmpty()) {
  43.             return value;
  44.         }
  45.         return StringEscapeUtils.escapeHtml4(value);
  46.     }
  47.     private String cleanJson(String json) {
  48.         JSON parsedJson = JSON.parseObject(json);
  49.         return JSON.toJSONString(parsedJson, (key, object) -> cleanXss(object.toString()));
  50.     }
  51. }
复制代码
  1. import org.springframework.boot.web.servlet.FilterRegistrationBean;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. @Configuration
  5. public class WebConfig {
  6.     @Bean
  7.     public FilterRegistrationBean<XssFilter> xssFilter() {
  8.         FilterRegistrationBean<XssFilter> registrationBean = new FilterRegistrationBean<>();
  9.         registrationBean.setFilter(new XssFilter());
  10.         registrationBean.addUrlPatterns("/*");
  11.         return registrationBean;
  12.     }
  13. }
复制代码
场景2

使用JavaScript URI”或“JavaScript URL进行的xss攻击
href和src中url路径中
  1. <body>
  2. <a href="javascript:alert(document.cookie)"> 书签 </a>
  3. </body>
复制代码
解决办法
校验url仅答应http和https协议,属性值也要进行HTML转义
SQL注入

示例:
select * from A where a = ${param},传入 1; select * from users
实验sql为select * from A where a = 1; select * from users,实验了2个sql
产生原因:一部门参数越过了字面量范围
解决办法:防止指定的参数一部门被排除字面量内
占位符–将 值赋给? 的过程叫绑定变量
select * from A where a = ?
占位符分为静态占位符和动态占位符,前者将包罗占位符的sql和变量发到数据库引擎后再进行绑定变量
后者在步伐内进行包罗占位符的sql和变量绑定后得到完整sql再发到数据库引擎中实验
关键处置处罚

CSRF攻击

举例:
用户A登录平台B,A打开恶意网站C不小心实验脚本,网站C带着A在B平台的认证信息去请求平台B如修改密码等等恶意操纵
常用解决办法:
CSRF Token 唯一的随机值返回给用户,用户请求时必须携带Token才有用
文件处置处罚

目录遍历攻击

示例:
外界传入文件名"…/…/etc/a.txt"
访问了不该问路径下文件
解决办法:
1.避免由外界指定文件名
2.文件名中不答应包罗目录名
3.限定文件名中仅包罗字母和数字
4.校验拼接后路径是否答应访问
5.对文件及文件夹设置访问权限
OS下令注入

满足条件:
1.步伐内有调用shell函数的地方
2.将外部传入参数转达给调用shell函数
3.参数中shell的元字符没有被转义
解决办法:
上面三条不满足即可
文件上传下载漏洞

示例:
1.上传巨大文件造成Dos攻击
2.上传脚本文件,诱使用户下载恶意文件,伪装恶意文件为html使欣赏器里默认实验JavaScript
3.越权下载
4.上传脚本文件,使其在服务器中实验
防范:
1.限制上传文件大小
2.限制上传文件类型,敏感文件避免保存在公开目录
3.校验上传文件真实文件类型(校验文件头),防止修改后缀
4.拼接后路径是否答应访问
5.对文件及文件夹设置访问权限

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

种地

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表