Web安全初涉

Published:

本篇是看完《白帽子讲Web安全》后的一些小理解。原本有四篇。其中第一篇和第四篇读后感没有往上面写。因为感觉中间两章的含金量更大一些。还有就是因为懒。。。

笔者错别字、理解错误处还请海涵并指正。

客户端脚本安全

浏览器安全:

同源策略,浏览器安全的基础。如果不遵从该策略,那么被引用的源可能会丢失流量的同时泄露信息,主动引用的源也有可能因被注入脚本而受到XSS攻击。因此不但被引用者要添加策略文件,引用者也得谨慎引用。

此外,浏览器沙箱,恶意网址拦截,以及XSS Filter等也是浏览器中对安全的保护措施。

跨站脚本攻击(XSS):

这里有反射型XSS,存储型XSS和DOM Based XSS。

反射型XSS又称为非持久型XSS,因为一般是用户点击了某个设计好的恶意链接,这个链接的host一般是含有你的登陆信息的网址,而后面带有一些参数,这些参数会在你进入点击这个网址之后执行,从而获取你的信息,但是若不去点击它,不会对你造成任何影响,因而叫做非持久性。

存储型XSS,如Cracker在某博客中发表文章,里面含有未经处理的JS代码,当发布时,该文章将保存到服务器,任何阅读该文章的用户都将会执行该JS代码,从而造成XSS攻击。

DOM Based XSS也是非持久型的XSS,只不过由于一些原因被分出来了。这个是通过修改页面的DOM节点而形成的XSS脚本。

下面是XSS攻击的效果,被攻击的页面,会被XSS通过引用不同源,但是是js脚本去执行,便能够理所当然的获取到其信息,而发送给攻击者,这些脚本也被成为XSS Payload,Cookie劫持攻击原理也如上所示,而且直接执行脚本就能把Cookie发送过去。尽管现在Set-Cookie时有HttpOnly标志,是窃取的Cookie失去意义,仍不影响对某些功能的控制。如,XSS Payload“帮助”用户get删除文章的页面,post文章,这个可能是脚本自动执行,也可能是诱导用户执行XSS Payload。同样地,XSS也能够将页面的信息获取,并发送至攻击者等等。

XSS钓鱼:用JS画出一个登陆框,将输入的信息发送给攻击者。

其他还有:通过navigator.UserAgent,识别浏览器版本。通过navigator.plugins获取浏览器插件。通过style属性获取用户浏览过的网页。获取用户的真实IP地址。

常用的Web漏洞XSS、SQL Injection都是攻击者构造一些特殊字符。XXS本质是“HTML注入”,用户的数据被当做HUTML代码的一部分来执行,从而混淆了原来的语义,产生了新的语义,在MVC架构中,XSS就发生在VIEW层,应用拼接变量到HTML页面时产生。

XSS攻击范围较大。

跨站点请求伪造(CSRF)

CSRF就是借助用户已经保存了的Cookie,在恶意页面利用这个Cookie进行访问一些特定网址,比如XSS中说的get删除网址,便可以在别的页面中添加一个图片并加载该get请求。而且不但可以简单的get,post也是可以提交的。验证码和Referer Check都可以一定程度上防御该攻击。CSRF攻击的本质是重要操作的所有参数都是可以被攻击者猜测到的,因此,引入token很有效的防御了该攻击,token一般是和cookie相联系的,通过cookie的验证确定该请求是否有效。

点击劫持(ClickJacking)

该攻击方式与CSRF有异曲同工之妙,不过本质是利用视觉欺骗,在用户已有cookie的浏览器下,在一个恶意的正常的页面上放上一个透明的frame,当用户点击该页面上的某个按钮时,实质上点击的frame上的某个按钮。或者在flash上,用户以为点击的每一步都是正常的,但是其实点击的是frame上的一个个按钮,最终就一步步的打开了某个东西。或者通过拖拽劫持进行数据窃取。最新的触屏劫持也是使用该技术。

与XSS旗鼓相当的XSIO利用style或者控制CSS进行图片覆盖,以达到某种目的。

可以看出ClickJacking的攻击成本较高。

HTML5安全

由于HTML5的出现,很多新标签,新事件也随之出现了,因此,利用新标签的XSS也就应运而生。

很多已存标签中也添加了新的属性。iframe的新属性sandbox进行更精确的控制。<a>和<area>中加入新属性Link Types:noreferrer控制是否发送referrer,防止泄露敏感信息。Canvas不同于img,可以在页面中直接操作图片。

其他安全问题:允许跨域出现的技术,跨窗口传递消息Web Storage。

服务器端应用安全

注入攻击

