web应用程序的十大安全漏洞(代码片段)

crazy_itman crazy_itman     2023-03-03     690

关键词:

应用程序的安全性非常重要,解决安全问题的方法有很多,但一个有效的入门方法是解决 OWASP(开放 Web 应用程序安全项目)确定的十大安全问题。在本文中,我们将介绍当前应用程序的十大安全漏洞。

OWASP 是一个致力于 Web 应用程序安全的国际组织,社区每四年发布一次OWASP Top 10报告,其中概述了 Web 应用程序最紧迫的安全问题。我们将从 PHP 开发人员的角度审视这些漏洞,但它们与使用任何编程语言构建应用程序都相关。

OWASP 安全漏洞:概述和比较

2021 年 OWASP Top 10 列表列出了 10 个最危险的 Web 应用程序安全漏洞。如果我们将当前列表与 2017 年列表进行比较,我们可以看到列表中仍然存在一些安全漏洞,但位置不同,并且列表中还包含一些新的安全漏洞。

下表比较了 2017 年和 2021 年的列表。(2021 年列表中引入的安全漏洞以粗体标出,其余的只是重新排列)

2017 OWASP Top 102021 OWASP Top 10
#1 – Injection#1 – Broken Access Control
#2 – Broken Authentication#2 – Cryptographic Failures
#3 – Sensitive Data Exposure#3 – Injection
#4 – XML External Entities (XXE)#4 – Insecure Design
#5 – Broken Access Control#5 – Security Misconfiguration
#6 – Security Misconfiguration#6 – Vulnerable and Outdated Components
#7 – Cross-site Scripting (XSS)#7 – Identification and Authentication Failures
#8 – Insecure Deserialization#8 – Software and Data Integrity Failures
#9 – Using Components with Known Vulnerabilities#9 – Security Logging and Monitoring Failures
#10 – Insufficient Logging and Monitoring#10 – Server-side Request Forgery (SSRF)

该表表明大多数针对 Web 应用程序的安全漏洞都没有改变。当开发人员试图修复这些缺陷时,他们的方法发生了变化。与普遍的看法相反,避免这些安全漏洞很容易入手;我们只需要知道适用于特定安全问题的一些基本规则。

让我们深入研究这些安全问题。

损坏的访问控制

根据 2021 年版的 OWASP,我们最应该关注的问题是访问控制被破坏。损坏的访问控制就像它听起来的那样:当我们对控制应用程序的访问方式存在缺陷时,就会发生这种情况。损坏的访问控制示例如下图所示。

<form method="post" action="">
<input type="text" name="Username" placeholder="Your Username?">
<input type="text" name="Password" placeholder="Your Password?">
<input type="submit" name="Submit" value="Log In">
</form>

<?php
if(isset($_POST['Submit'])) 
  $Username = $_POST['Username'];
  $Password = $_POST['Password'];
  if(!empty($Username)) 
    if(!empty($Password)) 
    header("loggedin_page.php");
    exit;
    
  

?>

看到问题了吗?该代码只是检查用户名和密码字段是否不为空。如何在数据库中运行几个查询以确保用户名和密码存在?验证相关帐户?那部分很容易被遗忘。用户可以简单地在用户名和密码字段中输入任何内容以确保它们不为空,单击提交,用户将登录。

为避免破坏访问控制问题:在将用户标记为已登录之前,始终根据数据库验证用户名(电子邮件)和密码字段。

加密失败

加密失败以前被称为“敏感数据泄露”。敏感数据暴露被重命名为“加密失败”,因为这解决了许多安全问题,而“敏感数据暴露”仅解决其中一个问题。

加密失败涵盖了加密数据的失败,这通常会导致敏感数据暴露。PHP 中的密码失败主要与密码有关:使用设计缓慢的散列算法(想想 BCrypt 和 Blowfish)以外的任何东西来散列它们都是密码失败,因为其他类型的散列(MD5 和类似的)很容易且快速蛮力。

