Web安全常见漏洞攻防

1.SQL注入

1.1 简介

SQL注入是一种代码注入技术,用于攻击数据驱动的应用程序。 在应用程序中,如果没有做恰当的过滤,则可能使得恶意的SQL语句被插入输入字段中执行(例如将数据库内容转储给攻击者)。

1.2 示例及应对

根据使用的技巧,SQL注入类型可分为

  • 盲注

    布尔盲注:只能从应用返回中推断语句执行后的布尔值

    正常查询:
    SELECT * FROM users WHERE username = '输入的用户名' AND password = '输入的密码';
    始终返回真:
    攻击者可以尝试以下输入: 
    - 用户名:admin' AND 1=1 -- 
    - 密码:任意密码 
    这将导致SQL查询变为: 
    SELECT * FROM users WHERE username = 'admin' AND 1=1 --' AND password = '任意密码'; 
    如果应用程序对输入进行了不当处理,那么它可能会将查询视为: 
    SELECT * FROM users WHERE username = 'admin' AND 1=1 
    始终返回假:
    如果攻击者尝试以下输入: 
    - 用户名:admin' AND 1=2 -- 
    - 密码:任意密码 
    这将导致SQL查询变为: 
    SELECT * FROM users WHERE username = 'admin' AND 1=2 --' AND password = '任意密码'; 
    如果应用程序对输入进行了不当处理,那么它可能会将查询视为: 
    SELECT * FROM users WHERE username = 'admin' AND 1=2 
    ​
    解决方案:
    1. 使用参数化查询或预编译语句:确保您的应用程序使用参数化查询或预编译语句来构建和执行SQL查询,而不是直接将用户输入拼接到查询字符串中。这样可以防止恶意代码的注入。 
    2. 输入验证和过滤:对于用户输入的数据,进行严格的验证和过滤,确保只允许合法的字符和格式。可以使用白名单或正则表达式来验证输入。 
    3. 最小权限原则:为应用程序使用数据库的账户分配最小的权限,只授予执行必要操作所需的权限。这样即使发生注入攻击,攻击者也无法执行敏感操作。
    4. 错误处理:在应用程序中,不要直接将数据库错误信息返回给用户,以免提供攻击者有关数据库结构和查询的敏感信息。相反,应该提供自定义的错误消息,不透露过多的细节。
    5. 安全审计和监控:定期对应用程序进行安全审计,检查是否存在潜在的SQL注入漏洞。同时,实施监控措施来检测异常的数据库活动,及时发现和应对潜在的攻击。 
    6. 安全教育和培训:对开发人员进行安全教育和培训,使他们了解SQL注入攻击的原理和预防措施,并采取安全编码实践。 

    时间盲注:应用没有明确的回显,只能使用特定的时间函数来判断

    正常查询: 
    SELECT * FROM products WHERE name LIKE '%输入的关键词%'; 
    攻击者可以尝试以下输入: 
    - 关键词:' OR SLEEP(5) --' 
    这将导致SQL查询变为: 
    SELECT * FROM products WHERE name LIKE '%' OR SLEEP(5) --'%'; 
    如果应用程序对输入进行了不当处理,那么它可能会在执行查询时等待5秒钟,然后返回结果。这表明条件为真。
    然而,如果攻击者尝试以下输入: 
    - 关键词:' OR SLEEP(0) --' 
    这将导致SQL查询变为: 
    SELECT * FROM products WHERE name LIKE '%' OR SLEEP(0) --'%'; 
    如果应用程序对输入进行了不当处理,那么它可能会立即返回结果,而不会等待。这表明条件为假。 
    通过观察应用程序的响应时间,攻击者可以推断出条件是否为真,从而逐步推导出数据库中的敏感信息。
    ​
    解决方案:
    1. 对用户输入进行验证和过滤:确保应用程序对用户输入进行严格的验证和过滤,只允许合法的字符和格式。可以使用白名单或正则表达式来验证输入。 
    2. 使用参数化查询或预编译语句:确保您的应用程序使用参数化查询或预编译语句来构建和执行SQL查询,而不是直接将用户输入拼接到查询字符串中。这样可以防止恶意代码的注入。 
    3. 最小权限原则:为应用程序使用数据库的账户分配最小的权限,只授予执行必要操作所需的权限。这样即使发生注入攻击,攻击者也无法执行敏感操作。 
    4. 使用随机的时间延迟:在应用程序中,可以使用随机的时间延迟来响应查询,从而使攻击者无法通过观察响应时间来推断条件是否为真。 
    5. 安全审计和监控:定期对应用程序进行安全审计,检查是否存在潜在的时间盲注漏洞。同时,实施监控措施来检测异常的数据库活动,及时发现和应对潜在的攻击。 
    6. 安全教育和培训:对开发人员进行安全教育和培训,使他们了解时间盲注攻击的原理和预防措施,并采取安全编码实践。 

  • 报错注入:应用会显示全部或者部分的报错信息

    假设应用程序有一个搜索功能,用户可以在搜索框中输入关键字来查询数据库中的数据。应用程序可能会将用户输入直接拼接到SQL查询语句中,而没有进行验证和过滤。 
     
    例如,应用程序的代码可能如下所示:
    search_term = request.GET.get('search_term')
    query = "SELECT * FROM products WHERE name = '" + search_term + "'"
    results = execute_query(query)
    在这个示例中,应用程序将用户输入直接拼接到查询语句中的 name 字段上。如果用户输入恶意的SQL代码,就可能导致报错注入漏洞。 
     
    例如,用户输入 ' OR 1=1; DROP TABLE products; -- ,那么构建的查询语句将变成:
    sql
    SELECT * FROM products WHERE name = '' OR 1=1; DROP TABLE products; --'
    这个查询语句会导致报错,并可能删除 products 表。 
     
    为了防止报错注入,应该使用参数化查询或预编译语句来构建和执行SQL查询,而不是直接拼接用户输入。下面是一个使用参数化查询的示例:
    search_term = request.GET.get('search_term')
    query = "SELECT * FROM products WHERE name = %s"
    results = execute_query(query, (search_term,))
  • 堆叠注入:有的应用可以加入 ; 后一次执行多条语句

    假设有一个简单的登录表单,用户需要输入用户名和密码来登录系统。系统使用以下代码来验证用户输入的用户名和密码:
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    String query = "SELECT * FROM users WHERE username='" + username + "' AND password='" + password + "'";
    在这个示例中,开发人员使用用户输入的值直接拼接到SQL查询语句中,这就存在堆叠注入的安全风险。攻击者可以利用这个漏洞来执行恶意的SQL代码。 
     
    例如,攻击者可以在用户名输入框中输入以下内容:
    ' OR '1'='1'; DROP TABLE users; --
    这将导致构建的SQL查询语句如下所示:
    sql
    SELECT * FROM users WHERE username='' OR '1'='1'; DROP TABLE users; --' AND password=''
    由于 '1'='1' 始终为真,这个SQL查询将返回所有用户的数据,并且 DROP TABLE users 语句将删除 users 表。攻击者成功地执行了恶意的SQL代码,导致数据丢失和系统崩溃。 
  • 其他

