[读书笔记]《白帽子讲WEB安全》

这本书一直没时间去看,虽然有电子书但是还是喜欢纸质书本的气息,道哥作品,这本书真的是一本非常经典且非常有深度的一本安全类书籍,给予了我很大的帮助,本篇文章记录一下书中所讲不熟悉之处。

安全工程师的核心竞争力不在于他能拥有多少个0day,掌握多少种安全技术,而是在于他对安全理解的深度,以及由此引申的看待安全问题的角度和高度。

《白帽子讲WEB安全》

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 CheckAnit 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等

Reused Key Attack

Bit-flipping Attack

ECB模式缺陷在于 电码薄式的方式 调换明文位置,密文位置调换,如此变动可反向推算

Padding Oracle Attack

MD5 Length Extention Attack

密钥等不要硬编码在程序代码中

不要使用ECB模式

不要使用流密码

使用HMAC-SHA1代替MD5甚至代替SHA-1

不要使用相同的key做不同的事情

saltsIV 要随机产生

不要自己实现加密算法,尽量使用安全专家已实现好的库

不要依赖系统的保密性

使用CBC模式的AES256加密

使用HMAC-SHA512检查完整性

使用带saltSHA-256SHA-512用于Hashing


0x14 伪随机数问题

弱随机问题,纯数字4-6位都是属于弱随机

伪随机因为时间时刻推倒的,php中的 microtime() 由一个微秒数和系统当前秒数组合

PHP中有rand()(范围:32767)和mt_rand()(范围2147483647)的随机数算法。

mt_rand() 函数通过seed来计算出的伪随机数,其值固定,多次计算所得值也固定。当在统一进程中,同一个seed通过mt_rand()所生成的值都是固定的。

破解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 floodUDP floodICMP flood等,之前小东的网站遇到过NTP flood的攻击,放大倍数在700左右,最后直接关了服务器的NTP服务。

例如对于SYN floodSYN cookie/SYN proxysafereset等算法,大致思想史根据访问频率来判断是否及时丢弃来自该IP的包,在众多对抗DDOS的产品中,都是根据DDOS的特征结合相应的算法来进行流量清洗。对抗DDOS的网络设备可串联或者并联在网络的出口处。

应用层的DDOS

发生在应用层,三次TCP握手已经完成,也叫做CC攻击(Challenge Collapasar),其原理就是对于web应用上比较耗费资源的页面进行频繁的访问,导致服务器的资源耗尽而造成的DDOS攻击。还有就是黑客入侵了某个流量非常大的网站,然后内嵌攻击目标的网站iframe网页,导致目标网站直接拒绝服务。

面对应用层的攻击,归根结底就是限制访问频率,一般根据cookieIP确定唯一客户端,并根据访问频率判断是否重定向,给一个参考例子:

 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_qosApache的一个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

正则表达式都是基于NFANondeterminstic Finite Automanton)的,它是一个状态机,某些正则表达式写得不好,在黑客的精心构造下也有可能造成资源消耗过大而导致DOS,存在ReDOS的写法开发人员应当注意,参考文章《浅析ReDoS的原理与实践


0x17 PHP安全

作者有讲到PHP的安全,PHP现在很多中小型企业都在使用,这个脚本语言开发程序非常方便快捷,封装了很多的内置函数,然而就是这些内置函数在不恰当情况下使用,就导致了应用漏洞存在,常见有文件包含,变量覆盖,代码执行的漏洞,关于PHP安全的文章,博主已经分享了较多文章,可参考。


0x18 互联网公司的运营

最后一部分内容,涉及到宏观安全思维,企业安全管理、安全开发(SDL)和安全运营方面,作为阅读了解之用


0x19 总结

看完道哥的《白帽子讲WEB安全》,虽然读这本书时带有急功近利的目的,没有细细品读,但是也让我受益良多,重新将现有知识搭建起一个知识框架和体系,慢慢学习,慢慢完善,向前辈致敬!2018-07-27

发表评论 / Comment

用心评论~


Warning: Cannot modify header information - headers already sent by (output started at /www/wwwroot/blog.dyboy.cn/content/templates/dyblog/footer.php:56) in /www/wwwroot/blog.dyboy.cn/include/lib/view.php on line 23