这本书一直没时间去看,虽然有电子书但是还是喜欢纸质书本的气息,道哥作品,这本书真的是一本非常经典且非常有深度的一本安全类书籍,给予了我很大的帮助,本篇文章记录一下书中所讲不熟悉之处。
安全工程师的核心竞争力不在于他能拥有多少个0day,掌握多少种安全技术,而是在于他对安全理解的深度,以及由此引申的看待安全问题的角度和高度。
0x01 世界观安全
安全三要素
机密性、完整性、可用性
安全评估过程
资产等级划分、威胁分析、风险分析、确认解决方案
白帽子兵法
Secure by default、最小权限、纵深防御、数据代码分离、不可预测性
五大原则
互联网本来是安全的,自从有了研究安全的人,就变得不安全了。
0x02 浏览器安全
Orign
浏览器同源策略是浏览器安全基础
浏览器沙箱
恶意网址拦截
0x03 跨站脚本攻击(XSS)
Cross Site Script
反射、存储、DOM Based
远程Payload:
var img = document.createElement("img");
img.src = "http://blog.dyboy.cn/index.do?m=delete&id=123";
document.body.appendChild(img);
类似还有表单,XMLHttpRequest
XSS Worm
CSS中 background:url('javascript:alert(1)')
Flash XSS
XSS防御:HttpOnly
、浏览器filter
0x04 跨站请求伪造(CSRF)
Cross Site Request Forgery
对于CSRF漏洞的利用,我最初的想法是在因为业务没有验证token,目标网站管理员在浏览黑客精心搭建的网页时,导致CSRF攻击,相当于在第三方网站中执行了管理网站的操作请求。
浏览器持有 Third-party Cookie
是本地Cookie(可设置时效,本地存储),Session Cookie
浏览器关闭即失效(内存中)
P3P : 允许跨域访问隐私数据
Flash Csrf
Csrf防御: 验证码、Referer Check
,Anit Csrf Token
Token
尽量位于表单,敏感操作改为POST
提交,XSS做好防护,否则CSRF防御也只是空中楼阁
0x05 点击劫持(ClickJacking)
拖拽劫持 数据窃取 触屏劫持
防御:JavaScript
禁止iframe
嵌套 HTTP头X-Frame-Options
iframe
可设置 sandbox
参数
0x06 SQL注入
盲注(Blind Injection
)
Timing Attack
: BENCHMARK(count,expr)
用于延时,当然还有sleep()
命令注入:UDF
xp_cmdshell
sysadmin
权限下可开启sp_configure
,sp_addextendproc
开启此功能
xp_regread
操作注册表等等很多,在SQLMAP下已经集成
宽字节注入
SQL Column Truncation
strict
模式
防御SQL注入攻击: mysql_real_escape_string()
转义 预编译语句,绑定变量 数据类型检查
0x07 XML注入
代入数据,改变了xml结构
0x08 代码注入
eval()
assert()
system()
等
防御:禁用此类危险函数
0x09 CRLF注入
Carriage Return, Line Feed -> \r\n
使用CRLF的地方都可能存在此类型注入,如Log和HTTP头(Http Response Spliting
)
0x10 文件上传漏洞
解析问题、脚本文件、文件包含
黑名单的检测方式
绕过:0x00
、伪造文件头
Apache
解析问题:文件名从后往前直到一个认识的文件类型为止
IIS
文件解析问题:截断字符 ;
,/a.asp/
路径下所有类型文件当作asp
解析,PUT method
(上传),MOVE method
(改名),DELETE method
...
使用 OPTIONS /HTTP/1.1
探测服务器信息
PHP CGI
路径解析问题:test.jpg/.php
当作php脚本执行
利用上传文件钓鱼
防御:白名单、上传目录不可写不可执行、单独设置文件域名、随机数写文件名白名单类型
0x11 认证与会话管理
Authentication
认证实际上就是一个验证凭证的过程
单/双/多因素认证
OWASP 推荐策略
加salt hash
session
Session Fixation
攻击
Session 保持攻击
SSO
(单点登录)
0x12 访问控制
Authorization
读、写、执行
垂直和水平越权
OAuth:授权第三方应用
0x13 加密算法问题
分组加密算法有:DES,3-DES,Blowfish,IDEA,AES等
流密码加密算法:RC4,ORYX,SEAL等
Reused Key Attack
Bit-flipping Attack
ECB模式缺陷在于 电码薄式的方式 调换明文位置,密文位置调换,如此变动可反向推算
Padding Oracle Attack
MD5 Length Extention Attack
密钥等不要硬编码在程序代码中
不要使用ECB
模式
不要使用流密码
使用HMAC-SHA1
代替MD5
甚至代替SHA-1
不要使用相同的key
做不同的事情
salts
与 IV
要随机产生
不要自己实现加密算法,尽量使用安全专家已实现好的库
不要依赖系统的保密性
使用CBC
模式的AES256
加密
使用HMAC-SHA512
检查完整性
使用带salt
的SHA-256
或SHA-512
用于Hashing
0x14 伪随机数问题
弱随机问题,纯数字4-6位都是属于弱随机
伪随机因为时间时刻推倒的,php中的 microtime()
由一个微秒数和系统当前秒数组合
PHP中有rand()
(范围:32767)和mt_rand()
(范围2147483647)的随机数算法。
mt_rand()
函数通过seed
来计算出的伪随机数,其值固定,多次计算所得值也固定。当在统一进程中,同一个seed
通过mt_rand()
所生成的值都是固定的。
安全的随机数:random_int(),多种随机算法结合,时间取md5某几位值等方式,openssl_random_pseudo_bytes(int length [, bool &$crypto_strong])
0x15 WEB框架安全
Model-View-Controller
这里其实就是产品的安全讨论,在MVC中变量等地方容易出现XSS等问题,在对的地方做对的事情,针对性的处理安全隐患,做好程序的过滤和拦截,前端拦截只是对正常用户误操作的提示,节省服务器资源,但同时必须做好后端对参数的检查过滤。在常见的漏洞中,每个部分的功能与可能发生的漏洞对应做好检查和防御
Struts2 命令执行漏洞
Spring MVC 命令执行漏洞
Django 命令执行漏洞
0x16 拒绝服务攻击(DDOS)
DDOS 分布式拒绝服务攻击
有SYN flood
、UDP flood
、ICMP flood
等,之前小东的网站遇到过NTP flood
的攻击,放大倍数在700左右,最后直接关了服务器的NTP服务。
例如对于SYN flood
有SYN cookie/SYN proxy
、safereset
等算法,大致思想史根据访问频率来判断是否及时丢弃来自该IP的包,在众多对抗DDOS的产品中,都是根据DDOS的特征结合相应的算法来进行流量清洗。对抗DDOS的网络设备可串联或者并联在网络的出口处。
应用层的DDOS
发生在应用层,三次TCP握手已经完成,也叫做CC攻击
(Challenge Collapasar
),其原理就是对于web应用上比较耗费资源的页面进行频繁的访问,导致服务器的资源耗尽而造成的DDOS攻击。还有就是黑客入侵了某个流量非常大的网站,然后内嵌攻击目标的网站iframe
网页,导致目标网站直接拒绝服务。
面对应用层的攻击,归根结底就是限制访问频率,一般根据cookie
和IP
确定唯一客户端,并根据访问频率判断是否重定向,给一个参考例子:
session_start();
$seconds = '1'; //1秒钟内
$refresh = '3'; //刷新次数
$cur_time = time();
if(isset($_SESSION['last_time'])){ $_SESSION['refresh_times'] += 1; }
else{ $_SESSION['refresh_times'] = 1; $_SESSION['last_time'] = $cur_time; }
if($cur_time - $_SESSION['last_time'] < $seconds){ if($_SESSION['refresh_times'] >= $refresh){
header("Location: http://127.0.0.1/"); //如果1秒中刷新三次,则重定向到该客户端
exit('you refresh too quickly!');
}
}
else{
$_SESSION['refresh_times'] = 0;
$_SESSION['last_time'] = $cur_time;
}
防御方式:代码性能优化,利用好memcache
将数据库的压力尽可能的转移到内存中,还需要及时的释放资源,关闭数据库连接减少空连接的消耗。
在网络架构上做好优化,善于利用负载均衡分流。同时利用好CDN
和镜像站点分流作用,缓解主站压力。对抗DDOS
的方式有一些小方法在其中,针对不同的业务有不同的处理方式,没有完全适用所有应用服务的方法,只有适用于当前服务的最好方法。
程序上的验证码避免重放攻击,判断HTTP
头中以辨别是否是真实客户端(一般是给客户端一段JavaScript
代码运行得到一个值,值正确则为真实客户端)
在Server
上做好最大连接数限制,响应时间限制,mod_qos
是Apache
的一个Moudle
能够帮助缓解应用层的DDOS
攻击,根据我们的业务不同,我们通过预估本站的平均流量和资源占用情况等来做好服务器资源的最大合理化分配,算法需要自己去编写,可参考开源的一些项目。升级服务器的配置带宽等也是最基本最常见的做法,只是成本会高一些。
资源耗尽型攻击:
构造畸形HTTP
请求(不完整HTTP
请求),服务端认为HTTP Header
没有结束,便会保持连接不释放,当构造多个连接后,服务器连接数达到上限,其他正常客户端便没法儿和服务器建立连接,以此造成业务影响。
例如:HTTP POST DOS
,这个的原理是构造一个content-length
很大的包,但是以10~100s
不等间隔发一个字节,保持连接不断开,以此占用WEB Server
的可用连接数,导致DOS
,这种情况可使用WEB应用防火墙
Server Limit DOS
Cookie
也能造成DOS
,当限制header
头大小的时候,一个超长的cookie
,服务器会返回4xx
错误
ReDOS
正则表达式都是基于NFA
(Nondeterminstic Finite Automanton
)的,它是一个状态机,某些正则表达式写得不好,在黑客的精心构造下也有可能造成资源消耗过大而导致DOS
,存在ReDOS的写法开发人员应当注意,参考文章《浅析ReDoS的原理与实践》
0x17 PHP安全
作者有讲到PHP的安全,PHP现在很多中小型企业都在使用,这个脚本语言开发程序非常方便快捷,封装了很多的内置函数,然而就是这些内置函数在不恰当情况下使用,就导致了应用漏洞存在,常见有文件包含,变量覆盖,代码执行的漏洞,关于PHP安全的文章,博主已经分享了较多文章,可参考。
0x18 互联网公司的运营
最后一部分内容,涉及到宏观安全思维,企业安全管理、安全开发(SDL
)和安全运营方面,作为阅读了解之用
0x19 总结
看完道哥的《白帽子讲WEB安全》,虽然读这本书时带有急功近利的目的,没有细细品读,但是也让我受益良多,重新将现有知识搭建起一个知识框架和体系,慢慢学习,慢慢完善,向前辈致敬!2018-07-27