2.XSS(跨站脚本攻击)

2.1 简介

XSS攻击利用了Web应用程序对用户输入的信任,攻击者将恶意脚本注入到Web页面中,当其他用户访问该页面时,恶意脚本会在他们的浏览器中执行。这使得攻击者可以窃取用户的敏感信息、劫持用户会话、篡改页面内容等

2.2 示例及应对

假设有一个留言板的Web应用程序,用户可以在留言板上发布评论。评论会在页面上显示,并且其他用户可以看到。开发人员使用以下代码将用户输入的评论内容显示在页面上:
  html
<div class="comment">
  <?php echo $_POST['comment']; ?>
</div>
  
在这个示例中,开发人员没有对用户输入的评论内容进行任何过滤或转义处理,攻击者可以利用这个漏洞来注入恶意脚本。例如,攻击者可以在评论中输入以下内容:
html
<script>
  alert('恶意脚本已执行!');
  // 偷取用户的敏感信息并发送给攻击者的服务器
</script>
当其他用户访问该页面时,恶意脚本会在他们的浏览器中执行,弹出一个警告框,并可能执行其他恶意操作。攻击者成功地利用了XSS漏洞,对其他用户进行了攻击。 
防御XSS漏洞的常见措施包括对用户输入进行过滤和转义处理、使用内容安全策略(Content Security Policy,CSP)、限制脚本执行等。这些措施可以有效地防止XSS攻击,保护Web应用程序和用户的安全。

