声明:本文由Bypass整理并翻译,仅用于安全研究和学习之用。程序员
文章来源:https://medium.com/bugbountywriteup/how-to-write-secure-code-against-injection-attacks-aad4fff058da数据库
如何编写安全代码?保护本身免受注入攻击!编程
我已经在这个问题上工做了好几个月,试图理解是什么让代码变得脆弱,如今,我收到了这个简单的答案 - 糟糕的编程习惯。如今这看起来很明显,但编程社区的很大一部分仍然对这个事实一无所知。浏览器
个人意思是渗透测试,并有专门的团队来负责构建的应用程序的安全性是惊人的,老是值得称赞,但它不是每一个人都能负担得起的。大公司能够吹嘘他们的安全实践,他们如何让团队全天候工做以保证客户数据的安全,但那些没有资源的人则如此。安全
咱们在银行,航空,网上购物等最重要的应用程序中出现这些易受攻击的代码的最大缘由之一是程序员。cookie
最后一行确定会让不少人受到冒犯,让我说我不是故意要抨击某个社区。我不会这样作由于它不是他们的错,在当前编程时代,代码执行时间须要尽量低,彻底能够理解他们跳过这些部分来加强他们的代码。工具
因此,我开始作笔记,能够帮助程序员编写安全的代码。我将尝试涵盖不一样类型的攻击以及程序员为保持代码安全而进行的小调整,以便他们的组织不须要再次花钱来保证应用程序的安全。我想我今天已经足够了,因此让咱们直截了当。学习
让我开始个人定义注入及其发生的缘由。攻击者输入恶意有效载荷,能够欺骗解释器执行非预期的命令或访问未经受权的数据。注入缺陷的发生是因为不受信任的数据做为命令或查询的一部分直接发送到解释器而没有检查或清理有效负载致使全部问题的惟一缘由。测试
在本文中,我将介绍三种不一样类型的注入攻击和方法,您可使用它们来防止它们: ui
这种类型的攻击主要发生在攻击者在语句末尾添加一个单引号(')时,将OR添加到语句后面的真值总数。简单来讲,SQL有效负载看起来像这样
'或1 = 1 -
添加到查询中的上述语句能够帮助攻击者得到对完整数据库的访问权限。为了让您更好地理解下面的查询,它将为攻击者提供整个数据库。
SELECT * FROM Users WHERE UserName ='Aditya'OR 1 = 1--
看看下面的代码,并试着弄清楚它是否容易受到SQL注入攻击。
若是您认为上述代码是安全的,那么您必定要继续阅读本文。
代码不安全的缘由是由于攻击者输入的值直接做为参数传递。只要输入了预期值,但用户的输入可能包含%1 $ tm,%1 $ te和%1 $ tY格式说明符,状况就很好。
若是攻击者为args [0]传入值%1 $ tm,则结果将以下。
05不匹配!提示:它是在某个月的23日发布的。 // 05是用户验证本身须要知道的月份。
您能够看到该程序自己将在信用卡到期日的当月出炉。
为了不这种攻击,下面的代码可能很是有用。
这两个代码之间的惟一区别是,在第一个代码中,攻击者输入的值直接传递给程序,而在第二个代码中,咱们不是传递值,而是直接将其打印出来,使得整个攻击无用。
防止SQL注入攻击应该涉及输入验证。咱们必须检查用户输入的值,而且咱们必须始终假设这些值不受信任,即它们可能会损害应用程序。
咱们必须使用带有绑定变量的参数化查询,并对用户输入的值执行清理。
在上面的图像中,咱们能够看到传递的值如何在被代码使用以前首先被清理。
这是最危险的注入攻击类型之一,在当今的情景中仍然很广泛,并无获得太多关注。此攻击利用漏洞,攻击者能够进入并执行应用程序不指望的命令。
让我与您分享一个示例,以显示命令注入攻击的基本实现。
在上面的图像中,咱们观察到有一个文本框,咱们须要输入主机名/ IP,而后将获取有关IP地址的详细信息,而后呈现给咱们。
整个应用程序彷佛很是简单,但它很容易受到代码注入的影响。要理解咱们首先须要弄清楚应用程序是如何工做的,而后咱们能够试着找出而后咱们就能理解代码注入是如何工做的。
当咱们输入主机名/ IP时,应用程序实际上会调用终端,而后从那里向咱们显示输出。那些与终端合做的人他们知道咱们能够在终端中使用&&同时传递两个不一样的命令。
所以,上图显示了代码注入的确切方式。为了不这种攻击,应用程序须要执行路径验证(规范化而后进行绝对路径检查),应用程序还须要执行输入验证以及枚举它容许用户输入和执行的命令。
枚举{dir,cd,cls}
这是一次重要的注入攻击,并且近年来在应用程序中常用API的状况愈来愈多。当咱们在API发出请求和响应查询时将有效负载注入到传递的JSON查询中时,JSON注入工做。
这个例子很容易理解,这个应用程序有一个下拉菜单,您须要从中选择一个PenTest工具选项,应用程序将向您显示您选择的PenTest工具的详细信息。
所以,让咱们尝试了解此应用程序的工做原理。让咱们打开burp-suite并拦截应用程序发出的请求。
所以,在上面的图像中,咱们能够看到ToolId正在请求查询中发送,咱们将有效负载添加到ToolId,以检查它是否在响应查询中反映给咱们。
咱们确实收到了咱们在请求查询中注入的有效负载,所以咱们能够确保咱们的注入攻击将经过。让咱们执行攻击有效载荷并确认攻击是否有效。
看到咱们以前收到的回复,让咱们传递此值以获取cookie值。
“}});警报(document.cookie中); //
在传入参数中的值以前,咱们对其进行url-encode以免可能已经放置的任何特殊字符限制。
咱们能够清楚地看到cookie值已经在警报框中返回给咱们,它确认攻击已经经过。
咱们须要检查攻击在浏览器中的实际状况,并根据须要显示cookie详细信息。
防止JSON注入攻击的最有效方法是在JavaScript上执行编码技术。OWASP还提供了一种JSON杀菌剂,可用于字符串验证。
String someValidation = JsonSanitizer.sanitize(myJsonString);
咱们能够作的最重要的事情是防止注入攻击发生,就是相信来自用户端的任何和全部输入均可能是攻击。程序员大多理所固然地认为,用户输入的内容不会对致使应用程序中大部分漏洞的应用程序形成伤害。必须对使用方的每一个输入进行消毒,而且必须在应用程序使用以前验证输入。用户输入的值毫不能直接传递给程序。
若是程序员记住这些事情,他们确定能够防护大多数的注入攻击。