白帽子讲web安全(精写含思维导图) Posted 2023-04-02 Lu&Tian
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了白帽子讲web安全(精写含思维导图)相关的知识,希望对你有一定的参考价值。
写在前面
重要的事多说几遍
本文对学习基础、面试、了解安全都有辅助的作用
觉得本文对您有帮助的朋友们,请您动动小手点赞、收藏加关注哦~
觉得本文对您有帮助的朋友们,请您动动小手点赞、收藏加关注哦~
觉得本文对您有帮助的朋友们,请您动动小手点赞、收藏加关注哦~
本文一共9150字,预计阅读时间50分钟
脑图地址,一切从这里开始
白帽讲Web安全脑图
目录
第一篇 世界观安全
第一章 我的世界安全观
1.1 Web安全简史
在Web发展初期由于对安全问题认知认识不足,导致发生过许多的安全问题,且遗留下许多历史问题:如php 语言至今只能依靠较好的代码规范来防范文件包含漏洞,而无法从语言本身来杜绝此类安全问题的发生。常见的安全漏洞:SQL注入、XSS攻击、CSRF。
1.2 黑帽子,白帽子
白帽子是指那些精通安全技术,工作在反黑客领域的专家们,他们的工作出发点是解决所有的安全问题,所以他们看待问题的方面更加全面、宏观。黑帽子是指使用黑客技术对网络进行破坏、甚至是进行犯罪的群体,他们的主要目的是入侵系统,找到对他们有效的数据,因此他们只需要以点为突破,找到对他们最有利的一点进行渗透,所以他们思考问题的方向是有选择性的、微观的。
1.3 返璞归真,揭秘安全的本质
通过一个安全检查的过程,梳理未知的人或物,将其划分为不同的信任级别的区域,两个不同信任域之间的边界叫做信任边界。 安全问题的本质是信任问题。安全方案的设计基础是建立在信任关系之上的,例如保管文件的“锁”,你得确保锁的工匠是信任的,他没有私自保管一把额外的钥匙;抽屉的工匠失是信任的,他没有给抽屉安装后门;钥匙也需要保管在一个安全不会出现问题的地方。
1.5 安全三要素
机密性
保护数据内容不会泄露,加密是完成机密性的常见手段。
完整性
要求保护数据内容是完整的、没有被篡改的。常见的保证一致性的手段是数字签名。
可用性
保护资源“随需而得。例如:防范DOS攻击。
他们在安全领域还可以扩充增加可审计性、不可抵赖性等,但最重要、最基本的还是机密性、完整性、可用性。
1.6 如何实施安全评估
资产等级划分
明确工作的目标是什么,要保护什么。互联网的核心问题是数据安全的问题,对互联网公司的资产进行等级划分就是对数据做等级划分。有的公司关心客户数据,有的公司关心员工资料信息,所以根据公司的业务的不同,对其进行的侧重点也不同。
威胁分析(威胁建模STRIDE模型)
Spoofing(伪装)
冒充他人身份
Tampering(篡改)
修改数据或代码
Repudiation(抵赖)
否认做过的事
InformationDisclosure(信息泄露)
机密信息泄露
Denial of Service(拒绝服务)
拒绝服务
Elevation of Privilege(提升权限)
未经授权获得许可
风险分析
根据风险因素所对应的权重进行相加算出权值将12-15分之间的定义为高威胁。将8-11分之间的定义为中威胁。将0-7分之间的定义为低威胁。
设计安全方案
针对资产等级划分、威胁分析、风险分析阶段评估出一个合适的解决方案。
1.7 白帽子兵法
Secure By Default 原则
制定黑名单、白名单。白名单相较于黑名单来说更安全,但白名单并不是完全安全的,因为安全建立与信任,白名单中若出现不安全的名单那么信任列表将会变得不可信。
最小权限原则授予主体必要的权限,不要过度授权,这样能有效的减少系统、网络、应用、数据库出错的机会。
纵深防御原则
从不同层面、不同角度对系统做出整体的解决方案,而不是一个安全方案做两遍或者是多遍(木桶理论)。
在正确的地方做正确的事,防止造成”乌龙“(例如XSS过滤关键字可能会过滤“1<2”->”1 2“.
数据与代码分离(数据就是数据,不能被执行为代码)
不可预测性–>加密算法、随机数、哈希(随机数,比如抓取页面id=随机数,防止csrf的随机数token)
第二篇 客户端脚本安全
第二章 浏览器安全
2.1 同源策略
同源策略限制了来自不同源(origin)的文档和脚本。这一策略极其重要,如果没有同源策略,可能a.com的一段JS脚本,在b.com未曾加载此脚本时,也可以随意修改b.com的页面(在浏览器显示中)。为了不发生混乱,浏览器提出“Origin”(源)的概念。来自不同Origin的对象无法相互干扰。
从上表可以看出,影响”源”的因素有:
1.host(域名或IP地址) 2.子域名 3.端口 4.协议
需要注意的是,对于当前页面来说,页面内存放JS文件的域并不重要,重要的是加载JS的页面所在的域是什么。举例说明: a.com通过代码<script src=http://b.com/b.js ></script>
加载了b.com上的b.js。因为b.js是运行在a.com上的,所以b.js的域就是a.com。 在浏览器中,<script> <img> <iframe> <link>
等标签都可以跨域加载资源,而不受同源策略的限制。这些带”src”属性的标签每次加载时,实际上是由浏览器发起了一次GET请求。不同于XMLHttpRequest的是,通过src属性加载的资源,浏览器限制了JS的权限,使其不能读,写返回的内容。对于XMLHttpRequest,它收到同源策略的约束,不能跨域访问资源,在AJAX应用的开发中尤其需要注意到这一点。
2.2 浏览器沙盒
Sandbox 即沙箱,计算机技术发展到今天,Sandbox已经成为泛指“资源隔离类模块”的代名词。Sandbox的设计目的一般是为了让不可信任的代码运行在一定的环境中,限制不可信任的代码访问隔离区之外的资源。如果一定要跨越Sandbox边界产生数据交换,则只能通过指定的数据通道,比如经过封装的API来完成,在这些API中会严格检查请求的合法性。
2.4 高速发展的浏览器安全
浏览器对地址的解析便利可能会被黑客所利用,可以通过这些绕过一些安全模块或者是安全软件。如(“xxx.xxx.com\\abc”->“xxx.xxx.com/abc”)
第三章 跨站脚本攻击
3.1 简介
反射型XSS
反射型XSS只是简单地把用户输入的数据“反射”给浏览器。也就是说,黑客往往需要诱使用户“点击”一个恶意链接,才能攻击成功。反射型XSS也叫做“非持久型XSS”
存储型XSS
存储型XSS会把用户输入的数据“存储”在服务器端。这种XSS具有很强的稳定性。比如博客网站若被写下了包含有恶意javascript 代码,后面每个访问这个博客的用户都会执行一遍这个代码。
DOM型XSS
通过修改页面的DOM节点形成的XSS
3.2 XSS攻击进阶
攻击手段
可以利用XSS payload来读取Cookie,将其发送给服务端。但Cookie劫持并非所有的时候都会有效,有的网站可能会在Set-Cookie时给关键的Cookie植入HttpOnly标识;有的网站会把Cookie与客户端IP进行绑定。他们常用的攻击手段都是:制作含有盗取cookie的网页->用户点击这个网页->盗取浏览器上的cookie 使用JavaScript、XmlHttpRequest等方法构造GET、POST请求,借此做到非法删除、添加、盗取页面等。 制作与官方类似的界面进行钓鱼,盗取账号、密码。 识别用户的浏览器(useragent、或是根据浏览器的特色功能)、软件,借此来获取浏览器、操作系统信息,方便接下来的精准攻击。 根据css的style,浏览过的超链接要变颜色,根据此盗取浏览过的链接 获取用户的真实IP(借用Java Applet) 蠕虫病毒
XSS攻击技巧
利用url字符编码 将XSS payload写到别处,使用更短的语句绕过长度限制。location.hash不会在http中进行发送,所以是藏代码的好地方,注意去除第一个#即可。 使用字节拼接注释掉有限制长度的控件。使用<base>
标签伪造图片、链接、脚本 使用window.name
XSS网站设计的防御
HttpOnly:JavaScript禁止访问带有HTTPOnly属性的Cookie。 Apache支持的Header的TRACE能绕过此读取Cookie。输入检查对用户输入的字符进行输入检查,像是<、>、"、"等应该将其进行过滤或者是编码。 输出检查对于不同的情况对用户能输入的字符进行编码html 代码里插入的话使用HTMLEncode<script>
中插入的话使用JavaScriptEncodeCSS中使用encodeForCSS()函数 处理富文本时尽量对标签使用白名单
第四章 跨站点请求位置(CSRF)
攻击手段
浏览器所持有的Cookie分为两种:一种是“Session Cookie”,又称”临时Cookie”;另一种是”Third-party Cookie”,也称为“本地Cookie”。 两者的区别在于: Third-party Cookie是服务器在Set-Cookie时指定了Expire时间,只有到了Expire时间后Cookie才会失效,所以这种Cookie会保存在本地,而Session Cookie则没有指定Expire时间,所以浏览器关闭后,Session Cookie就失效了。 在浏览网站的过程中,若是一个网站设置了Session Cookie,那么在浏览器进程的生命周期内,即使浏览器新打开了Tab页,Session Cookie也都是有效的。Session Cookie保存在浏览器进程的内存空间中,而Third-party Cookie则保存在本地。 例如IE浏览器,从一个域的页面中,要加载另一个域的资源,由于安全的原因,IE会阻止Third-party Cookie的发送,而只发送Session Cookie。 P3P能够使<iframe>、<script>
等标签在IE中不在拦截第三方Cookie的发送 不光光是GET请求会引起CSRF攻击,通过构造POST请求提交表单也能进行攻击。例如Gmail通过诱导用户点击恶意网站通过构造表单使用用户的临时Cookie进行攻击。 Flash CSRF 通过Flash发起网络请求进行攻击,但从IE8开始已经不支持。 CSRF Worm百度的sn参数对应给某个好友发送短消息,另一个接口可以查询某个用户的所有好友。借此向好友发送一张带有指向恶意页面的CSRF图片之时,加载出来后又会向这个人的所有好友发送这张带有恶意指向CSRF页面的图片。
防御手段
验证码
破坏CSRF依靠在用户不知情的情况下进行网络请求,这是一个辅助手段,因为不能在所有网络请求进行验证法验证。
Referer Check
检查网络请求是否为规定的来源,例如进入百度界面后,浏览百度的某个界面时referer应该是百度,而点击别人的链接由别人界面发起的网络请求的referer一定不是百度。
TokenCSRF
为什么能够攻击成功?其本质原因是重要操作的所有参数都是可以被攻击者猜测到的。 攻击者只有预测出URL的所有参数与参数值,才能成功地构造一个伪造的请求;反之,攻击者将无法攻击成功。 出于这个原因,可以想到一个解决方案:把参数加密,或者使用一些随机数,从而让攻击者无法猜测到参数值,这是”不可预测性原则”的一种应用。
第五章 点击劫持
点击劫持是一种视觉上的欺骗手段。攻击者使用一个透明的,不可见的iframe,覆盖在一个网页上,然后诱使用户在该网页上进行操作,此时用户在不知情的情况下点击透明的iframe页面。恰好在功能性按钮上,进而欺骗、劫持。
防御
frame busting防止iframe嵌套 X-Frame-Options头、Firefox的NoScript
第六章 HTML5安全
HTML 5 新标签
iframe的sandbox
allow-same-origin:允许同源访问 allow-top-navigation:允许访问顶层窗口 alllow-froms:允许提交表单 allow-scripts:允许执行脚本
noreferer(referer是指之歌这个请求的来源是哪一个网站 有防盗、防止恶意请求)
noreferer就能在需要时的请求相关地址的时候不再发送带有referer的HTTP头,保护一些敏感信息。
Canvas
获取图像、操作像素,构造出图片信息。借此我们可以获取验证码的图片,从而构造、读取出验证码。
其他安全问题
跨域新技巧
HTTP header:Access-Control-Allow-Origin
postMessage
跨窗口发送消息,需验证Domain(域)甚至是URL防止有来自非法页面的消息 当接入的消息要写入HTML甚至是script中时,应该进行安全检查,防止出现DOM型XSS
Web Storage
数据库,防止恶意代码存放入数据库
第三篇 服务器端应用安全
第七章 注入攻击
SQL注入
SQL注入
SQL注入攻击的两个条件
用户能够控制数据的输入(变量) 原本要执行的代码,拼接了用户的输入错误
回显
回显披露了敏感信息,对此,攻击者构造SQL注入也更能够得心应手
盲注
根据页面的变化来判断是否注入成功
布尔盲注
根据加一个布尔判断页面是否变化例如:and 1=2
或and 1=1and mid()
时间盲注
根据返回时间来判断是否注入正确/错误and if(1=1,1,sleep(1))
即不延迟 and if(1=2,1,sleep(1))
即延迟一秒后回显
Timing Attack
BENCHMARK(count,expr)将表达式expr执行count次。 into outfile写文件,写入web shellload file读取文件
数据库攻击技巧
and substring(@@version,1,1)==4
如果mysql 的版本为4的话,则页面会返回true union all select 1,2,3 from admin
猜数据库中是否有表名为admin的表存在 union all select 1,2,password from admin
猜数据库中是否有表名为admin的表下面为pssword的列名
通过判断字符的范围一步步判断字段的具体值
and ascii(substring((select concat(username,0x3a,passwd) from users limit 0,1),1,1))>64
and ascii(substring((select concat(username,0x3a,passwd) from users limit 0,1),1,1))>96
and ascii(substring((select concat(username,0x3a,passwd) from users limit 0,1),1,1))>100
and ascii(substring((select concat(username,0x3a,passwd) from users limit 0,1),1,1))>97
lib_mysqludf_sys提供的几个函数
sys_eval,执行任意命令,并将输出返回 sys_exec,执行任意命令,并将退出码返回 sys_get,获取一个环境变量 sys_set,创建或修改一个环境变量
xp_cmdshell
宽字符攻击(未考虑双字节字符的问题)
例如0xbf27->0xbf5c27->字符+0x27
SQL Column Truncaton
字符超长修改admin密码
正确防御SQL注入
使用预编译语句,变量就是变量,语句就是语句 使用存储过程检查数据类型,比如限制输入类型为int 使用安全函数,编码 使用最小权限原则
其他注入攻击
XML注入 代码注入 CLRF通过回车换行符来达到修改日志的、XSS的目的,“0x0d"、”0x0a“
第八章 文件上传漏洞
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。 “文件上传”功能本身没有问题,但有问题的是文件上传后,服务器怎么处理,解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。 大多数情况下,文件上传漏洞一般都是指“上传Web脚本能够被服务器解析”的问题,也就是通常说的webshell的问题。要完成这个攻击,要满足几个条件: 1.上传的文件能够被Web容器解释执行。所以文件上传后所在目录要是Web容器所覆盖到的路径。 2.用户能够从Web上访问这个文件。如果文件上传了,但用户无法通过Web访问,或者无法使得Web容器解释这个脚本,就不能称之为漏洞。 3.用户上传的文件若被安全检查,格式化,图片压缩等功能改变了内容,则可能导致攻击不成功。
FCKEditor文件上传漏洞
FCKEditor文件上传后会保存在/UserFiles/all/目录下,由于其只限制"php"、“php3”、“php5”、"asp"等,黑名单是非常不好的设计思想,借此我们可以上传“php2”、“php4”、“inc”、“pwml”、“cer”等文件。
绕过
使用0x00字符例如上传xxx.php[\\0].jpg,[\\0]会被php、C等代码认为是终止符,将后面的.jpg截断。
瞒天过海,使用jpg的文件头偷偷藏下php代码。(注意,需要后缀名以便于调用php解释器)
各类系统的文件解析问题
apache解析漏洞
在Apache1.x,2.x中,有以下特性:对于文件名的解析是从后往前解析的,例如xx.php.rar.rar,由于Apache的mime.types文件下没有.rar这个文件类型,所以这会将其遍历解析为php类型的文件
IIS6文件解析漏洞
当文件名为abc.asp;abc.jpg,由于“;”会将其解析为abc.asp错将/*.asp/目录下的所有文件都以asp文件格式进行解析,例如http://www.abc.com/path/xyz.asp/abc.jpg这时就会将abc.jpg以asp文件格式进行解析
PUT方法
能够上传文件到指定的目录 下,MOVE方法能够将文本文件改写为脚本文件
防御
文件上传的目录设置为不可执行
使得攻击者即使上传了脚本文件,服务器也不得进行执行
判断文件类型
使用白名单的方式
使用随机数
改写文件名和文件路径使用随机数进行重命名,使得文件名进行改写从而使文件不能执行例如shell.php.rar.rar
第九章 认证与会话管理
认证与授权
目的
认证的目的是为了认出用户是谁,而授权的目的是为了决定用户能够做什么。
钥匙在认证的过程中,被称为“凭证”(Credential),开门的过程,对应的是登录(Login)。可是开门之后,什么事情能做,什么事情不能做,就是“授权”的管理范围了。开门之后,“能否进入卧室”这个权限被授予的前提,是需要识别出来的人到底是主人还是客人,所以如何授权是取决于认证的。 持有主人钥匙的人一定是主人吗?钥匙仅仅是一个很脆弱的凭证,其他的有诸如指纹,人脸,声音等生物特征来识别一个人的凭证。 认证实际上就是一个验证凭证的过程。
MD5
密码的保存必须是不可逆的加密方式进行加密,常见的有MD5和SHA-1彩虹表可以对MD5进行破解。彩虹表的思路是收集尽可能多的密码明文和明文对应的MD5值。这样只需要查询MD5值,就能找到该MD5值对应的明文。 为了避免密码哈希值泄露后,黑客能够直接通过彩虹表查询出密码明文,在计算密码明文的哈希值时,增加一个“Salt”。“Salt”是一个字符串,它的作用是增加明文的复杂度,并使得彩虹表一类的攻击失效。
Session与认证
Session是指一个会话,当用户对于同一网站页面进行请求时,为了告诉是哪个用户进行页面的浏览,那么直接告诉服务器使用哪一个Session,浏览器只需要把当前用户持有的SessionID告知服务器即可。 SessionID除了可以加密保存在Cookie中,也可以直接写入URL中。但直接写入URL中的话可能会被直接获得导致被非法授权。
Session Fixation攻击
黑客构造一个包含SessionID的URL,诱导用户进行登录,由于用户进行登录了,所以这个SessionID是有效的,这是黑客就可以使用这个URL进入这个用户的账户。
Session保持攻击
通过一直不断地刷新网页来达到Session不过期通过 XSS攻击将Cookie的Expire设置为永不过期
单点登录 SSO
它希望用户只需要登录一次,就可以访问所有的系统
OpenID
使用URL作为每一个用户的身份标识,用户只需要提供他的OpenID和他的OpenID的提供者,就能够首先先跳转到这个OpenID的提供方进行验证之后,重定向会网站。
第十章 访问控制
在Linux中,常见的访问控制有读、写、执行三种。不同用户对其三种的权限可能都不相同。在Web应用中,根据访问客体的不同,常见的访问控制可以分为: 1.“基于URL的访问控制”, 2.“基于方法的访问控制”, 3.“基于数据的访问控制”。
垂直权限
访问控制实际上是建立用户与权限之间的对应关系。现在广泛的做法是,“基于角色的访问控制(Role-Based Access Control)”,简称RBAC。不同的角色权限是有高低之分的,高权限角色往往能够访问低权限的角色资源,而低权限访问高权限角色的资源是往往被禁止的。
水平权限
相同权限下不同角色的不同资源。 但借此可能会触发水平越权的情况。
OauthOAuth
是一个在不提供用户名和密码的情况下,授权第三方应用访问Web资源的安全协议。 OAuth与OpenID都致力于让互联网变得更加的开放。OpenID解决的是认证问题,OAuth则更注重授权。认证和授权的关系其实是一脉相承的,后来人们发现,其实更多的时候真正需要的是对资源的授权。
第十一章 加密算法与随机数
加密攻击
唯密文攻击
仅知道密文对其进行攻击
已知明文攻击
是指黑客不仅知道密文,还知道这些密文所对应的明文。
选择明文攻击
攻击者不仅能得到一些密文和明文,还能选择用于加密的明文
选择密文攻击
攻击者可以选择不同的密文进行解密
密码学里的基本原则
密码系统的安全性应该依赖于密钥的复杂性,而不应该依赖于算法的保密性。 在安全领域里,选择一个足够安全的加密算法不是困难的事情,难的是密钥管理。 最常见的错误,就是将密钥硬编码在代码里。对于Web应用来说,常见的做法是将密钥(包括密码)保存在配置文件或者数据库中。密钥所在的配置文件或数据库需要严格的控制访问权限。同时也要确保运维或DBA中具有访问权限的人越少越好。 一个比较安全的密钥管理系统,可以将所有的密钥(包括一些敏感配置文件)都集中保存在一个服务器(集群)上,并通过Web Service的方式提供获取密钥的API。每个Web应用在需要使用密钥时,通过带认证信息的API请求密钥管理系统,动态获取密钥。Web应用不能把密钥写入本地文件中,值加载到内存,这样动态获取密钥最大程度地保护了密钥的私密性。密钥集中管理,降低了系统对于密钥的耦合性,也有利于定期更换密钥。
伪随机数问题
伪随机数是通过一系列的数学算法生成的随机数,所以可能会导致伪随机数不够随机的现象产生。所对应的真随机数就是物理系列所生成的随机数,比如电压的波动,硬盘磁头读/写时的寻道时间,空中电磁波的噪声等。
通过时间->MD5形成的随机数可能会被猜解
使用seed产生的随机数可能会被暴力破解
第十二章 Web框架安全
数据的处理是复杂的,数据经过不同逻辑的处理后,其内容可能出现变化。比如数据经过toLowercase,会把大写变成小写;而一些编码和解码,则可能把GBK变成Unicode。所以一个优秀的安全方案 应该在正确的地方做正确的事,考虑数据可能的变化,认真斟酌安全检查的插入时机。
第十三章 应用层拒绝服务攻击
定义
分布式拒绝服务攻击,将正常请求放大了若干倍,通过若干个网络节点同时发起攻击,以达成规模效应。这些网络节点往往是黑客们所控制的“肉鸡”,数量达到一定规模后,就形成了一个“僵尸网络”。大型的僵尸网络,甚至达到了数万、数十万台的规模。如此规模的僵尸网络发起的DDOS攻击,几乎是不可阻挡的。 常见的DDOS攻击有SYN flood、UDP flood、ICMP flood等。其中 SYN flood是一种最为经典的DDOS攻击,其发现于1996年,但至今仍然保持着非常强大的生命力。SYN flood如此猖獗是因为它利用了TCP协议设计中的缺陷,而TCP/P协议是整个互联网的基础,牵一发而动全身,如今想要修复这样的缺陷几乎成为不可能的事情。
三次握手的缺陷
(1)客户端向服务器端发送一个SYN包,包含客户端使用的端口号和初始序列号x (2)服务器端收到客户端发送来的SYN包后,向客户端发送一个SYN和ACK都置位的TCP报文,包含确认号x+1和服务器端的初始序列号y (3)客户端收到服务器端返回的SYN+ACK报文后,向服务器端返回一个确认号为y+1、序号为x+1的ACK报文,一个标准的TCP连接完成。而SYN flood在攻击时,首先伪造大量的源IP地址,分别向服务器端发送大量的SYN包,此时服务器端会返回SYN/ACK包,因为源地址是伪造的,所以伪造的IP并不会应答,服务器端没有收到伪造IP的回应,会重试3~5次并且等待一个SYN Time(一般为30秒至2分钟),如果超时则丢弃这个连接。攻击者大量发送这种伪造源地址的SYN 请求,服务器端将会消耗非常多的资源(CPU和内存)来处理这种半连接,同时还要不断地对这些IP进行SYN+ACK重试。最后的结果是服务器无暇理睬正常的连接请求,导致拒绝服务。
应用层DDOS攻击
CC攻击
CC攻击的原理非常简单,就是对一些消耗资源比较大的应用不断发起正常的请求,以达到消耗服务器资源的目的。在Web应用中,查询数据库,读/写硬盘文件等操作,相对都会消耗比较多的资源。配合XSS,在一些流量比较大的网页上添加攻击目标的网页请求,当访问被攻击页面的用户,就会对其进行请求以达到攻击的目的。 使用代理隐藏、不断变化IP一直从而来绕过应用中针对于某一个请求的请求频率做出的限制。
验证码
如果是忽略对用户体验的影响,引用验证码这一手段能够有效地阻止自动化重放的行为。嵌入验证码能够有效防止资源滥用,因为脚本通常无法自动识别出验证码 验证码的验证过程就是将用户提交的验证码明文与服务端的Session里保存的验证码明文进行对比
防御DDOS——增加人机认证
资源耗尽攻击
Slowloris
攻击以极低的速度往服务器发送http请求,由于HTTP包头中是以两个CLRF来表示HTTPHeaders部分结束的,所以发一个\\r\\n后再发一个包头来做到服务器一直等待。
HTTP POST DOS
在发送HTTP POST包时,指定一个非常大的Content-Length值,然后以极低的速度发送数据包,比如10-100s发送一个字节,然后导致服务器一直不断开连接
Server Limit DOSWeb Server
对于HTTP包头都有长度限制,比如Apache默认是8192字节。若攻击者通过XSS攻击,往客户端写了一个超长的Cookie,那么就会导致WebServer默认会认为这是一个超长的非正常请求,导致客户端的拒绝服务。
第十四章 PHP安全
文件包含漏洞
使用方法
include() require() include_once() require_once()
<?php include($_GET[test]);?> #这意味着引用同目录下的test变量文件为php代码
原理
使用了这四个函数去包含一个新文件时,这个文件都会以PHP代码进行执行,PHP内核并不会在意该被包含的文件是什么类型。所以如果被包含的是txt文件、jpg文件、远程url,也都会当成PHP进行执行
远程文件包含
如果php配置文件的allow_url_include为ON则include/require
文件包含使用方法
记一次文件包含
远程文件包含使用方法
记一次远程文件包含
变量覆盖漏洞
当php.ini的register_globals=on时会出现PHP中的代码变量会被cookie、表单中的变量赋值的情况
实现
记一次变量覆盖漏洞
第十五章 Web Server配置安全
Apache安全
默认启动的Module出现的高危漏洞非常少,大多数的高危漏洞集中在默认没有安装或enable的Module上 因此,检查Apache安全的第一件事情就是检查Apache的Module安装情况,根据“最小权限原则”,应该尽可能地减少不必要的Module,对于要使用的Module,则检查其对应版本是否已经存在已知的安全漏洞。
使用root或者是admin权限运行Apache的结果可能是灾难性的
黑客入侵Web成功时,直接获得高权限的Shell 应用程序将获得高权限,如果出现bug时会导致可能会删除本地文件、杀死进程等不可预知的结果 保护好Apache Log
Nginx的配置非常灵活,在对抗DDOS和CC攻击方面也能得到一定的缓和
第四篇 互联网公司安全运营
第十六章 互联网业务安全
安全开发流程,能够帮助企业以最小的成本提高产品的安全性,它符合“Secure at the source”的战略思想。实施好安全开发流程,对企业安全的发展来说,可以起到事半功倍的效果。
产品需要什么样的安全
安全是产品的一个组成部分。一个好的产品,在设计之初就应该考虑是否会出现安全隐患,从而提前准备好相应的策略。
什么是好的安全方案
对于认证,最基本的选择就是用户名和密码认证,在一些敏感系统会进行双因素认证。比如网上银行办理的“U盾”、“动态口令”、“令牌”“手机短信验证码”等。然而,这些例如手机验证码加用户名密码的认证手段会降低用户体验,“U盾”、“令牌”的制作成本较高。 安全是产品的特性,如果产品能够潜移默化地培养用户的安全习惯,将用户往安全的行为上进行引导,那么这样的安全就是最理想的产品安全。
业务逻辑安全
通过账户绑定使得一个账户被盗导致另一个绑定的账户也一起被盗 密码错误多少次以后锁定账户,可能会被恶意攻击者恶意攻击导致密码错误锁定 审核过的消息进行更改不需要重新审核导致瞒天过海
邮箱钓鱼
对邮件进行签名
第十七章 安全开发流程
需求分析与设计
开发阶段
提供安全的函数 代码安全审计
测试阶段
XSS、SQL注入、PHP FILE INCLUDE可以使用自动化工具检测,而CSRF、越权访问、文件上传需要手工进行检测
第十八章 安全运营
安全监测
入侵检测
紧急响应
脑图
白帽子讲Web安全
在安全圈子里,素有 “白帽”、“黑帽”一说。
黑帽子是指那些造成破坏的黑客,而白帽子则是研究安全,但不造成破坏的黑客。 白帽子
均以建设更安全的互联网为己任。
不想拿到 “root”的黑客,不是好黑客。漏洞利用代码能够帮助黑客们达成这一目标。黑
客们使用的漏洞利用代码,被称为 “exploit”。在黑客的世界里,有的黑客,精通计算机技术,
能自己挖掘漏洞,并编写 exploit;而有的黑客,则只对攻击本身感兴趣,对计算机原理和各种
编程技术的了解比较粗浅,因此只懂得编译别人的代码,自己并没有动手能力,这种黑客被称
为 “Script Kids”,即“脚本小子”。在现实世界里,真正造成破坏的,往往并非那些挖掘并研
究漏洞的 “黑客”们,而是这些脚本小子。而在今天已经形成产业的计算机犯罪、网络犯罪中,
造成主要破坏的,也是这些 “脚本小子”。
崇尚分享、自由、免费的互联网精神,并热衷于分享自己的最新研究成果。 -->黑客精神
浏览器攻击 (分支之一):
黑客构造一个恶意网页,诱使用户使用浏览器访问该网页,利用浏览器中存在的某些漏洞,比如一个缓冲区溢出漏洞,执行 shellcode,通常是下载一个木马并在用户机器里执行。
SQL注入的出现是Web安全史上的一个里程碑。
XSS(跨站脚本攻击)的出现则是 Web 安全史上的另一个里程碑。
白帽子一般为企业或安全公司服务,工作的出发点
就是要解决所有的安全问题,因此所看所想必然要求更加的全面、宏观;黑帽子的主要目的是要入侵系统,找到对他们有价值的数据,因此黑帽子只需要以点突破,找到对他们最有用的一
点,以此渗透,因此思考问题的出发点必然是有选择性的、微观的。
WEB安全:
通过一个安全检查(过滤、净化)的过程,可以梳理未知的人或物,使其变得可信任。被划分出来的具有不同信任级别的区域,我们称为信任域,划分两个不同信任域之间的边界,我们称为信任边界。
数据从高等级的信任域流向低等级的信任域,是不需要经过安全检查的;数据从低等级的信任域流向高等级的信任域,则需要经过信任边界的安全检查。
例子:
我们在机场通过安检后,想要从候机厅出来,是不需要做检查的;但是想要再回到候机厅,则需要再做一次安全检查,就是这个道理。
安全问题的本质是信任的问题。
例子:
假设我们有份很重要的文件要好好保管起来,能想到的一个方案是把文件 “锁”
到抽屉里。这里就包含了几个基本的假设,首先,制作这把锁的工匠是可以信任的,他没有私自藏一把钥匙;其次,制作抽屉的工匠没有私自给抽屉装一个后门;最后,钥匙还必须要保管在一个不会出问题的地方,或者交给值得信任的人保管。
安全三要素 (CIA):
1.机密性要求保护数据内容不能泄露,加密是实现机密性要求的常见手段。
2.完整性则要求保护数据内容是完整、没有被篡改的。常见的保证一致性的技术手段是数字签名。
3.可用性要求保护资源是“随需而得”。
例子:
假设一个停车场里有 100 个车位,在正常情况下,可以停 100 辆车。但是在某一天,有个坏人搬了 100 块大石头,把每个车位都占用了,停车场无法再提供正常服务。在安全领域中这种攻击叫做拒绝服务攻击,简称 DoS(Denial of Service)。拒绝服务攻击破坏的是安全的可用性。
安全评估过程分为:
资产等级划分、威胁分析、风险分析、确认解决方案。
互联网安全的核心问题,是数据安全的问题。
对互联网公司拥有的资产进行等级划分,
就是对数据做等级划分。
了解公司最重要的资产是什么,他们最看重的数据是什么。
接下来就是要划分信任域和信任边界了。
从网络逻辑上来划分。
例子:
比如最重要的数据放在数据库里,那么把数据库的服务器圈起来; Web 应用可以从数据库中读/写数据,并对外提供服务,那再把 Web 服务器圈起来;最外面是不可信任的 Internet。
信任域划好之后,我们如何才能确定危险来自哪里呢?
在安全领域里,我们把可能造成危
害的来源称为威胁( Threat),而把可能会出现的损失称为风险(Risk)。
威胁建模:
在进行威胁分析时,要尽可能地不遗漏威胁,头脑风暴的过程可以确定攻击面( Attack
Surface)。
风险分析:
风险由以下因素组成:
Risk = Probability * Damage Potential
设计安全方案:
一个优秀的安全方案应该具备以下特点:
m 能够有效解决问题;
m 用户体验好;
m 高性能;
m 低耦合;
m 易于扩展与升级。
1.Secure By Default 原则:
也可以归纳为白名单、黑名单的思想。
例子 A:
比如,在制定防火墙的网络访问控制策略时,如果网站只提供 Web 服务,那么正确的做法
是只允许网站服务器的 80 和 443 端口对外提供服务,屏蔽除此之外的其他端口。这是一种“白
名单 ”的做法;如果使用“黑名单”,则可能会出现问题。假设黑名单的策略是:不允许 SSH
端口对 Internet 开放,那么就要审计 SSH 的默认端口:22 端口是否开放了 Internet。但在实际
工作过程中,经常会发现有的工程师为了偷懒或图方便,私自改变了 SSH 的监听端口,比如
把 SSH 的端口从 22 改到了 2222,从而绕过了安全策略。
例子 B:
又比如,在网站的生产环境服务器上,应该限制随意安装软件,而需要制定统一的软件版
本规范。这个规范的制定,也可以选择白名单的思想来实现。按照白名单的思想,应该根据业
务需求,列出一个允许使用的软件以及软件版本的清单,在此清单外的软件则禁止使用。如果
允许工程师在服务器上随意安装软件的话,则可能会因为安全部门不知道、不熟悉这些软件而
导致一些漏洞,从而扩大攻击面。
在 Web 安全中,对白名单思想的运用也比比皆是。
例子:
比如应用处理用户提交的富文本时,考
虑到 XSS 的问题,需要做安全检查。常见的 XSS Filter 一般是先对用户输入的 HTML 原文作
HTML Parse,解析成标签对象后,再针对标签匹配 XSS 的规则。这个规则列表就是一个黑白
名单。如果选择黑名单的思想,则这套规则里可能是禁用诸如 <script>、<iframe>等标签。但是
黑名单可能会有遗漏,比如未来浏览器如果支持新的 HTML 标签,那么此标签可能就不在黑
名单之中了。如果选择白名单的思想,就能避免这种问题 ——在规则中,只允许用户输入诸如
<a>、<img>等需要用到的标签。
然而,并不是用了白名单就一定安全了。
选择白名单的思想,基于白名单来设计安全方案,其实就是信任白名单是好的,是安全的。但是一旦这个信任基础不存在了,那么安全就荡然无存。
在 Flash 跨域访问请求里,是通过检查目标资源服务器端的 crossdomain.xml 文件来验证是
否允许客户端的 Flash 跨域发起请求的,它使用的是白名单的思想。
比如下面这个策略文件:
指定了只允许特定域的 Flash 对本域发起请求。可是如果这个信任列表中的域名变得不可
信了,那么问题就会随之而来。比如:
通配符 “*”,代表来自任意域的 Flash 都能访问本域的数据,因此就造成了安全隐患。所
以在选择使用白名单时,需要注意避免出现类似通配符 “*”的问题。
Secure By Default 的另一层含义就是“最小权限原则”。
要求系统只授予主体必要的权限,而不要过度授权,这样能有效地减
少系统、网络、应用、数据库出错的机会。
比如在 Linux 系统中,一种良好的操作习惯是使用普通账户登录,在执行需要 root 权限的
操作时,再通过 sudo 命令完成。这样能最大化地降低一些误操作导致的风险。
在使用最小权限原则时,需要认真梳理业务所需要的权限,在很多时候,开发者并不会意
识到业务授予用户的权限过高。在通过访谈了解业务时,可以多设置一些反问句,比如:您确
定您的程序一定需要访问 Internet 吗?通过此类问题,来确定业务所需的最小权限。
2.纵深防御原则:
首先,要在各个不同层面、不同方面实施安全方案,避免出现疏
漏,不同安全方案之间需要相互配合,构成一个整体;其次,要在正确的地方做正确的事情,
即:在解决根本问题的地方实施针对性的安全方案。
例子:
某矿泉水品牌曾经在广告中展示了一滴水的生产过程:经过十多层的安全过滤,去除有害物质,
最终得到一滴饮用水。这种多层过滤的体系,就是一种纵深防御,是有立体层次感的安全方案。
在常见的入侵案例中,大多数是利用 Web 应用的漏洞,攻击者先获得一个低权限的 webshell,
然后通过低权限的 webshell 上传更多的文件,并尝试执行更高权限的系统命令,尝试在服务器上
提升权限为 root;接下来攻击者再进一步尝试渗透内网,比如数据库服务器所在的网段。
在这类入侵案例中,如果在攻击过程中的任何一个环节设置有效的防御措施,都有可能导
致入侵过程功亏一篑。
就入侵的防御来说,我们需要考虑的可能有 Web 应用
安全、 OS 系统安全、数据库安全、网络环境安全等。在这些不同层面设计的安全方案,将共
同组成整个防御体系,这也就是纵深防御的思想 (第一层含义)。
在 XSS 防御技术的发展过程中,曾经出现过几种不同的解决思路,直到最近几年 XSS 的
防御思路才逐渐成熟和统一。
在一开始的方案中,主要是过滤一些特殊字符,比如:
<<笑傲江湖>> 会变成 笑傲江湖
尖括号被过滤掉了。
但是这种粗暴的做法常常会改变用户原本想表达的意思,比如:
1<2 可能会变成 1 2
造成这种 “乌龙”的结果就是因为没有“在正确的地方做正确的事情”。
对于 XSS 防御,
对系统取得的用户输入进行过滤其实是不太合适的,因为 XSS 真正产生危害的场景是在用户
的浏览器上,或者说服务器端输出的 HTML 页面,被注入了恶意代码。只有在拼装 HTML 时
输出,系统才能获得 HTML 上下文的语义,才能判断出是否存在误杀等情况。(第二层含义)
3.数据与代码分离原则:
广泛适用于各种由于 “注入”而引发安全问题的场景。
例子 A:
实际上,缓冲区溢出,也可以认为是程序违背了这一原则的后果 ——程序在栈或者堆中,
将用户数据当做代码执行,混淆了代码与数据的边界,从而导致安全问题的发生。
例子 B:
4.不可预测性原则:
前面介绍的几条原则: Secure By Default,是时刻要牢记的总则;纵深防御,是要更全面、
更正确地看待问题;数据与代码分离,是从漏洞成因上看问题;接下来要讲的 “ 不可预测性”
原则,则是从克服攻击方法的角度看问题。
微软使用的 ASLR 技术,在较新版本的 Linux 内核中也支持。在 ASLR 的控制下,一个程
序每次启动时,其进程的栈基址都不相同,具有一定的随机性,对于攻击者来说,这就是 “不
可预测性 ”。
不可预测性( Unpredictable),能有效地对抗基于篡改、伪造的攻击。
例子:
不可预测性原则,可以巧妙地用在一些敏感数据上。比如在 CSRF 的防御技术中,通常会
使用一个 token 来进行有效防御。这个 token 能成功防御 CSRF,就是因为攻击者在实施 CSRF
攻击的过程中,是无法提前预知这个 token 值的,因此要求 token 足够复杂时,不能被攻击者
猜测到。
点击劫持 (ClickJacking):
点击劫持是一种视觉上的欺骗手段。攻击者使用一个透明的、不可见的 iframe,覆盖在一
个网页上,然后诱使用户在该网页上进行操作,此时用户将在不知情的情况下点击透明的 iframe
页面。通过调整 iframe 页面的位置,可以诱使用户恰好点击在 iframe 页面的一些功能性按钮上。
例子:
有个 test.html页面
Flash点击劫持:
攻击者通过 Flash 构造出了点击劫持,
在完成一系列复杂的动作 (每次点击后,按钮的位置都会发生变化)后,最终控制了用户电脑的摄像头。
图片覆盖攻击:
例子:
由于 <img>标签在很多系统中是对用户开放的,因此在现实中有非常多的站点存在被 XSIO
攻击的可能。在防御 XSIO 时,需要检查用户提交的 HTML 代码中,<img>标签的 style 属性是
否可能导致浮出。
拖拽劫持与数据窃取:
目前很多浏览器都开始支持 Drag & Drop 的 API。对于用户来说,拖拽使他们的操作更加
简单。浏览器中的拖拽对象可以是一个链接,也可以是一段文字,还可以从一个窗口拖拽到另
外一个窗口,因此拖拽是不受同源策略限制的。
“拖拽劫持”的思路是诱使用户从隐藏的不可见 iframe 中“拖拽”出攻击者希望得到的数
据,然后放到攻击者能控制的另外一个页面中,从而窃取数据。
例子:
ClickJacking 3.0:触屏劫持
一次触屏操作,可能会对应以下几个事件:
touchstart,手指触摸屏幕时发生;
touchend,手指离开屏幕时发生;
touchmove,手指滑动时发生;
touchcancel,系统可取消 touch 事件。
左边的图片,最上方显示了浏览器地址栏,同时攻击者在页面中画出了一个假的地址栏;
中间的图片,真实的浏览器地址栏已经自动隐藏了,此时页面中只剩下假的地址栏;
右边的图片,是浏览器地址栏被正常隐藏的情况。
这种针对视觉效果的攻击可以被利用进行钓鱼和欺诈。
防御 ClickJacking:
针对传统的 ClickJacking,一般是通过禁止跨域的 iframe 来防范。
因为 frame busting 存在被绕过的可能,所以我们需要寻找其他更好的解决方案。一个比较
好的方案是使用一个 HTTP 头——X-Frame-Options。
在支持 X-Frame-Options的浏览器上
MVC 框架安全:
SQL注入是Model 层需要解决的问题。
模板引擎与 XSS 防御:
XSS 攻击是在用户的浏览器上执行的,
其形成过程则是在服务器端页面渲染时,注入了恶意的 HTML 代码导致的。从 MVC 架构来说,
是发生在 View 层,因此使用“输出编码”的防御方法更加合理,这意味着需要针对不同上下
文的 XSS 攻击场景,使用不同的编码方式。
Web 框架与 CSRF 防御:
在 Web
框架中可以使用 security token 解决 CSRF 攻击的问题。
CSRF 攻击的目标,一般都会产生“写数据”操作的 URL,比如“增”、“删”、“改”;而
“读数据”操作并不是 CSRF 攻击的目标,因为在 CSRF 的攻击过程中攻击者无法获取到服务
器端返回的数据,攻击者只是借用户之手触发服务器动作,所以读数据对于 CSRF 来说并无直
接的意义(但是如果同时存在 XSS 漏洞或者其他的跨域漏洞,则可能会引起别的问题,在这
里,仅仅就 CSRF 对抗本身进行讨论)。
因此,在 Web 应用开发中,有必要对“读操作”和“写操作”予以区分,比如要求所有的
“写操作”都使用 HTTP POST。
在 Ajax 请求中,一般是插入一个包含了 token 的 HTTP 头,使用 HTTP 头是为了防止 token
泄密,因为一般的 JavaScript 无法获取到 HTTP 头的信息,但是在存在一些跨域漏洞时可能会
出现例外。
HTTP Headers 管理:
对于框架来说,管理好跳转目的地址是很有必要的。一般来说,可以在两个地方做
这件事情:
( 1)如果 Web 框架提供统一的跳转函数,则可以在跳转函数内部实现一个白名单,指定跳
转地址只能在白名单中;
( 2)另一种解决方式是控制 HTTP 的 Location 字段,限制 Location 的值只能是哪些地址,
也能起到同样的效果,其本质还是白名单。
有很多与安全相关的 Headers,也可以统一在 Web 框架中配置。比如用来对抗 ClickJacking
的 X-Frame-Options,需要在页面的 HTTP Response 中添加:
X-Frame-Options: SAMEORIGIN
数据持久层与 SQL 注入:
使用 ORM(Object/Relation Mapping)框架对 SQL 注入是有积极意义的。我们知道对抗
SQL 注入的最佳方式就是使用“预编译绑定变量”。
以上是关于白帽子讲web安全(精写含思维导图)的主要内容,如果未能解决你的问题,请参考以下文章
白帽子讲Web安全
白帽子讲Web安全--读书笔记
[笔记]《白帽子讲Web安全》- Web框架安全
《白帽子讲Web安全》笔记1-5章
好书推荐写Web必须知道的安全知识 | 《白帽子讲Web安全》
好书推荐写Web必须知道的安全知识 | 《白帽子讲Web安全》