常见漏洞与分析

一、SQL注入


(1)注入产生原理

使用用户输入的参数拼凑SQL语句,用户对服务器端代码里的SQL语句可控,使服务器执行恶意的sql命令

http://bbs.pconline.com.cn/topic.jsp?tid=1 ' and 1=2

(2)万能密码

select * from tb_name where name = ' ' or 1=1 - - '  and  passwd = ' '

(3)危害

数据库泄露,撞库攻击,法律责任(个人信息泄露)

(4)防御方法

1.绑定变量:使用SqlBuilder


2.使用安全的存储过程

3.检查数据类型

4.使用过滤函数


二、越权操作


(1)平行越权漏洞

只要一个账户即可控制全站用户数据。当然这些数据仅限于存在漏洞功能对应的数据。越权漏洞的成因主要是因为开

发人员在对数据进行增、删、改、查询时对客户端请求的数据过分相信而遗漏了权限的判断。

案例分析:删除帖子时没有判断当前用户是否有权限删除该帖子,导致其他用户的帖子也被删掉了


(2)垂直越权操作漏洞

基于角色的权限管理,又称为“垂直权限管理”。不同角色的权限有高低之分。高权限角色访问低权限角色的资源往往

是被允许的,而低权限角色访问高权限角色的资源往往是被拒绝的。如果低权限角色获得了高权限角色的能力,那么

就发生了“越权访问”


三、跨站脚本攻击(XSS)


(1)简介

恶意攻击者通过某些输入点往Web页面里插入脚本代码,当用户浏览页面或执行某种操作时,就会触发嵌入的脚本代码,从而实现

恶意攻击。

(2)分类

1.存储型XSS(Stored XSS)

存入了数据库,再取出来时导致的xss。

输入:

输出:


2.反射型XSS(Reflected XSS)

案例:在网址url后输入xss代码,如<script>alert(1)</script>,然后访问时导致html页面加载这段代码即可达到弹框效果


3.DOM型XSS(DOM Based XSS)其实也是反射型的一种

严格来说该xss也属于反射型,本文的例子其实也是dom based,是指修改页面的dom对象模型,从而达成攻击,比如

页面使用了document.write\document.writeln\innerhtml等dom方法有可能引起dom based xss

案例:

http://datalib.ent.qq.com/cgi-bin/search?libid=1&keyvalue=aaaaaaa&attr=133&stype=2&tname=star_second.shtml


相关代码:

if("职业1"=="职业1")

document.getElementById("titleshow").innerHTML="按职业检索:aaaaaaa";

传入的keyvalue加上xss攻击:

http://datalib.ent.qq.com/cgi-bin/search?libid=1&keyvalue=\x3Cimg\u0020src=1\u0020οnerrοr=alert(1)

\x3e&attr=133&stype=2&tname=star_second.shtml

经过运行后, titleshow 里的HTML就会变为 <img src=1 οnerrοr=alert(1)> ,从而弹出1。


(3)如何防止跨站脚本攻击(XSS)


1.输出过滤


encodeForHTML:

  1. public static String encodeForHTML(String input) {
  2. if (input == null) {
  3. return input;
  4. }
  5. StringBuilder sb = new StringBuilder(input.length());
  6. for ( int i = 0, c = input.length(); i < c; i++) {
  7. char ch = input.charAt(i);
  8. switch (ch) {
  9. case '&':
  10. sb.append( "&");
  11. break;
  12. case '<':
  13. sb.append( "<");
  14. break;
  15. case '>':
  16. sb.append( ">");
  17. break;
  18. case '"':
  19. sb.append( "" ");
  20. break;
  21. case '\'':
  22. sb.append(" '");
  23. break;
  24. case '/ ':
  25. sb.append("/");
  26. break;
  27. default:
  28. sb.append(ch);
  29. }
  30. }
  31. return sb.toString();
  32. }

encodeForCSS:

  1. public static String encodeForCSS(String input) {
  2. if (input == null) {
  3. return input;
  4. }
  5. StringBuilder sb = new StringBuilder(input.length());
  6. for ( int i = 0, c = input.length(); i < c; i++) {
  7. char ch = input.charAt(i);
  8. // check for alphanumeric characters
  9. if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z' ||
  10. ch >= '0' && ch <= '9') {
  11. sb.append(ch);
  12. } else {
  13. // return the hex and end in whitespace to terminate
  14. sb.append( '\\').append(Integer.toHexString(ch)).append( ' ');
  15. }
  16. }
  17. return sb.toString();
  18. }