3.CSRF(跨站请求伪造)

3.1 简介

CSRF攻击利用了Web应用程序对用户发出的请求没有进行充分验证的情况。攻击者通过诱使用户访问恶意网站或点击恶意链接,来触发用户在已登录的合法网站上执行未经授权的操作。这是因为Web应用程序在处理用户请求时没有对请求的来源进行验证,而是默认信任已经登录的用户。

3.2 示例及应对

假设有一个银行网站,用户在该网站上可以通过以下URL来更改密码: 
https://bank.com/change-password?new-password=123456 
 
在这个示例中,用户在已登录的情况下,访问了一个恶意网站。恶意网站上的攻击者构造了一个图片标签,其中的src属性指向了银行网站的密码修改链接: 
<img src="https://bank.com/change-password?new-password=654321" /> 
 
当用户访问恶意网站时,浏览器会自动加载图片,并向银行网站发送了一个修改密码的请求。由于用户已经在银行网站上登录,所以该请求会被银行网站认为是合法的,并执行密码修改操作。攻击者成功地利用了CSRF漏洞,未经用户授权修改了其密码。 
 
防御CSRF漏洞的常见措施包括使用CSRF令牌(Token)进行验证、检查Referer头部、使用同源策略、使用验证码等。这些措施可以增加Web应用程序对请求来源的验证,从而有效防止CSRF攻击。

4.SSRF(服务器端请求伪造)

4.1 简介

SSRF攻击利用了Web应用程序对服务器端请求的信任,攻击者可以控制服务器发起的请求,包括向内部网络或其他外部系统发送请求。这使得攻击者可以访问和操作不应该对外部公开的资源,如内部接口、数据库、文件系统等。

4.2 示例及应对

假设有一个图片上传的Web应用程序,用户可以上传图片并获取其URL。该应用程序使用以下代码将用户上传的图片显示在页面上:
$url = $_POST['image_url'];
  echo '<img src="' . $url . '"/>';
?>
在这个示例中,攻击者可以利用SSRF漏洞来伪造服务器端的请求。例如,攻击者可以在图片URL中注入以下内容:
http://localhost/admin/delete?file=important_document.txt
当服务器处理该请求时,它会尝试访问本地主机上的 /admin/delete 接口,并删除 important_document.txt 文件。攻击者成功地利用了SSRF漏洞,执行了未经授权的操作。 
防御SSRF漏洞的常见措施包括限制服务器端请求的目标、验证和过滤用户输入、使用白名单来限制允许访问的资源等。这些措施可以有效地防止SSRF攻击,保护Web应用程序和服务器的安全。

5.命令注入

5.1 简介

命令注入漏洞通常出现在需要执行系统命令的应用程序中,攻击者可以通过在用户输入中注入恶意命令来执行任意的系统命令。这使得攻击者可以执行危险的操作,如执行恶意代码、访问敏感信息、篡改文件等。

5.2 示例及应对

假设有一个简单的Web应用程序,允许用户在服务器上执行 ping 命令来测试网络连接。应用程序使用以下代码来执行用户输入的命令:
$ip = $_GET['ip'];
  $result = shell_exec('ping ' . $ip);
  echo $result;