为避免加密失败:确保存储在数据库中的所有密码都使用慢于暴力破解的算法进行哈希处理。我建议选择 Blowfish 或 BCrypt,因为这些算法可以长期安全使用,并经过安全专家的测试,并被证明可以抵御攻击。

如果有很多用户使用您的应用程序,您可能还想研究一下salting。对于大量的哈希值,盐会减慢破解过程。

注入和不安全设计

注入是网络上讨论最频繁的安全问题。每个人都听说过:将用户输入传递给数据库,你就有了注入漏洞。注入攻击相对容易克服,但由于连接到数据库的应用程序数量庞大,它们仍然是一个问题。

下图描述了一个相关的代码示例。

<form method="post" action="">
<input type="text" name="Username" placeholder="Your Username?">
<input type="text" name="Password" placeholder="Your Password?">
<input type="submit" name="Submit" value="Log In">
</form>

<?php
if(isset($_POST['Submit'])) 
  $Username = $_POST['Username'];
  $Password = $_POST['Password'];
  if(!empty($Username)) 
    if(!empty($Password)) 
$Query = $DB->query("SELECT * FROM users WHERE username = $Username AND password = $Password");
     else 
    echo "Password empty!";
    exit;
    
   else 
    echo "Username empty!";
    exit;
  

?>

上面显示的缺陷是不言自明的:当任何用户输入被传递到数据库时,任何人都可以做任何想做的事。此缺陷并非 PHP 独有。如果您使用任何其他编程语言将用户输入直接传递到数据库中,您将遇到完全相同的问题。

成功安装的 SQL 注入攻击的后果范围很广,但在大多数情况下,它们包括以下内容:

  • 攻击者可以备份用户表,对其他信息系统进行撞库攻击。

  • 攻击者可以获得数据库内部的管理权限,然后修改或删除其中的表。

如果成功执行这两项操作,将对任何业务都不利。用户表的数据库转储将导致它在暗网上出售,一旦出售并且攻击者获利,其他攻击者将使用该数据进行撞库攻击。获得对存储用户数据的数据库的管理权限的攻击者也会造成严重破坏——不仅对网站用户,而且对网站所有者,他们将受到负面公众审查的风暴。

为避免 SQL 注入:将 PDO 与参数化查询一起使用。这种方法可以保护应用程序免受 SQL 注入攻击,因为数据是与查询本身分开发送的。

前面显示的这种查询方法如下图所示(注意第 13 和 14 行的变化)。

<?php
if(isset($_POST['Submit'])) 
  $Username = $_POST['Username'];
  $Password = $_POST['Password'];
  if(!empty($Username)) 
    if(!empty($Password)) 
    $Query = $DB->prepare("SELECT * FROM users WHERE username = :Username AND password = :Password");
    $Query->execute(array(":Username" => $Username, ":Password" => $Password));
     else 
    echo "Password empty!";
    exit;
    
   else 
    echo "Username empty!";
    exit;
  

?>

另一方面,不安全设计与注入不同,有一个单独的类别。注入是不安全设计的一部分,但不安全设计不是注入。不安全的设计涵盖代码是如何通过设计编写的(即默认情况下)。这意味着,如果默认情况下,您的代码将任何用户输入传递给数据库,或者如果它允许用户在不验证自己的情况下登录,或者如果它允许他们在不检查其扩展名的情况下上传文件,或者如果它返回用户输入而不验证它,就存在有一个不安全的设计缺陷。

为避免 SQL 注入、将用户输入传递到数据库以及不安全的设计缺陷,请确保您遵循 OWASP 或其他供应商概述的安全编码指南。如果您遵循这些准则,您应该在这方面是安全的。

安全配置错误和过时的组件

这两个缺陷与前面提到的不同,但它们也是非常危险的。

