安全编码实践之一:注入攻击防御
声明:本文由Bypass整理并翻译,仅用于安全研究和学习之用。
文章来源:https://medium.com/bugbountywriteup/how-to-write-secure-code-against-injection-attacks-aad4fff058da
如何编写安全代码?保护自己免受注入攻击!
我已经在这个问题上工作了好几个月,试图理解是什么让代码变得脆弱,现在,我收到了这个简单的答案 - 糟糕的编程习惯。现在这看起来很明显,但编程社区的很大一部分仍然对这个事实一无所知。
了解问题!
我的意思是渗透测试,并有专门的团队来负责构建的应用程序的安全性是惊人的,总是值得称赞,但它不是每个人都能负担得起的。大公司可以吹嘘他们的安全实践,他们如何让团队全天候工作以保证客户数据的安全,但那些没有资源的人则如此。
我们在银行,航空,网上购物等最重要的应用程序中出现这些易受攻击的代码的最大原因之一是程序员。
最后一行肯定会让很多人受到冒犯,让我说我不是故意要抨击某个社区。我不会这样做因为它不是他们的错,在当前编程时代,代码执行时间需要尽可能低,完全可以理解他们跳过这些部分来增强他们的代码。
所以,我开始做笔记,可以帮助程序员编写安全的代码。我将尝试涵盖不同类型的攻击以及程序员为保持代码安全而进行的小调整,以便他们的组织不需要再次花钱来保证应用程序的安全。我想我今天已经足够了,所以让我们直截了当。
我们来挖掘吧!
让我开始我的定义注入及其发生的原因。攻击者输入恶意有效载荷,可以欺骗解释器执行非预期的命令或访问未经授权的数据。注入缺陷的发生是由于不受信任的数据作为命令或查询的一部分直接发送到解释器而没有检查或清理有效负载导致所有问题的唯一原因。
在本文中,我将介绍三种不同类型的注入攻击和方法,您可以使用它们来防止它们:
1. SQL注入
这种类型的攻击主要发生在攻击者在语句末尾添加一个单引号(')时,将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注入攻击应该涉及输入验证。我们必须检查用户输入的值,并且我们必须始终假设这些值不受信任,即它们可能会损害应用程序。
我们必须使用带有绑定变量的参数化查询,并对用户输入的值执行清理。
在上面的图像中,我们可以看到传递的值如何在被代码使用之前首先被清理。
2.命令注入
这是最危险的注入攻击类型之一,在当今的情景中仍然很普遍,并没有得到太多关注。此攻击利用漏洞,攻击者可以进入并执行应用程序不期望的命令。
让我与您分享一个示例,以显示命令注入攻击的基本实现。
在上面的图像中,我们观察到有一个文本框,我们需要输入主机名/ IP,然后将获取有关IP地址的详细信息,然后呈现给我们。
整个应用程序似乎非常简单,但它很容易受到代码注入的影响。要理解我们首先需要弄清楚应用程序是如何工作的,然后我们可以试着找出然后我们就能理解代码注入是如何工作的。
当我们输入主机名/ IP时,应用程序实际上会调用终端,然后从那里向我们显示输出。那些与终端合作的人他们知道我们可以在终端中使用&&同时传递两个不同的命令。
因此,上图显示了代码注入的确切方式。为了避免这种攻击,应用程序需要执行路径验证(规范化然后进行绝对路径检查),应用程序还需要执行输入验证以及枚举它允许用户输入和执行的命令。
枚举{dir,cd,cls}
3. JSON注入
这是一次重要的注入攻击,而且近年来在应用程序中经常使用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);
道德
我们可以做的最重要的事情是防止注入攻击发生,就是相信来自用户端的任何和所有输入都可能是攻击。程序员大多理所当然地认为,用户输入的内容不会对导致应用程序中大部分漏洞的应用程序造成伤害。必须对使用方的每个输入进行消毒,并且必须在应用程序使用之前验证输入。用户输入的值绝不能直接传递给程序。
如果程序员记住这些事情,他们肯定可以防御大多数的注入攻击。