?>
在这个示例中,开发人员没有对用户输入进行任何过滤或验证,攻击者可以利用这个漏洞来执行任意的系统命令。例如,攻击者可以在URL中输入以下内容:
http://example.com/ping.php?ip=; rm -rf /
当服务器处理该请求时,它会执行以下命令:
ping ; rm -rf /
这会导致服务器执行 ping 命令后,继续执行 rm -rf / 命令,删除服务器上的所有文件。攻击者成功地利用了命令注入漏洞,造成了严重的破坏。 
​
防御命令注入漏洞的常见措施包括验证和过滤用户输入、使用参数化查询或预编译语句来执行系统命令、限制应用程序的权限等。这些措施可以有效地防止命令注入攻击,保护应用程序和服务器的安全。

6.目录穿越

6.1 简介

目录穿越漏洞通常出现在需要处理文件路径的应用程序中,攻击者可以利用这个漏洞来绕过应用程序的访问控制,访问他们没有权限访问的文件或目录。这可能导致泄露敏感信息、执行恶意代码、修改文件等危险后果。

6.2 示例及应对

假设有一个简单的文件下载应用程序,用户可以通过提供文件名来下载文件。应用程序使用以下代码来处理文件下载请求:
$filename = $_GET['file'];
  $filepath = '/var/www/files/' . $filename;
  
  if (file_exists($filepath)) {
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="'.basename($filepath).'"');
    readfile($filepath);
  } else {
    echo 'File not found.';
  }
?>
在这个示例中,开发人员没有对用户提供的文件名进行任何验证或过滤,攻击者可以利用目录穿越漏洞来下载任意文件。例如,攻击者可以通过以下URL来下载 /etc/passwd 文件:
http://example.com/download.php?file=../../etc/passwd
当服务器处理该请求时,它会将文件路径设置为 /var/www/files/../../etc/passwd ,导致下载了 /etc/passwd 文件,其中可能包含敏感的用户凭据和系统信息。攻击者成功地利用了目录穿越漏洞,获取了敏感信息。 
防御目录穿越漏洞的常见措施包括验证和过滤用户输入、使用白名单来限制允许访问的文件或目录、对文件路径进行规范化处理等。这些措施可以有效地防止目录穿越攻击,保护应用程序和服务器的安全。

7.文件读取

7.1 简介

文件读取漏洞通常出现在需要加载文件的应用程序中,攻击者可以利用这个漏洞来读取敏感文件、执行恶意代码或绕过访问控制。这可能导致泄露敏感信息、操作系统命令执行、服务器被入侵等危险后果。

7.2 示例及应对

假设有一个简单的Web应用程序,允许用户通过提供文件名来查看文件内容。应用程序使用以下代码来处理文件查看请求:
$filename = $_GET['file'];
  include($filename);
?>
在这个示例中,开发人员没有对用户提供的文件名进行任何验证或过滤,攻击者可以利用文件读取漏洞来读取任意文件。例如,攻击者可以通过以下URL来读取 /etc/passwd 文件的内容:
http://example.com/view.php?file=../../etc/passwd
当服务器处理该请求时,它会将文件路径设置为 ../../etc/passwd ,导致读取了 /etc/passwd 文件的内容,其中可能包含敏感的用户凭据和系统信息。攻击者成功地利用了文件读取漏洞,获取了敏感信息。 
防御文件读取漏洞的常见措施包括验证和过滤用户输入、使用白名单来限制允许访问的文件、对文件路径进行规范化处理、设置适当的文件权限等。这些措施可以有效地防止文件读取漏洞,保护应用程序和服务器的安全。

8.文件上传

8.1 简介

文件上传漏洞通常出现在需要用户上传文件的应用程序中,攻击者可以通过利用应用程序对上传文件的验证不足或绕过,上传恶意文件并在服务器上执行。这可能导致服务器被入侵、用户数据泄露、恶意代码执行等危险后果。

8.2 示例及应对