在探测应用程序是否存在可能的安全配置错误漏洞时,攻击者会查看所有内容。他们会尝试访问默认帐户、访问应受保护的页面、利用未修补的漏洞等。在这种情况下,我们唯一的希望是针对各种漏洞更新和修补组件。过时的组件通常带有严重的漏洞,如果被利用,可能会导致数据库泄露和敏感数据暴露、服务器宕机、声誉受损、罚款等。

这就是为什么始终执行以下操作至关重要:

  • 确保您的应用程序使用的组件始终是最新的。

  • 确保在一段时间不活动后强行注销用户。(也就是说,确保会话在指定时间段后过期。)

  • 如果可能,请考虑在尝试提交表单或登录网站的某个部分等一段时间后尝试实施验证码。

  • 如果可能,请使用 Web 应用程序防火墙来保护您的 Web 应用程序免受针对它的攻击,并考虑使用类似Cloudflare提供的服务来同时保护您的应用程序免受 DoS 和 DDoS 攻击。

为避免错误配置和过时的组件缺陷:确保您使用的是更新的组件,并且您的代码遵循上述基本安全标准。

为了使您的应用程序更加安全,请特别注意让用户验证自己的组件。

识别和认证失败

识别和身份验证失败以前称为“身份验证失效”漏洞。当应用程序没有充分保护自身允许用户进行身份验证的部分时,就会出现此类漏洞,这可能意味着以下一种或多种情况:

  • 该应用程序不会通过使用验证码或其他措施来保护其表单免受暴力破解。

  • 应用程序的注册页面允许使用弱密码。(也就是说,应用程序没有定义最小密码长度。)

  • 注册表单缺少“重复密码”字段。(也就是说,用户注册时没有仔细检查他们的密码是否正确。)

  • 更改密码的表单不受CSRF(跨站点请求伪造)的保护,允许用户 B 代表用户 A 伪造请求。(也就是说,用户 B 可以发送一个特制的 URL,该 URL 在打开时会用户 A 的密码。)

  • 可以枚举帐户:应用程序根据某个帐户是否存在于数据库中来提供不同种类的消息。

  • 该应用程序以纯文本形式存储密码。

  • 应用程序在输入参数中指定用户名后返回用户名,而不对其进行过滤。(这种方法会引发XSS 攻击,攻击者能够将恶意脚本注入网站。)

为避免识别和身份验证失败:确保安全地构建注册和登录表单。当然,说起来容易做起来难,但是按照下面概述的步骤操作,您就可以开始了:

  • 确保所有注册用户都使用安全密码。(执行八个字符或更多字符的策略。)

  • 在登录尝试失败一定次数(例如五次或更多次)后,向用户显示验证码。换句话说,强制执行速率限制。

  • 确保用户提供的所有参数都是干净的。(也就是说,不要在未经验证的情况下将用户输入返回给用户。这样做会引发 XSS 攻击。)

  • 确保允许更改密码的表单针对 CSRF 进行保护。换句话说,生成一个令牌,该令牌在每次请求时都会发生变化,以使攻击者无法伪造请求并伪装成用户。

  • 尽可能使用双因素身份验证,以避免针对您的登录表单的凭据填充攻击。

软件和完整性故障以及日志记录和监控问题

虽然与日志记录和监控机制相关的问题相对不言自明,但软件和完整性故障可能不是。不过,这并没有什么神奇之处:OWASP 社区只是告诉我们,我们应该验证我们正在使用的各种软件的完整性,无论它是否基于 PHP。想一想:您上次更新应用程序是什么时候?您是否验证了更新的完整性?您加载到 Web 应用程序中的资产如何?

请看下图所示的代码示例。你注意到什么了吗?

<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-rbsA2VBKQhggwzxH7pPCaAg046MgnOM80zWlRWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">

<form method="post" action="">
<input type="text" name="Username" placeholder="Your Username?">
<input type="text" name="Password" placeholder="Your Password?">
<input type="submit" name="Submit" value="Log In">
</form>