前面的XSS其实本质上用的就是HTML注入攻击,注入攻击的本质,是吧用户输入的数据当做代码执行。这里有两个条件,一是用户可以控制输入,而是原本的程序要执行的代码,拼接用户输入的数据。SQL注入中,几种有效的注入攻击有Blind Injection,其实就是在后面加上and 1 = 1或则and 1 = 2观察其响应变化。第二种就是Timing Attack,通过其响应时间判断是否可以执行。之后便可以进行详细的攻击,进行对用户名和密码的不断尝试,其他的SQL攻击技巧有命令攻击,攻击存储过程,编码问题,SQL Column Truncation方式。这些需要有一定的SQL基础。现在这方面我不深入。对于SQL的注入防御,有使用预编译语句、使用存储过程、检查数据类型、使用安全函数等。防御的本质也就是在数据和代码拼凑的地方进行全面的安全检查。

该章节大部分都是讲的SQL注入攻击,最后还提到了其他注入攻击。有XML注入,代码注入,CRLF注入(即\r \n的插入),不过本质还是那两条。

文件上传漏洞

(后面的看的不太仔细,所以这里只是了解了一下,具体执行方式没有深入) 文件上传漏洞主要是有下面几个方面:Web脚本语言,服务器容器解释并执行了用户上传的脚本,导致代码的执行;Flash策略文件crossdomain.html,用户控制Flash在该域下的行为;病毒木马文件,攻击者用以诱骗用户或管理员下载至执行;钓鱼图片或包含脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。造成这种的原因有多种:限制上传类型使用的是黑名单,无法全部含盖;通过特殊字符如0x00终止符,用来绕过上传检查功能,而在执行的时候却会因为这个字符的出现,执行一些攻击者想要执行的其他文件类型。或者根据Web Server对文件解析的性质,进行攻击,出现了的有Apache文件解析问题,IIS文件解析问题,PHP CGI文件解析问题,利用这些漏洞,上传文件进行钓鱼。为了解决文件上传漏洞,常见的防御措施有:文件上传的目录设置为不可执行,判断文件类型,使用随机数改写文件名和文件路径,单独设置文件服务器域名。

认证与会话管理

认证目的是为了辨别出用户是谁,Who Am I。通常的做法就是通过密码登陆,因此弱密码会成为一个攻击点。为了避免这种缺点,会出现多因素认证,比如验证信息,手机验证等方式。而session是为了对页面间的用户数据传递,防止没切换一个页面都得重新登录一次,因此要保证session cookie不被盗取,在XSS攻击中,便有通过cookie劫持获取用户信息的XSS Payload。除了使用XSS攻击,Session Fixation针对使用sid而进行的攻击,攻击者通过给用户一个自己知道的链接,在用户登录之后,便可以使用给sid进行直接登录。不过现在sid方式也越来越少了,大部分数据都会保存在cookie中。由于session一般都是有周期的,在攻击者获取session之后,一般会采用session保持攻击以达到长时间的登录。单点登录的OpenID是目前最为开放和流行的登录系统。

访问控制

访问控制是用户具有哪些权限。What Can I Do。某个主体对某个客体需要实施某种操作,系统对这种操作的限制,即权限控制。Linux中有使用r w x的01选择进行对文件的读、写、执行进行了规定。在服务器端,要控制好文件的权限,以防止普通用户进行注入,从而修改系统文件,这边遵循最小权限原则。现在广泛运行的用户权限控制为RBAC,即基于角色的访问控制。这是一种垂直的权限管理,从角色上分配权限,同个用户可属于不同的角色,每个角色有不同的文件权限,从而形成了,用户对文件的权限。但是,这也会出现漏洞,比如AB用户对某个个人信息文件都有权限,从而导致,A用户可以读取B用户的所属信息,但他们都是位于同一个文件,只不过数据是从属不同的用户,这样也就出现了水平权限管理,但这种将非常复杂,至今仍是难题。另外,对应于认证回话管理的OpenID的方便性开放性,访问控制也有一个方式,即OAuth,也就是我们经常使用的使用其他账户登录功能,这里不需要平台间获取各平台用户的密码信息,直接通过临时认证,通过平台之间的凭证相互获取登录后的基本信息。(例如微博开放平台,这里获取的不是登录密码,而是一些登录后的基本信息,比如用户的昵称头像等信息,详情信息还是由开放平台进行决定)。这里有个共pythoneer使用的OAuth库python-oauth2

加密算法与随机数

这一章讲的密码学,密码的加密、密码的攻击以及足够随机的随机数,这里没有深入了解,基本上被我pass了

Web框架安全

MVC框架,Model-View-Controller三层。View层负责用户视图、页面展示等工作;Controller负责应用的逻辑实现,接受View层用户传入的请求,并转发给Model做处理;Model层则负责实现模型,完成数据的处理。一些Web安全威胁,如XSS、CSRF、SQL注入、访问控制、认证、URL跳转等不涉及业务逻辑的安全问题都可以集中在MVC框架中解决。具体措施,使用模板引擎控制XSS;使用security token解决CSRF;使用HTTP Header防止CRLF注入,ClickJacking;使用ORM框架防止SQL注入。Web框架安全问题也出现过很多如Struts2命令执行漏洞,Spring MVC命令执行漏洞,Django命令执行漏洞。