假设有一个简单的图片上传应用程序,允许用户上传图片文件并显示在网页上。应用程序使用以下代码来处理文件上传:
$target_dir = "uploads/";
  $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
  $uploadOk = 1;
  $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
  
  // 检查文件类型
  if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
  && $imageFileType != "gif" ) {
      echo "只允许上传 JPG, JPEG, PNG 和 GIF 文件.";
      $uploadOk = 0;
  }
  
  // 检查文件大小
  if ($_FILES["fileToUpload"]["size"] > 500000) {
      echo "文件过大.";
      $uploadOk = 0;
  }
  
  // 判断是否上传成功
  if ($uploadOk == 0) {
      echo "文件上传失败.";
  } else {
      if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
          echo "文件上传成功.";
      } else {
          echo "文件上传失败.";
      }
  }
?>
在这个示例中,开发人员对文件类型和大小进行了一些基本的验证。然而,攻击者可以通过修改上传文件的扩展名、伪造文件头或绕过其他验证措施,上传恶意文件。例如,攻击者可以将一个 PHP 文件命名为  evil.jpg  并上传,然后通过以下URL访问该文件执行恶意代码:
http://example.com/uploads/evil.jpg
当服务器处理该请求时,它会执行  evil.jpg  文件中的恶意代码,导致服务器被入侵或执行任意操作。攻击者成功地利用了文件上传漏洞,造成了严重的安全问题。 
 
防御文件上传漏洞的常见措施包括:对上传文件进行严格的验证和过滤、限制上传文件的类型和大小、重命名上传文件、将上传文件存储在非可执行目录、设置适当的文件权限等。这些措施可以有效地防止文件上传漏洞,保护应用程序和服务器的安全。

9.文件包含

9.1 简介

文件包含漏洞通常出现在Web应用程序中,当应用程序使用用户提供的输入(如文件路径或参数)来包含其他文件时,如果没有正确过滤或验证用户输入,攻击者可以构造恶意输入,使应用程序包含并执行恶意文件。这可能导致服务器被入侵、敏感信息泄露、远程代码执行等危险后果。

9.2 示例及应对

假设有一个简单的PHP应用程序,用于加载并显示指定文件的内容。应用程序使用以下代码来加载文件:
$file = $_GET['file'];
  include($file);
?>
在这个示例中,应用程序接受来自用户的 file 参数,并将其作为文件路径直接传递给 include 函数。攻击者可以构造恶意请求,将恶意文件路径传递给 file 参数。例如,攻击者可以通过以下URL访问应用程序:
http://example.com/index.php?file=../../../../../etc/passwd
当应用程序处理该请求时,它会包含 /etc/passwd 文件的内容,导致敏感信息泄露。 
 
另外,攻击者还可以利用文件包含漏洞进行远程代码执行。例如,攻击者可以构造恶意请求,将远程恶意脚本的URL传递给 file 参数,从而使应用程序包含并执行远程恶意脚本。 
 
防御文件包含漏洞的常见措施包括:避免直接将用户输入作为文件路径进行包含,使用白名单验证用户输入,限制文件路径的访问范围,对用户输入进行严格过滤和转义,使用安全的文件包含函数等。这些措施可以有效地防止文件包含漏洞,提高应用程序的安全性。

10.XXE

10.1 简介

XXE漏洞通常出现在使用XML解析器的应用程序中,当应用程序接受用户提供的XML输入并解析时,如果没有正确限制外部实体的解析,攻击者可以构造恶意的实体,从而导致敏感信息泄露、服务器端请求伪造(SSRF)等危险后果。

10.2 示例及应用

假设有一个接受用户提交的XML数据并解析的应用程序。应用程序使用以下代码来解析XML数据:
$xmlData = $_POST['xml'];
  $dom = new DOMDocument();
  $dom->loadXML($xmlData);