<?php
if(isset($_POST['Submit'])) 
  $Username = $_POST['Username'];
  $Password = $_POST['Password'];
  if(!empty($Username)) 
    if(!empty($Password)) 
    $Query = $DB->prepare("SELECT * FROM users WHERE username = :Username AND password = :Password");
    $Query->execute(array(":Username" => $Username, ":Password" => $Password));
     else 
    echo "Password empty!";
    exit;
    
   else 
    echo "Username empty!";
    exit;
  

?>

<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"
integrity="sha384-kenUlKFdBIe4zVFOs0G1M5b4hcpxyD9F7jL+jjXkk+Q2h455rYXK/7HAuoJl+0I4" crossorigin="anonymous"></script>

样式表和加载到其中的 JavaScript 文件都受到完整性属性的保护。完整性属性对于确保加载到 Web 应用程序中的样式表和 JavaScript 文件未被篡改至关重要。如果文件的代码自首次生成完整性属性时发生了根本变化,则脚本将不会加载到 Web 应用程序中,而是会显示错误,如下图所示。

虽然在某些情况下违反完整性会发出警告(如上图所示),但在其他情况下后果会更严重并可能导致数据泄露。

为确保您的代码未被篡改,正确监控您的基础设施至关重要,但这种方法本身可能存在缺陷。当您的监控方法有缺陷时,您不会发现错误。有些错误很小,如上图所示。有些错误更为严重,例如当您的应用程序容易受到 SQL 注入、安全配置错误或上面列出的任何其他缺陷的攻击时。因此,请务必确保您的应用程序正在记录与您网站的关键功能相关的任何异常情况。

这样做说起来容易做起来难,但是使用软件来监控您网站的整个周边以防止未经授权的、与安全相关的事件是一个很好的起点。不幸的是,只有当您的应用程序相当小时,手动监控一切才可行,但从长远来看,它不会让您走得太远。

要缓解软件和完整性故障以及日志记录和监控问题:查看 Web 应用程序防火墙产品,例如CloudflareSucuriImperva提供的产品。请记住:向安全供应商付费总是比从数据泄露中恢复更便宜。

服务器端请求伪造

2021 年 OWASP Top 10 列表中的最后一个重要问题是服务器端请求伪造 (SSRF)。SSRF是一种允许恶意方通过易受攻击的服务器向网站发送请求的攻击。SSRF 是 OWASP 列表中的一个新漏洞,它的行为与其 CSRF 表亲相似。CSRF 旨在代表用户发出意外请求,而 SSRF 则针对服务器。SSRF 强制应用程序向攻击者设置的位置发出请求。请看下图所示的一段代码。(请注意,对函数的调用应该在任何文本写入页面之前header()完成,否则调用可能会被忽略)

<?php
if(isset ($_POST['Submit'])) 
  $URL = $_GET('picture_url'];
  if(filter_var($URL, FILTER_VALIDATE_URL)) 
  $Contents = file_get_contents($URL);
  header("Content-Type: image/png");
  echo $Contents;
  header ("Location:picture_changed.php");
  exit;
   else 
  echo "Incorrect URL.";
  exit;
  

?>

这段代码做了几件事。它首先检查 GET 参数中提供的 URL 是否picture_url是有效的 URL。然后它将 URL 中的内容提供给用户,并将用户重定向到另一个 PHP 脚本。向用户提供 URL 中的内容正是使此 PHP 代码容易受到 SSRF 攻击的原因。显示用户提供的任何内容都是危险的,因为用户可以执行以下任何操作:

  • 提供指向服务器上内部文件的 URL 并读取敏感信息。例如,当file:///etc/passwd/提供类似 URL 时,易受 SSRF 影响的应用程序将/etc/passwd在屏幕上显示该文件。但是此文件包含有关拥有在服务器上运行的进程的用户的信息。

  • 为应用程序提供服务器上文件的 URL,然后读取文件。(考虑为服务器上的 Web 服务提供 URL,等等。)

  • 向应用程序提供网络钓鱼页面的 URL,然后将其转发给用户。由于网络钓鱼页面将驻留在原始 URL(您服务器的 URL)上,因此毫无戒心的用户很可能会上当受骗。