encodeForJavascript:

  1. public static String encodeForJavascript(String input) {
  2. if (input == null) {
  3. return input;
  4. }
  5. StringBuilder sb = new StringBuilder(input.length());
  6. for ( int i = 0, c = input.length(); i < c; i++) {
  7. char ch = input.charAt(i);
  8. // do not encode alphanumeric characters and ',' '.' '_'
  9. if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z' ||
  10. ch >= '0' && ch <= '9' ||
  11. ch == ',' || ch == '.' || ch == '_') {
  12. sb.append(ch);
  13. } else {
  14. String temp = Integer.toHexString(ch);
  15. // encode up to 256 with \\xHH
  16. if (ch < 256) {
  17. sb.append( '\\').append( 'x');
  18. if (temp.length() == 1) {
  19. sb.append( '0');
  20. }
  21. sb.append(temp.toLowerCase());
  22. // otherwise encode with \\uHHHH
  23. } else {
  24. sb.append( '\\').append( 'u');
  25. for ( int j = 0, d = 4 - temp.length(); j < d; j ++) {
  26. sb.append( '0');
  27. }
  28. sb.append(temp.toUpperCase());
  29. }
  30. }
  31. }
  32. return sb.toString();
  33. }

isValidURL:

  1. public static boolean isValidURL(String input) {
  2. if (input == null || input.length() < 8) {
  3. return false;
  4. }
  5. char ch0 = input.charAt( 0);
  6. if (ch0 == 'h') {
  7. if (input.charAt( 1) == 't' &&
  8. input.charAt( 2) == 't' &&
  9. input.charAt( 3) == 'p') {
  10. char ch4 = input.charAt( 4);
  11. if (ch4 == ':') {
  12. if (input.charAt( 5) == '/' &&
  13. input.charAt( 6) == '/') {
  14. return isValidURLChar(input, 7);
  15. } else {
  16. return false;
  17. }
  18. } else if (ch4 == 's') {
  19. if (input.charAt( 5) == ':' &&
  20. input.charAt( 6) == '/' &&
  21. input.charAt( 7) == '/') {
  22. return isValidURLChar(input, 8);
  23. } else {
  24. return false;
  25. }
  26. } else {
  27. return false;
  28. }
  29. } else {
  30. return false;
  31. }
  32. } else if (ch0 == 'f') {
  33. if( input.charAt( 1) == 't' &&
  34. input.charAt( 2) == 'p' &&
  35. input.charAt( 3) == ':' &&
  36. input.charAt( 4) == '/' &&
  37. input.charAt( 5) == '/') {
  38. return isValidURLChar(input, 6);
  39. } else {
  40. return false;
  41. }
  42. }
  43. return false;
  44. }
  45. static boolean isValidURLChar(String url, int start) {
  46.         for ( int i = start, c = url.length(); i < c; i ++) {
  47.             char ch = url.charAt(i);
  48.             if (ch == '"' || ch == '\'') {
  49.                 return false;
  50.             }
  51.         }
  52.         return true;
  53.     }

encodeFoURIComponent:

  1. public static String encodeURIComponent(String input) {
  2. return encodeURIComponent(input, "utf-8");
  3. }
  4. public static String encodeURIComponent(String input, String encoding) {
  5. if (input == null) {
  6. return input;
  7. }
  8. String result;
  9. try {
  10. result = URLEncoder.encode(input, encoding);
  11. } catch (Exception e) {
  12. result = "";
  13. }
  14. return result;
  15. }


2.其他方法

A. HTML标签的属性必须使用引号。

B. 页面插入可疑flash时allowScriptAccess必须设置为never。

C. JSON接口返回的Content-Type为application/json。

D. 提供给应用调用的接口数据格式使用JSON。

E. 不要将可疑的数据作为HTML标签属性。

F. 不要将可疑的数据放到CSS属性中。

G. 尽可能避免多层输出。

H. 避免使用Javascript操作cookie。


四、跨站请求伪造(CSRF)


(1)简介

CSRF(Cross-site request forgery跨站请求伪造,也被称成为“one click attack”或者session riding,通常缩写为

CSRF或者XSRF,是一种对网站的恶意利用。

(2)发生原因

网站是通过cookie来识别用户的,当用户成功进行身份验证之后浏览器就会得到一个

标识其身份的cookie,只要不关闭浏览器或者退出登录,以后访问这个网站会带上这个cookie。

1.登录受信任网站A,并在本地生成Cookie。

2.如果在用户登录访问网站A的同时访问了网站B,访问者在网站A的数据就会被B使用用户cookie假冒更新。

(3)案例

假如某网银转账操作是以GET请求来完成:http://www.mybank.com/Transfer.php?toBankId=11&money=1000

网站B,它里面有一段HTML的代码如下:

<img src=http://www.mybank.com/Transfer.php?toBankId=11&money=1000>

当我在网银cookie有效的情况下访问了网站B,那我的网银就莫名其妙的

被转账了1000。。。

(4)防御方法

1.验证码与二次验证

2.对请求的referer进行检测

3.添加随机token校验


转载自:https://blog.csdn.net/happydream_C/article/details/53257736

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值