白帽子谈web安全读书笔记
本文主要为白帽子谈web安全的读书笔记,用于记录。
白帽子谈web安全
第一章 概述
安全三要素:
- 机密性:数据加密,不被泄露。
- 完整性:数据完整,不被篡改。
- 可用性:保护资源随需求而得。
安全评估流程:资产阶级划分->威胁分析->风险分析->确认解决方案
威胁分析:伪装 篡改 抵赖 信息泄露 拒绝服务 提升权限
第二章 浏览器安全
同源:
浏览器js使用同源策略来防护。不能跨域访问资源。
“同源”依据包括:域名或ip地址,子域名,端口,协议。
DOM cookie XMLHttpRequest以及一些插件如flash都会有着同源策略。
沙箱:
沙箱泛指资源隔离模块谷歌浏览器采用沙箱机制,多进程来限制代码执行。但一些第三方插件如flash,java等不受sandbox管辖,成为浏览器攻击热点。
恶意网站拦截:
基于页面特征识别,在服务端进行模型建立处理,使用黑名单,与安全厂商合作,推送黑名单。
EV证书:数字证书颁发机构与浏览器厂商一起打造的,增强对安全网站的识别。
第三章 XSS
跨站脚本攻击:使用html注入篡改网页,插入恶意脚本
- 反射型XSS:将用户输入的数据反射给浏览器,需要诱使用户点击恶意链接才能攻击成功。非持久性XSS。
- 存储型XSS:写下包含恶意js的博客,发表后所有访问博客的都会执行代码。又叫持久型XSS。
- DOM Based XSS:修改页面DOM节点来实现
cookie劫持
先xss访问远程脚本并且加载,再利用image的src,利用url参数中加入cookie来访问目标域名。只需要访问留下日志,即可窃取。
构造get post请求
get与上述类似,用过img的src来构造get请求。
post则使用js,构造表单(用js或者直接写html),或者用XMLHttpRequest来构造。
除了一般cookie以外,还可以通过观察network,构造sid之类的,进行模拟访问来获取消息。
xss钓鱼
xss将验证码url发到远程服务器,等待接收并且返回给xss来绕开验证码。
使用xss用js在界面画出伪造的登录框,发送密码到服务器。
浏览器以及用户软件识别
观察UA或者使用版本判断代码来识别浏览器版本。
通过新建控件来判断用户是否安装软件,如新建ActiveX空间XunLeiBHO.ThunderIEHelper来判断是否安装了迅雷软件。
还可以通过第三方软件来观察,如Flash的system.capabilities来找到硬件信息。
firefox的插件可以通过查询DOM来找到。
chrome插件可以通过访问chrome://flashgot/skin/icon32.png来查询。
通过CSS观察链接颜色来看是否访问过网站。
通过XSS调用Java Applet接口获取本地真实ip地址,本地网络信息。
攻击平台
Attack API:总结了许多XSS Payload归纳成api
BeEF:有控制后台,攻击者可以在后台控制前端,展示完整XSS攻击过程。
XSS Proxy:嵌套ifrane实时远程控制背XSS攻击的浏览器。
调试JS
Firebug Fiddler HttpWatch 浏览器Debugger
XSS构造与攻击
- 使用字符编码,如GBK下两个字符在Unicode下被认为为一个字符,绕开系统安全检查。
- 绕开长度限制,如使用event或者将payload写在别出,再获取payload。
- local.hash不会在http包发送,可以藏代码。
- 可以用注释将html代码注释掉,如第二个文本框允许写入更多细节,那么可以通过注释打通两个文本框。
- 通过base标签表示链接的base地址,使用这个标签来访问外部js。
- window.name没有特殊字符限制,可以实现数据的跨域传输。也可以缩短payload长度。
- 通过flash构造http请求来威胁服务器。
- 使用存储型XSS嵌入反射型XSS进行攻击
- Flash可以嵌入ActionScript脚本来攻击。
XSS防御
- HttpOnly 可以防止js读取到cookie
- 输入检查,使用白名单或黑名单检查格式,而且必须在服务端检查,而非客户端。
- 可以使用输出检查,编码或者转义来实现,比如使用编码函数,在多个地方用多种编码
- 富文本中event应当被禁止,用白名单,使用开源项目来帮助检查。
第四章 跨站点请求伪造CSRF
跨站点伪造请求,称为CSRF。
cookie策略
- session cookie:临时cookie 在浏览器关闭后cookie就失效了 保存在浏览器进程的内存空间
- third-party cookie:在服务器expire时间之后cookie才会失效 保存在本地
如果从一个域的页面加载另一个域的资源,IE safari会阻止third-party cookie发送 firefox chrome不会
P3P头不会拦截第三方cookie发送,用于广告等跨域访问 ,可以加以利用。
跨站点post
可以构造好一个form表单,用js自动提交,甚至隐藏在不可见的iframe的窗口中。
FLASH CSRF
Flash也能有多种方法发送网络请求。
CSRF防御
- 验证码:强制用户进行交互,完成最终请求。但不能给所有操作都加上验证码。
- referer check:检查referer来源,但由于不能什么时候都获取到referer。
- Token:业界最主要做法。在链接中加入Token=randomblablabla值 token值不可预测,从而实现鉴别。可以放在cookie和session中,检查是否一致。token在一个用户的有效生命周期,在成功提交过后,应当消耗掉。
第五章 点击劫持
使用一个透明的iframe覆盖,欺骗进行点击。使用CSS控制alpha通道进行实现。
flash也可以点击劫持,通过flash游戏诱导点击按钮变化,最后一步步操作打开了用户摄像头。
图片也可以劫持,通过调整图片css到任意位置,点击就会到钓鱼网站。
拖拽劫持:拖拽处隐藏iframe,拖拽完成后同时完成数据传输。
触屏劫持:触屏,离开屏幕,滑动都是事件,可以利用,比如造一个假地址栏。
防御
- frame busting 禁止iframe嵌套 但由于是用js写的,因而可以绕过它 还可以用sandbox限制js脚本执行。
- 用x-frame-options的http头,拒绝加载任何frame页面
第六章 HTML5安全
新标签,新安全
通过新标签,如video audio来远程加载音频,绕过filter。
使用sandbox以及属性来控制同源访问,运行脚本等。
使用noreferer来不再发送referer。
使用canvas能够进行破解验证码。
w3c有跨域请求标准,需要带origin header来防止csrf。
postMessage允许没以恶个窗口对象往其他窗口发送文本消息,实现跨窗口消息传递。不受同源策略限制。但也可以用xss payload来实现iframe,用PostMessage给父窗口发送消息。
web stroage分为session storage和local storage,前者关闭则会失效,后者一直存在。使用kv对来进行操作。也受同源策略约束。
第七章 注入攻击
用户能够控制输入,而且程序需要执行的代码拼接了用户输入的数据。
SQL注入
盲注:在没有错误回显的情况下完成攻击,虽然缺少调试信息,但可以构造简单语句观察页面是否变化。
Timing Attack:根据benchmark函数,观察时间长短来观察是否注入成功。可以利用各种数据库函数来获取有用信息。如果有写权限,甚至可以写入磁盘。
攻击技巧
用substring可以找对应版本。
可以用union select来确定表是否存在,列是否存在。
确定列存在后,可以用字符范围来读取表内信息。
可以用自动化工具sqlmap。
可以用load_file读取文件,用into_dumpfile写入文件,然后创建表导入数据来查看数据。
可以用用户自定义函数来获取系统权限,可以通过lib_mysqludf_sys提供的几个函数执行系统命令,如sys_eval和sys_exec,这些被集成到sqlmap中。
ms sql server可以用xp_cmdshell来执行系统命令,oracle可以用java。
存储过程本身可能存在注入漏洞,注意文本处理。
注意字符集的统一,避免各个字符集差异导致转义问题。
sql不开严格模式,遇到超长输入可能会截断,那么插入与admin同名数据后,根据逻辑可能就可以越权访问。
防御
有些escape只能转义部分字符,黑名单形式不太行。
预编译语句是防范注入的最好方法。
使用安全的存储过程也能抵抗sql注入。
检查数据类型可以防范注入。
使用安全函数可以对抗sql注入,比如编码函数。
最好方法是限制权限,如自定义函数,操作本地文件。
其他注入
XML注入,可以构造恶意数据来插入。
代码注入,主要发生在eval等不安全的函数上。jsp的include也能导致注入,多见于脚本语言。
CRLF注入,这俩是不同语义的分隔符,可以注入来改变语义,修改日志。
最后
数据与代码分离,在拼凑的地方进行安全检查即可。
第八章 文件上传漏洞
上传了可执行脚本,通过脚本文件获取到了执行服务端命令的能力。
安全问题:
- 上传web脚本语言,服务器的web容器解释了脚本
- 上传了flash的策略文件crossdomain.xml,黑客用来控制flash在该域下的行为
- 上传了病毒木马文件,诱骗下载
- 上传钓鱼图片或者包含了脚本的图片,被当成脚本执行
- 上传文件作为入口,溢出后台处理程序
上传的文件能被Web容器解释执行,所在目录是web容器所覆盖的目录,用户能够通过web访问,而且没有被安全检查,格式化,图片压缩等。
绕开上传检查
在文件名后面添加一个%00的字符,在c php被认为是终止符,那么可以构造文件名绕开文件名后缀类型检查。
判断前十个字节通常能判断文件的真实类型,因此可以伪造文件头前256个字节,判断文件类型。
功能or漏洞
在apache曾经的文件解析中,会从后往前解析,直到遇到认识的文件名为止。
在IIS文件解析中,截断字符为分号;因此可以造脚本名。文件夹扩展名也存在问题,/.asp/文件夹下的文件都被解释为asp文件。
针对IIS,可以用PUT方法和MOVE方法,将文本文件改写为脚本文件。首先用OPTIONS来查看支持的方法,然后用PUT上传文本文件,然后使用MOVE改名。
php cgi路径解析存在问题,当访问xxx.com/a.jpg/x.php时候会把a.jpg当php解析。原因是解析地址名时候会向上递归。
302能跳转到钓鱼网站,而利用文件上传功能,通过传播这个文件的url进行钓鱼,在老版本的IE中会将图片当HTML执行。
设计文件上传
- 文件上传目录没有exec权限,作为静态文件处理。
- 判断文件类型,使用MIME Type 后缀名等用白名单方法,对于图片可以用压缩函数或者resize函数来破坏代码。
- 用随机数改写文件名,文件路径。
- 单独设置文件服务器的域名。
第九章 认证和会话管理
认证用于辨认用户是谁,授权用于决定用户能做什么。
密码必须用不可逆的加密算法,单向散列函数加密存储在数据库中。
破解MD5后的方法:彩虹表,收集大量明文和MD5,来进行查找。可以通过加盐处理。
sessionID通常加密后保存在Cookie中,但也可能被窃取。
如果登录前后sessionID没有发生变化,则会发生session fixation问题,用户X可以诱导用户Y改变session状态来实现攻击。比如诱导点击URL。所以在登陆完成后需要重写sessionID。
session存在保持攻击,只要不停发起请求,就可以一直活下去。
有些时候session不会在服务端维护,用客户端的cookie的expire时间,但由于在客户端,因此很容易被攻击。
可以强制销毁session,或者当ip ua变化时候强制销毁重新登录。不允许多个session生效。
单点登录SSO:登录以此可以访问所有系统。这样可以集中风险,在重点使用多种方法,甚至委托给第三方。既是优点也是缺点。可以用OpenID框架来认证。
第十章 访问控制
访问控制是某个主题对某个客体实施某种操作的限制。可以通过ACL访问控制列表来决定。
基于URL的访问控制,通过权限认证是否能访问url来实现。可以通过字典找到url来访问。
spring security支持基于url method 表达式的访问控制,配置文件复杂,学习维护成本较高。
用户-角色-权限 称之为垂直权限管理。
需要检查资源是否属于对应用户,虽然角色共享,但存在私有数据。因此也存在水平权限管理问题。
OAuth是不提供用户名和密码情况下,授权第三方应用访问Web资源的安全协议.用request token换access token,然后用access token访问资源。
可以使用外部OAuth库来进行使用。
第十一章 加密算法和随机数
常见有分组加密和流密码加密。
流密码:基于异或操作,常见错误是对同一个密钥多次加解密,由于异或运算的特性决定。同样利用原理,可以构造和管理员一样的密文来越权,这个可以用消息验证码MAC验证是否被篡改。有时候存在弱随机问题,可以暴力破解。
WEP密码就是采用流密码的RC4,可以用暴力和等待初始化向量重复来执行。
ECB电码本模式,每个分组之间相对独立,可以观察出来。改变密文顺序也可以改变明文顺序,有其统计特征。
CBC链式加密模式,前后会互相关联。先将初始化向量和第一个分组异或完成并且DES完成,然后将结果与第二个分组异或。最后填充不正确则会抛出异常。
如果最后一个分组消息长度没有达到,则会填充,比如剩下5个字节则每个字节填充个5之类的。如果正好为8则加一个全为8的分组。
CBC模式破解:先根据密文长度,检查是8字节还是16字节。然后构造初始化向量,直到padding正确,这时候就能确定中间值的最后一位。同理,可以确定中间值的所有位,从此可以获得明文。
密钥管理
不要把密钥硬编码到代码里面。当代码广泛传播,或者逆向后会被泄露,能够访问到代码的人员也会泄露。正确做法是放在配置文件或者数据库中。并且减少访问权限。在生产环境中需要重新生产密钥,定期更换密钥,可以将所有密钥放在一个服务器中,通过服务来获取密钥,不屑道本地文件中,只加载到内存里。
伪随机数
openssl曾经只能以pid为seed,导致只有32768个种子,很快可以遍历key。
许多地方都用伪随机数。系统时间替代伪随机数容易生成问题,因为这适合时间顺序增长的。不要把时间函数当随机数用。
伪随机数存在种子,rand的范围非常小,只有32767。伪随机数种子确定后求的值是固定的。由于种子数量可能固定,因而可以遍历。当已知第一个值之后,可以猜测种子进行遍历。可以发送keep alive头,强制所有服务端使用同一php进程响应。
这些可以使用足够安全的随机数算法解决。
总结
- 不要用ECB
- 不要流密码
- 用HMAC-SHA1替代MD5
- 不要用相同key做不同事情
- salt和初始向量要随机
- 用别人实现的加密算法
- 不要依赖系统的保密性
- 用CBC的AES256加密
- 用HMAC-SHA512检查
- 用带salt的SHA256进行Hash
第十二章 WEB框架安全
在正确的地方做正确的事,Model层要解决的问题不要丢给view层。
在不同的场景需要不同的编码函数,比如存在一些场景,自动转码不够用,有些场景需要加入sql转码,xml转码,js转码等。
读写操作需要区分,在存在写操作需要注意CSRF。
在web框架中防csrf:
- session中绑定token 或者代为保存到cookie中
- form中自动填入token字段
- ajax自动添加token
- post时候验证token参数
控制HTTP头,管理好跳转函数,控制Location字段,使用封装好的cookie函数。
使用ORM应对SQL注入,预编译,找到动态变量来实现。
文件上传也用别人写好的。
spring security为Spring mvc提供许多安全功能,但缺乏XSS CSRF等。
Web框架自身也可能存在安全问题。
第十三章 应用层拒绝服务攻击
DDOS:分布式拒绝服务,有SYN泛洪,UDP泛洪,ICMP泛洪。
应用层DDOS区别于网络层,TCP已经建立连接。比如在大流量网站siteA上插入iframe代码。
应对DDOS可以采用限制请求频率,但IP可以发生变化,或者大量僵尸机器。因此要做好性能优化,负载均衡,CDN,限制请求频率。
验证码可能存在遍历图片的破解方法,有时候根据sessionID生成的验证码未失效。但现在也存在机器识别。
防御DDOS可以让客户端解析一段js,并且给出正确的运行结果。还可以设置参数缓解DDOS。可以根据频率进行拦截。
并发连接数量存在上线,如果所有连接都被占用,就会拒绝服务。因而可以消耗资源。
HTTP POST用很慢的速度发包,连接不断开,可能导致资源耗尽。
使用XSS,写入一个超长cookie导致无法访问,也会导致拒绝服务。
正则写的不好也可能导致资源大量消耗,可能导致正则计算复杂度过高,从而攻击。
第十四章 PHP安全
文件包含漏洞
- PHP:include include_once require require_once fopen readfile
- JSP :java.io.File java.io.FileReader
- ASP:include file include virtual
当使用include,会被作为php代码执行,不会在意包含文件类型。当include通过动态变量包含文件,而且用户可以控制该变量,则可以利用。
php内核使用c语言,因此可以利用0字符截断。此外还可以利用最大字符长度,用./来构造目录。构造目录方法可以用编码来利用。
fopen fclose同样危险,因为可以读取敏感文件。
可以利用字符来遍历目录漏洞。可以用Open_basedir来限制。
PHP还能加载远程文件,构造URL来执行。
包含本地文件需要知道具体位置,可以包含session文件,他在/tmp目录下。也可以用包含日志文件,可以在凌晨去攻击日志。
位置可以用默认安装,自定义安装的各种目录来猜测。可以用自动化脚本来打。
目录位置完全猜不到,可以尝试错误回显,或者利用/proc/self/environ,看环境变量来完成攻击。
临时文件可以暴力猜文件名,可以利用这一点。
变量覆盖漏洞
变量未初始化而且能被控制,则很不安全。可以在url里面覆盖全局变量。
extract可以将变量从数组导入符号表,可以overwrite。
防御:先保证register_globals = OFF 防止各种可能造成变量覆盖的函数,记得初始化变量。
代码执行漏洞
小心危险函数,比如popen system passthru exec eval等。
第十五章 WebServer配置安全
Apache httpd
检查Module安装情况,注意最小权限,减少不必要Module,注意Module的安全漏洞。
不要以高权限身份运行Apache,入侵后会获得高权限shell,apache本身会做危险操作。
Nginx
Nginx要注意自身软件版本,合理配置文件,处理UA之类的来管控服务。
jBoss
管理后台功能强大,默认没有认证,有多种远程执行命令的方法。
Tomcat
Tomcat后台也默认跑在8080,部署war包需要manager权限,可以脚本自动打。
读后感
在第15章之后,都是一些更高层面的安全问题,我自己觉得这些层面的问题虽然也很重要,但缺乏细节,有些事情也不是开发岗能解决的事。我自己本人是后端开发岗,有些更高层次的问题不是属于我能解决的问题,所以没有阐述。
就我个人而言,我认为这本书还是相当有价值的,尽管我本人不写PHP,而且这本书也有些年头了,一些东西也过时了,但对于我这个完全没有什么安全经验的人,能够读懂,了解一些安全的内容,还是很有意思。
这本书介绍的一些例子很好地展示了一些攻击的手段,“黑客”自我从小以来一直是个很炫酷的称号,在阅读了这些手段之后我也觉得,一些手段着实是利用了人性,充满智慧,相当巧妙。能够想到这些手段的人或许是灵光一现,但也经历过相当的积累,我对此无比感慨。这些奇怪的手段,让这本书作为假期的消遣娱乐也算很有意思。
当然,对手段的了解也意味着对手段的防范,在书中其实提到不少,用第三方写好,经历过检验的安全库,用设计良好的框架来保护,这也是开发的一个技巧。在安全方面,如果自己水平不够,这也是一个很好的解决方法。
文章格式有些混乱,这也是我自己的笔记习惯,阅读不便请见谅。
2021年1月15日
白帽子谈web安全读书笔记