避免 SSRF:可以说,避免此类攻击的最简单方法是使用可使用的 URL 白名单。PHP Web 应用程序中的白名单类似于下图所示的代码行。(特别注意第 25 到 28 行)

<?php
if(isset ($_POST['Submit'])) 
  $URL = $_GET('picture_url'];

  $whitelist = array("https://google.com", "https://twitter.com", ""...");
  if(!in_array($URL, $whitelist)) 
    echo "Incorrect URL.";
  

  if(filter_var($URL, FILTER_VALIDATE_URL)) 
  $Contents = file_get_contents($URL);
  header("Content-Type: image/png");
  echo $Contents;
  header ("Location:picture_changed.php");
  exit;
   else 
  echo "Incorrect URL.";
  exit;
  

?>
</div>
</form>

现在,应用程序将 URL 的输出回显给用户不再是问题,因为 URL 列表由您控制。您的应用程序不再容易受到 SSRF 攻击!

概括

在本文中,我们向您介绍了可能危及您的 PHP Web 应用程序的十大安全漏洞。其中一些缺陷在 2021 年首次出现在 OWASP 中,其他缺陷则从 2017 年旧版 OWASP 中重新洗牌。然而,有一个原则是不变的:所有这些都是相对危险的,应该妥善处理。

“owasptop102017”之外常见漏洞的代码审计(代码片段)

OWASPTOP10总结了Web应用程序中常见且极其危险的十大漏洞,在第5章中我们以2017版本为例详细介绍了这10项漏洞在代码审计中的审计知识,但除了OWASPTop10外,还有很多漏洞值得我们在代码审计中给予关注。本章将介绍一... 查看详情

网络攻防第五周作业(代码片段)

1.Web应用程序安全攻防Web应用体系结构包括浏览器、web服务器、web应用程序数据库、传输协议。Web应用安全威胁和攻击类型:针对浏览器和终端用户的Web浏览安全威胁;系统层安全威胁;Web服务器软件安全威胁;Web应用程序安全... 查看详情

OWASP 十大攻击与 Spring Security

...时间】:2014-08-0702:00:21【问题描述】:我正在评估我的Web应用程序的安全性。当我在我的Web应用程序中使用Spring时,我想利用SpringSecurity框架。我搜索了有关网络安全的更多信息,发现了OWASP社区,它是前10名攻击列表。所以我的... 查看详情

猿创征文|网络安全的十大经典工具介绍

...sHCLAppScanStandardAcunetixCobaltStrikeBurpSuiteBurpSuite是用于攻击web应用程序的集成平台,包含了许多工具。BurpSuite为这些工具设计了许多接口,以加快攻击应用程序的过程。所有工具都共享一个请求, 查看详情

web漏洞扫描工具awvs使用(代码片段)

...。在被黑客攻击前扫描购物车,表格、安全区域和其他Web应用程序。75%的互联网攻击目标是基于Web的应用程序。因为他们时常接触机密数据并且被放置在防火墙之前。AWVS的 查看详情

cicd-代码审计(漏洞扫描工具-代码审计静态代码分析和安全检测-代码覆盖率)(代码片段)

...题层出不穷。本文根据当前Web应用的安全情况,列举了Web应用程序常见的攻击原理及危害,并给出如何避免遭受Web攻击的建议。Web应用漏洞原理Web应用攻击是攻击者通过浏览器或攻击工具,在URL或者其它输入区域(如表单等),... 查看详情

web应用安全--dvwa部署(linuxdocker版)(代码片段)

...应用网站),是一个编码糟糕的、易受攻击的PHP/MySQLWeb应用程序。它的主要目的是帮助安全专业人员在合法的环境中,测试他们的技能和工具,帮助Web开发人员更好地了解如何增强Web应用 查看详情