?>
在这个示例中,应用程序接受来自用户的 xml 参数,并将其作为XML数据传递给 loadXML 函数进行解析。攻击者可以构造恶意的XML数据,其中包含外部实体的引用。例如,攻击者可以提交以下XML数据:
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE data [
  <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<data>&xxe;</data>
当应用程序处理该请求时,它会解析XML数据并尝试解析外部实体 xxe ,并将 xxe 的内容替换为 file:///etc/passwd 文件的内容,导致敏感信息泄露。 
另外,攻击者还可以利用XXE漏洞进行服务器端请求伪造(SSRF)攻击。例如,攻击者可以构造恶意的XML数据,其中包含外部实体的引用,并将实体的内容设置为目标服务器的内部地址。当应用程序解析该XML数据时,它会尝试访问目标服务器的内部地址,从而实现SSRF攻击。 
防御XXE漏洞的常见措施包括:禁用外部实体解析、使用安全的XML解析器、对用户输入进行严格过滤和转义、限制解析的实体和DTD(文档类型定义)等。这些措施可以有效地防止XXE漏洞,提高应用程序的安全性。

11.模版注入

11.1 简介

模板注入漏洞通常出现在使用模板引擎的应用程序中,当应用程序接受用户提供的输入并将其插入到模板中时,如果没有正确过滤、转义或限制用户输入,攻击者可以注入恶意的模板代码,从而导致代码执行漏洞。

11.2 示例及应对

假设有一个使用模板引擎的应用程序,用于生成HTML页面。应用程序使用以下代码来渲染模板:
from jinja2 import Template
​
def render_template(user_input):
    template = Template(user_input)
    output = template.render()
    return output
在这个示例中,应用程序接受来自用户的 user_input 参数,并将其作为模板代码传递给 Template 函数进行渲染。攻击者可以利用模板注入漏洞注入恶意代码。例如,攻击者可以提交以下模板代码:
  
{{ 7 * 7 }}
  
当应用程序处理该请求时,它会将 user_input 作为模板代码进行渲染,并将 {{ 7 * 7 }} 替换为 49 ,最终渲染出的页面中会显示 49 。这是一个无害的示例,但如果攻击者注入恶意代码,例如执行系统命令或访问敏感信息,就会导致安全漏洞。 
 
另外,模板注入漏洞还可以用于绕过身份验证、访问其他用户的数据或进行服务器端请求伪造(SSRF)等攻击。 
 
防御模板注入漏洞的常见措施包括:对用户输入进行严格过滤和转义、限制模板代码的执行权限、使用安全的模板引擎、更新和修补模板引擎的漏洞等。这些措施可以有效地防止模板注入漏洞,提高应用程序的安全性。

12.Xpath注入

12.1 简介

XPath是一种用于在XML文档中定位节点的查询语言。XPath注入漏洞通常出现在使用XPath查询语言的应用程序中,当应用程序接受用户提供的输入并将其作为XPath表达式执行时,如果没有正确过滤、转义或限制用户输入,攻击者可以注入恶意的XPath表达式,从而导致代码执行漏洞。

12.2 示例及应对

假设有一个使用XPath查询的应用程序,用于从XML文档中获取特定节点的值。应用程序使用以下代码执行XPath查询:
import lxml.etree as ET
​
def get_node_value(user_input):
    xml = "<root>" + user_input + "</root>"
    root = ET.fromstring(xml)
    node = root.xpath("//node")
    return node[0].text
在这个示例中,应用程序接受来自用户的 user_input 参数,并将其作为XPath表达式拼接到XML文档中进行查询。攻击者可以利用XPath注入漏洞注入恶意代码。例如,攻击者可以提交以下输入:
' or 1=1 or ''='
当应用程序处理该请求时,它会将 user_input 拼接到XML文档中的XPath表达式中,并执行查询。由于注入的XPath表达式为 ' or 1=1 or ''=' ,这将导致查询返回所有节点,而不仅仅是特定的节点。攻击者可以利用这个漏洞来绕过访问控制、获取敏感信息或执行其他恶意操作。 
 
防御XPath注入漏洞的常见措施包括:对用户输入进行严格过滤和转义、使用参数化查询或预编译XPath表达式、限制查询的执行范围和权限、使用安全的XPath库等。这些措施可以有效地防止XPath注入漏洞,提高应用程序的安全性。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值