成为一个破坏者的第一部分:Web安全
Posted on成为一个破坏者的第一部分:Web安全
成为一个破坏者的第一部分:Web安全
在我看来,没有什么比挑战安全领域更有挑战性。当强大的软件一个接一个接踵而至,你所需要做的就是破解他,这好比是一场围棋游戏。当你每下一步棋,你的对手——软件的设计者和开发者,通过代理——作出相应的回应。正如你所知的,赢的途径只有一条,你将会利用大脑的每一部分,找出链条中的弱点。
当我找到正确的击破点,并且整个系统崩溃的时候,我觉得我找到了自己。你也会的。
序言
这篇博客的目的并不是要全面地去讨论;实际上,它是相反的。我的目的是教会你关于安全上足够的东西——尤其是软件安全——你可以自己去深入学习其他东西。为了轻松去学习,我会在通篇博客中放置各种资源的链接;在这里,Google也是你最好的朋友,它在这个主题上有上百万的资源。
在你读了正文部分后,你可以跳去其他的你认为合适的任何部分(包括其他由之而来的博客),因为它们是独立编写的。
这篇博客主要关注Web安全。对于底层安全和加密的博客即将发布。
正文
预备知识
要想出一些安全领域的预备知识是比较难的,这知识由于这领域的涉及面太广。然而,下面的东西还是必需要有的:
- 熟悉一种或多种编程语言(没有人会让你用你不会的语言来写小说)。如果你感兴趣的是底层的安全,那就必需要会一种底层语言;C是最好的。
了解计算机的原理和它是怎样工作的。不要求你能够用铁罐和线组装层一个CPU,但你要能够解析:
(Web) HTML是怎样转换的以及JS是怎样在页面上交互的。
(Web) HTTP协议是怎样工作的。
实际上,写一个代理。你最后就做了很多这些东西。(这实际上是足够重要的,某天我可能会写一个关于这个的博客。)
- (底层) 指针是怎样工作的,栈是怎样布局的,堆是什么东西,以及(附加要点)系统调用是怎样工作的。
在需要的地方,我会讲下更多的特殊预备知识。
心态
在我继续之前,我需要触摸一下破坏者的心态。你的目标并不是保存用户交互,或是程序的数据流。你的目标是回答一个简单的问题:在什么情况下,程序无法完成其既定目标?
或许对此最好的例子就是网络应用中存在的跨站脚本攻击;攻击者可以在页面之外输出未经过滤的内容,允许其在页面中插入任意的HTML代码。正常的数据流存留——从用户到页面的数据——但由于数据中含有HTML代码,页面被完全损坏了》
预期和实际行为的区别在于你对所有可能性的探寻——无论是下节中描述的标准bug,还是你正测试的问题域的特有逻辑缺陷。
网络安全
必用工具
下面是一个你的兵器库中必备工具的列表。其中一些是很多工具的集合——除非特别提及,它们大多是可以相互替换的。
HTTP(S) 代理——你会经常用到,它将允许你在传输过程中分行和修改数据。
Burp 代理——除非有理由,否则你值得拥有。这是业内标准,学习曲线很浅。
- mitmproxy
- Charles 代理 (界面非常糟糕,只在对 AMF 时使用它。)
- DirBuster —— 对查找“隐藏”的文件/目录很有用。
- PadBuster —— 侦查填充溢出漏洞很有用。
- Python or Ruby —— 对任务进行自动化处理。
跨站脚本漏洞(XSS)
跨站脚本是网站最常见的漏洞。这个概念很简单:攻击者的数据发送到页面没有经过合适的过滤,使攻击者的代码可以在页面上下文内执行。
反射XSS(Reflected XSS)是攻击者的注入(比如查询字符串)后页面直接显示攻击结果。这是最常用的也是使用最多的CSRF攻击方式(见下一节)。他们可以被许多现代Web框架默认防御掉。
存储XSS(Stored XSS)是攻击者把数据注入到存储单元中——一般是数据库——在此后的某个时段无过滤的输出结果。这种XSS没有反射XSS普遍,但是杀伤力更大,因为很容易影响到大量用户。和反射XSS一样,许多框架默认也可以防御。
基于DOM的XSS(DOM-based XSS)是注入到JavaScript中,浏览器无过滤的输出结果。这种XSS相当罕见但是无法被框架防御。因而相对别的XSS形式,基于DOM的XSS在逐渐增多。
在所有情况下,他们都可以被输出前的数据过滤阻止,但重要的是正确地编码数据。例如HTML编码没办法防御数据中script标签中的代码;这样JS字符串也需要编码。
CSRF攻击很简单,但很常见很有效。基本的原理是攻击者把受害者引导(重定向或Email中的链接)到目标网站上。这个页面带有执行请求的数据,比如银行事务。从后端看,就像是用户自己做的一个正常的请求。
防御CSRF的方法是在表单数据中加入随机令牌(token)。每次请求后端都验证token,确定用户会话token和表单数据token相同,否则拒绝请求。尽管主流框架都内置CSRF防御,但CSRF仍然是常见的攻击方式。
SQL注入
SQL注入是目前Web应用中最著名最普遍的漏洞。它是利用SQL查询时没有合适的转义,攻击者可以阻断原有查询并添加自己的查询代码。
根据代码和数据库配置情况,他可以造成从较大(盲注入查询数据)到在灾难级(任意代码执行,文件访问权限和数据破坏等)的破坏。主流的框架使用自带的ORM防御SQL注入:所有都用预备参数查询。当原生查询和攻击数据混合时,必须进行合适的转义。
Shell注入非常罕见,但非常严重。如果用户无过滤的传递shell命令,有可能——通过引号,分号或其他符号——同时执行其他命令。
使用用户数据调用shell命令最好把命令打包数组里(这是自然免疫)提供给程序,而且对原始命令字符串拼接的命令恰当的转义。
目录遍历
目录遍历通常用于将用户信息直接指向系统中文件路径的情形。这样,如果没有适当的过滤,可能插入一个 “..” 目录的引用,就可以查阅目录树。它可能允许任意的读/写/删除文件操作,这是一个非常常见的漏洞。
- Wikipedia
授权不足
授权不足 指的是某些功能或数据没有设定访问控制的情形。有个例子,一个正确设定访问控制的管理控制台有一个对有管理员身份需求的功能的链接,而此功能本身并未正确的设置访问控制。
这通常用于强制浏览攻击,以非法控制数据。
强制浏览
强制浏览——又叫 直接对象引用——是一种嫁给你实现细节以可修改的方式暴露给用户的漏洞类型。通常,它的形式是在请求中出现一个可以很容易修改的 id 参数,使攻击者可以轻易的列举出可能的标识符,以访问和修改数据。
其它
上面的话题是一个很好的开始,它们是我在测试现实世界中的应用时,不断出现的东西。当然,我给出的列表并不全面,所以下面列出了一些其它的主题,你应该读一下:
处于对 Natas 网络安全的兴趣,我在近期指点了很多人。在这网络游戏中,你将使用到很多我在本文中提到过得技术,还有一些技术我并没有提及。它们也很有趣。
其它优质资源:
- Stripe CTF 2.0
- OWASP's WebGoat and Vicnum
- Maven's Web Security Dojo
- Peruggia
深入学习
希望完成练习并深入到实际应用中去?现在,很多公司都有 Bug 奖励系统,这样你不仅可以合法的测试它们的软件,同时还可以由自己发现的 Bug 获取报酬。你可以在 这里找到这些软件的列表。 Happy hacking,
时间:2013-03-19 08:47来源:开源中国社区 作者:oschina责任编辑:陈华才