白帽子谈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日

Author

王钦砚

Posted on

2021-01-13

Licensed under

CC BY-NC-SA 4.0

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×