2021年数据中台行业十大关键词(代码片段)

...起了许多热门概念。我们盘点了过去一年中数据中台行业十大热门关键词,包括了云原生、隐私计算这类热门技术;国产化信创、PBC这类市场趋势;还有轻量级数据中台、CDP等热门业务方向。这些概念在丰富现有模式... 查看详情

owasptop102022介绍(代码片段)

...10.服务器端请求伪造(SSRF)每年OWASP(开放Web应用程序安全项目)都会发布十大安全漏洞。它代表了对Web应用程序最关键的安全风险的广泛共识。1.失效的访问控制访问控制实施策略以防止用户超出其指定权限范... 查看详情

web安全之代码执行漏洞(代码片段)

代码执行漏洞应用程序在调用一些能够将字符串转换为代码的函数(如PHP中的eval)时,没有考虑用户是否控制这个字符串,将造成代码执行漏洞。一些代码执行命令函数eval()assert()call_user_func()/call_user_func_array()crea... 查看详情

72个网络应用安全实操要点,全方位保护web应用的安全(代码片段)

...对于开发者而言,网络安全的重要性不言而喻。任何一处代码错误、一个依赖项漏洞或是数据库的端口暴露到公网,都会有可能直接送你上热搜。那么,哪里可以找到详细的避雷指引呢?OWASP\'stop10清单太短了,而且它更关注的... 查看详情

文件上传漏洞专题(代码片段)

文件上传漏洞专题一、文件上传漏洞基础? web应用程序在处理用户上传的文件操作时,如果用户上传的文件的路径、文件名、扩展名成为用户可控数据,就会导致直接上传脚本木马到web服务器,直接控制web服务器? 文件上传:文... 查看详情

netsec201920165327exp9web安全基础(代码片段)

...于进行web漏洞实验的应用平台,用来说明web应用中存在的安全漏洞。WebGoat运行在带有java虚拟机的平台之上,目前提供的训练课程有很多,包含了XSS、线程安全、SQL注入、访问控制、隐藏字段、Cookie等。操作参考:WebGoat中文手册... 查看详情

2023年十大api管理趋势(代码片段)

...那么,究竟什么是API呢?API(ApplicationProgrammingInterface,应用程序接口)是一系列预先定义的规则和约定,目的是用于不同软件应用之间的通信。API使得一个软件应用程序(即客户端)能够请求另一个软件应用程序(即服务器)... 查看详情

常见的安全扫描漏洞的工具漏洞分类及处理(代码片段)

...eb管理员或安全工程师们并不知道。Parosproxy这是一个对Web应用程序的漏洞进行评估的代理程序,即一个基于Java的web代理程序,可以评估Web应用程序的漏洞。它支持动态地编辑/查看HTTP/HTTPS,从而改变cookies和表单字段等项目... 查看详情

网络安全统计显示xss和过时的软件是主要问题(代码片段)

...据是关于他们的在线解决方案在过去3年中在其用户的Web应用程序和Web服务上发现的安全漏洞。    这些基于数据的统计数据(不是基于调查)可能非常有用-至少可以全面了解正在发生的事情。这些统计数据还有一个坚... 查看详情

防火墙和系统安全防护和优化(代码片段)

网络系统安全防护      云盾Web应用防火墙(WebApplicationFirewall,简称WAF)基于云安全大数据能力,用于防御SQL注入、XSS跨站脚本、常见Web服务器插件漏洞、木马上传、非授权核心资源访问等OWASP常见攻击,并... 查看详情

web安全之命令执行漏洞(代码片段)

...以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。远程系统命令执行一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口。远程代码执行同样的道理,... 查看详情