[深刻学习Web安全](2)安全杂谈

做者:万年死宅
首发:i春秋社区
注明:转载请务必注明i春秋社区(bbs.ichunqiu.com)

0x00 目录

目录
0x01 安全本质
0x02 信任域与信任边界
0x03 如何判断安全问题
0x04 道哥的白帽子兵法

0x01 安全本质
在真正进入Web安全的学习中以前,咱们最好来了解一些安全方面的知识。首先,咱们来看安全的本质。
根据道哥在《白帽子讲Web安全》中所说:“安全问题的本质是信任的问题”,咱们举个例子:
有一天,蛋总去上班,其余人,好比“七百斤的猴子”,认识蛋总,因此,认为蛋总不是ISIS的恐怖分子,不会炸掉i春秋的大楼,因此就容许蛋总进去了。(这就是“信任”,咱们试想,若是在“信任”的前提下,蛋总去炸i春秋的大楼,成功率有多高?这就是安全问题。。。)
上面的例子说的是现实生活的例子,可是在真正的“战场”上也是如此,咱们只因此认为一个东西、一个机制安全,仅仅是由于“信任”。也就是说,咱们创建的一切针对与安全问题的解决方案都是基于信任的。
就像咱们经过验证Refer来防护CSRF,就是由于咱们相信JavaScript没法控制Refer,可是仅仅由于JavaScript没法控制Refer,咱们就能彻底放心了吗?虽然“JavaScript没法控制Refer”为咱们的解决方案提供了“信任”这个解决方案的前提。
可是,咱们试想,虽然“JavaScript没法控制Refer”,因此咱们获得的Refer必定是正确的,可是在这个解决方案上出现问题呢?
我就来举两个我曾经遇到过的这种问题(虽然验证了Refer,可是依然能够CSRF):
1.百度的一个CSRF:
 
这个CSRF就是这种问题,他的验证机制存在问题,咱们若是正常操做他什么也不返回,可是咱们若是修改了Refer他就会返回Error。可是,即便他返回Error咱们的操做也成功了,由于他的验证机制以下(本身YY的,比必定说就必定是这样):
 
咱们能够看到,在最后的这里:

[Python] 纯文本查看 复制代码php

?linux

1程序员

2shell

3安全

if Retn!=True:服务器

        print 'Attack!!!!!!'ide

SetName(1)函数


这就是形成这样一个CSRF的缘由,是的,这个解决方案确实是可行的,可是在实现的过程当中却出现了问题,例如,咱们本来要求的Refer是http://www.baidu.com/set/nickname,可是其实是以下状况:
 
咱们能够看到,当咱们的Refer为I am P0werZh4i的时候,确实,程序返回了Attack!!!!!也就是说他确实判断了这样一次攻击,可是咱们能够看到此时VerficRefer函数返回了False,而后咱们的if语句进行判断,确实也发现这是不能操做的,可是问题就在这里了:

[Python] 纯文本查看 复制代码学习

?url

1

2

3

4

if Retn!=True:[/size][/font]

[font=微软雅黑][size=4]print 'Attack!!!!!!'[/size][/font]

[font=微软雅黑][size=4]SetName(1)[/size][/font]

[font=微软雅黑][size=4]


咱们虽然if了,而且输出了Attack!!!!,可是,咱们要知道,这个语句继续执行下去仍是会修改咱们的数据,咱们也能够看到最后,name的值已经被改成了0。
也就是说针对与这个解决方案,咱们就找到了一个bug。这样一个bug,是逻辑上的问题,程序员觉得只要判断了就不会操做数据了,可是事实上却不是。
那么咱们应该怎么修复这个问题呢?,固然是这样,只须要增长一行代码:
 
在哪里呢?嘿嘿,既然你没看到我就在说一下吧:

[Python] 纯文本查看 复制代码

?

1

2

3

4

if Retn!=True:

        print 'Attack!!!!!!'

        exit()

SetName(1)


嘿嘿,其实就是判断到攻击以后,不止要返回数据,还要当即终止操做。不信咱们来看:
 
能够看到,确实成功了,可是这个解觉方案都还能够突破,以下:
 