应用层拒绝服务攻击

DDOS又称为分布是拒绝服务,Cracker利用控制到的“肉鸡”作为各个网络节点,同时发起攻击。常见的共计有SYN flood、UDP flood、ICMP flood,SYN flood是一种最为经典的DDOS攻击,利用了TCP协议设计的缺陷,而TCP/IP作为整个互联网的基础,牵一发而动全身,攻击原理就是各个肉鸡伪造大连的源IP地址,分别向服务器发送大量的SYN包,服务器会返回SYN/ACK包,因为原地址是伪造的,所以不回应答,所以服务器会等待一个SYN Time并且重试3到5次,服务器消耗大量的资源来处理这些半连接,从而无暇理睬正常的链接请求,导致拒绝服务。

除了上述的应用层的DDOS攻击,网络层也存在,即Challenge Collapasar(CC),该原理非常简单,就是对一些消耗资源较大的应用页面不断发起正常的请求,从而达到消耗服务器资源的目的。防御方式就是针对每个“客户端”做一个请求的频率限制,基本上就是针对IP地址和Cookie定位一个客户端,如果客户端的请求在一定时间内过于频繁,那么多余的请求都会被重定向到一个出错页面。而随之出现的就是攻击者利用代理服务器隐藏真实IP,使用不同的IP不断攻击。这样我们可以是应用代码做好性能优化,网络架构上做好优化,降低攻击影响,当然限制每个IP地址的请求频率也是个必要的手段。使用验证码,可以防止对特定的页面的抓取。另外也可以从其他人机区别中找到防御应用层DDOS方式,因为User-Agent可以被篡改,所以无法识别是否是以浏览器发起的请求,一种可靠地方法是让客户端解析一段JS,给出正确的运行结果。类似的,发起一个flash让客户端解析,也可以起到同样的作用,但所自动化脚本内挂在浏览器中,就无法检测出来了。

除了CC攻击外,攻击者还能利用Web Server的漏洞或者设计缺陷,直接造成拒绝服务。

Slowloris攻击:以极低的速度往服务器放松HTTP请求,由于并发的连接数有一定上线,因此若这些恶意连接不释放,便无法接受新的请求,从而导致拒绝服务。

HTTP POST DOS:在发送post包时,指定一个非常大的Content-Length值,以很低的速度发包,保持连接不断开,从而占用连接。

Server Limit Dos:攻击者通过XSS攻击,恶意往客户端写入了一个超长的Cookie,那么客户端在晴空Cookie之前,将无法访问使用该Cookie所在域的任何页面,因为HTTP包头大小超过了限制,服务返回4xx错误。

ReDOS:正则表达式写的不好,造成的影响。正则表达式基于NFA,是一个状态机,每个状态和输入符号都可能有很多不同的下一个状态。正则解析引擎将便利所有可能的路径直到最后。由于每个状态都有若干个“下一个状态”,因此决策算法将逐个尝试每个“下个状态”,直到找到一个匹配的。

PHP安全

由于PHP不是博主目前使用的语言,所以这一章也没有详细看,基本被pass掉了,下面就简单列下可能会有的安全漏洞。文件包含漏洞(在文件中注入可执行代码),包括本地文件包含和远程文件包含;变量覆盖漏洞,有全局变量覆盖、extract()变量覆盖、遍历初始化变量、import_request_variables变量覆盖、parse_str()变量覆盖;代码执行漏洞,有“危险函数”执行代码、phpMyAdmin v3.4.3.1远程执行漏洞、MyBB v1.4远程执行漏洞、“文件写入”执行代码以及其他执行代码的方式。防御措施,会通过文件php.ini来定制安全PHP环境。

Web Server配置安全

Apache安全。检查Apache的Module的安装情况,根据“最下权限原则”,竟可能减少不必要的Module,对于要使用的Module,检查器对应版本是否存在已知的安全漏洞。apache以root身份运行是一件非常危险的事情,当入侵者侵入Web成功时,将直接获得一个高权限的shell,或当出现bug时,将带来更高的风险,如删除本地的重要文件、杀死进程等不可预知的结果。

Nginx安全。Nginx发展很快,有高性能,高并发的处理能力。安全漏洞却比Apache要多。和Apache一样,Nginx也应该以单独的身份运行,这是所有Web Server、容器软件应该共同遵守的规则。Nginx配置灵活,防御DDOS和CC攻击方面能起到一定的缓解作用。

jBoss:J2EE环境中流行的Web容器,配置不当可能造成远程命令执行。(未深入)

Tomecat:和jBoss一样,默认会运行在8080端口,会出现远程命令执行。(未深入)

HTTP Parameter Pollution:被称为HPP的攻击,就是通过GET或POST想服务器发起请求时,提交两个相同的参数,那么服务器会发生的选择漏洞。

如:?page=select 1,2,3 from table where id = 1 不可通过,但若是 ?page=select 1&page=2,3 from table where id=1 则可能会出现SQL注入。