能够看到,咱们又攻击成功了,只要将Refer改成“http://www.test.com/index?url=http://www.baidu.com/set/nickname”,就能成功的将name改成0,此次又是为何呢?
这是由于咱们判断Refer的方式有错,咱们来看VerficRefer函数的定义:

[Python] 纯文本查看 复制代码

?

1

2

3

4

5

def VerficRefer(Refer):

    CorrectURL='http://www.baidu.com/set/nickname'

if Refer.find(CorrectURL)!=-1:

        return True

        return False


能够看到,它是这样判断的:
if Refer.find(CorrectURL)!=-1
这样的话,咱们只须要知足在咱们的Refer中含有http://www.baidu.com/set/nickname就能成功操做数据。。。
好了,不能再扯下去了,咱们进入第二个主题“信任域与信任边界”。


0x02 信任域与信任边界
关于信任域与信任边界,其实就是两个概念,可以让你更好的思考安全问题。
咱们仍是经过举例子来解决问题,此次咱们来讲霸总吧,话说啊,有一天啊,这个霸总来到洗手间啊,忽然发现了传说中的母厕所(你懂得23333333),因而霸总坚决果断的回家换了套女装,准备混进去看看,嘿嘿。
可是,根据安全原则,被分红了以下这样的区域:
_________________________________
|                                                           |
|                      非信任域                      |
|                (霸总所在区域)              |
|                   ___________                    |                    
|                  |                    |                    |
|                  |     信任域    |                    |
|                  |  (mu厕所)    |                    |  
|                  |___________|                    |
|                                                           |
|                                                           |
|_________________________________|

linux画图软件很差用,因此就画字符画了,233333333333333333
咱们看到,mu厕所属于信任域是高级区域,霸总所在的非信任域属于低级区域。
根据安全原则来讲,低级区域流向高级区域的流量应该通过过滤,去掉恶意的流量。
因此,咱们可怜的霸总,就被“过滤了”
(你TM装也装好点嘛,MD带个把还想进去,哼~~哈哈哈哈哈哈哈)
而信任与与非信任域之间的界线就是信任边界,嘿嘿。


0x03 如何判断安全问题
咱们怎么知道一个问题到底算不算漏洞呢?也就是说咱们怎么知道一个问题是安全问题呢?
其实很简单,道哥曾提到过的“安全三要素”就能解决这种问题,嘿嘿,辣么,所谓的“安全三要素”是哪三要素呢?
  • 机密性(Confidentiality)
  • 完整性(Integrity)
  • 可用性(Availability)
就是这三“贱”客。。。。

只要一个问题威胁到这三要素,则算是一个漏洞,即安全问题。
例如:
  • SQL注射,能够提取用户数据,即破坏了机密性(Confidentiality)
  • 在例如DDOS,可使目标服务器拒绝服务,即破坏了可用性(Availability)
  • 例如越权删除漏洞,能够随意删除其余用户信息,级破坏了用户数据的完整性(Integrity)



0x04 道哥的白帽子兵法
_>Secure By Default原则
1.白名单与黑名单
      这个我就举个很常见的例子,好比文件上传时,使用黑名单策略,不容许上传php的文件,则咱们可使用php4来绕过。


      而若是使用白名单,则只容许jpg,png等文件上传则不会出现此类问题。
2.最小权限原则
     意思是给予管理员和全部用户更少的权限,这样的话即便咱们拿到shell,危害也不大。
_>Defense in Depth原则
     这个咱们就简单说下吧,由于这个要理解会设计比较多的问题,咱们就以“木桶原理”来举例,一个木桶能装多少水是取决与他最短的木板有多长而不是最长的木板有多长。这也就是说安全是一个总体。。。
_>数据与代码分离原则
     这个其实很清晰吧,例如防护SQL注射,防护XSS,就是利用这种原则,几乎全部的代码注入问题,都是这样防护。也就是说因为程序把数据看成代码执行而形成的问题,都该使用这个方案。
_>不可预测性原则
     防护CSRF就是利用的这个原则,防护CSRF的一种叫验证Token的方式就是使用的这种原则。

做者:万年死宅
首发:i春秋社区
注明:转载请务必注明i春秋社区(bbs.ichunqiu.com)
相关文章
相关标签/搜索