学习网站:https://xss-game.appspot.com/level1

XSS攻击

XSS(Cross Site Scripting)跨站脚本攻击,是一种代码注入攻击。攻击者在目标网站植入恶意脚本,当用户访问目标网站时,恶意脚本会被执行,从而达到攻击目的。

假设有一个简单的网页,用于用户输入评论,然后显示在页面上。如果用户输入的内容没有经过过滤,那么用户可以输入一段恶意脚本,比如:

<!DOCTYPE html>
<html>
<head>
<title>评论页面</title>
</head>
<body>
<h2>留言板</h2>
<form action="post_comment.php" method="POST">
<textarea name="comment" rows="4" cols="50"></textarea><br>
<input type="submit" value="提交评论">
</form>
</body>
</html>

后端代码没有进行恰当的输入过滤和输出转义,导致用户输入的恶意脚本被执行。

<!DOCTYPE html>
<html>
<head>
<title>评论结果</title>
</head>
<body>
<h2>评论结果</h2>
<p>您的评论是:<?php echo $_POST['comment']; ?></p>
</body>
</html>

当用户输入如下内容时,就会弹出一个对话框:

<script>alert()</script>

如果尝试在<script>标签中输入恶意代码失败了,那么可以尝试使用带有JavaScript属性的HTML元素来执行XSS攻击。

<img src="invalid" onerror="alert()">
'<img src="invalid" onerror="alert()">'
0'); alert('XSS'); //

XSS攻击的解决措施

  • 输入验证和过滤:对用户输入的内容进行验证和过滤,确保用户输入的内容符合预期。
  • 输出转义:对用户输入的内容进行转义,确保用户输入的内容不会被当做HTML代码执行。
  • HTTP头部设置:设置HTTP头部的Content-Security-Policy字段,限制页面加载的资源。
  • Cookie设置:设置Cookie的HttpOnly属性,防止JavaScript读取Cookie。

CSRF攻击

CSRF(Cross Site Request Forgery)跨站请求伪造,是一种利用用户已登录的身份,以用户不知情的情况下,完成非法操作的攻击方式。

  • CSRF 攻击有一个前提条件,是用户具有某个正常访问的访问权限。一般网站的访问断线都具备一定的有效期,比如1天过期,或者几个小时过气,再次期间权限信息会保留在用户浏览器的cookie中,这本例子中假设用户C刚刚登录了网站A,全新还没有过期。
  • 攻击者利用正常网站A的CSFR漏洞,构造页面一个恶意网页B,在页面中包含对发往正常网站A的请求,在用户C加载页面B(或者点击某些元素时触发)时,会触发攻击请求,完成攻击。
  • 由于加载恶意页面B和触发攻击请求都是在用户浏览器端完成的,因为之前用户登录过正常网站,发往正常网站的请求会带有用户授权信息(在cookie中),在授权信息没有过期的情况达到攻击目的。

CSRF攻击的解决措施

  • 验证来源站点:在服务器端验证请求的来源站点,只允许来自合法站点的请求。
  • 验证请求内容:在请求中添加验证信息,确保请求是用户自己发起的。
  • 防止重复提交:使用Token验证,确保请求只能被执行一次。

SQL注入

SQL注入是一种利用Web应用程序中的漏洞,通过在用户提交的数据中插入恶意的SQL语句,从而实现非法操作的攻击方式。

例如:登陆查询的SQL语句

SELECT * FROM users WHERE username = "$username" AND password = "$password";

如果用户输入的$username$password没有经过过滤,那么用户可以输入一段恶意的SQL语句,比如:

SELECT * FROM users WHERE username = "archer2017" AND password = "anywords" OR 1=1;

这样就会返回所有用户的信息,因为OR 1=1永远为真。

SQL注入的解决措施

  • 输入验证和过滤:对用户输入的内容进行验证和过滤,确保用户输入的内容符合预期。
  • 如果不可避免地使用SQL语句进行拼装,可以对用户输入数据进行转义,确保用户输入的内容不会被当做SQL语句执行。

上传文件漏洞

上传文件漏洞也是一种常见的web漏洞,攻击者可以用利用服务器端的上传文件漏洞绕过安全验证将代码提交到服务器端,并想办法让代码文件被执行。一单可执行的代码上传成功,会造成比较严重的安全问题,比如获取服务器权限,为攻击者开后门,或者让服务器超载,破快服务器的可用性,甚至是上传病毒,木马。

上传文件漏洞的解决措施

  • 限制上传文件类型:限制上传文件的类型,确保只能上传安全的文件。
  • 将上传文件和应用程序分开存储
  • 对上传的图片进行重绘
  • 对上传文件重命名,最好具有一定的随机性,提高攻击成本

DDOS攻击

DDOS(Distributed Denial of Service)分布式拒绝服务攻击,是一种通过大量合法请求,占用服务器资源,导致服务器无法正常提供服务的攻击方式。

在了解 DDoS 之前,我们需要先知道什么是 DoS。最基本的 DoS 就是利用合理的客户端请求里占用过多的服务器资源,从而使合法用户无法得到服务器的响应。DDoS 攻击便是在传统的 DoS 攻击的基础上产生的一类攻击方式。传统的 DoS攻击一般是一对一的方式,当攻击目标的CPU速度、内存或者网络带宽等各项性能指标不高的情况下,它的效果是明显的,但随着计算机与网络技术的发展,计算机的处理能力显著增加,内存不断增大,这便使得 DoS 攻击逐渐失去了效果。

DDOS分类

SYN Flood

SYN Flood就是利用了 TCP 协议三次握手的过程来达到攻击的目的。攻击者伪造大量的 IP 地址给服务器发送 SYN 报文,因为伪造的 IP 地址不可能存在,也就不可能从客户端得到任何响应,就会一直卡在第三步,服务端就得维护一个非常大的半连接等待列表,并且不断对这个列表中的 IP 地址进行遍历重试,占用了大量的系统资源。而由于服务器资源有限,恶意的连接占满了服务器的等待队列,导致服务器不再接收新的 SYN 请求,使正常的用户无法完成通信。

DNS Query Flood

DNS Query Flood 攻击采用的方法是向被攻击的服务器发送海量的域名解析请求。而这部分请求解析的域名一般都是随机生成的,大部分不存在,并且通过伪造端口和客户端IP,防止查询请求被 ACL(访问控制列表)过滤。被攻击的 DNS服务器 在收到域名解析的请求后,首先会在自己的服务器上查找是否该域名的 IP,因为域名的不存在,在自身自然是找不到的,因此DNS 服务器便会向上层的 DNS服务器递归查询域名,直到全球互联网的 13台 根DNS服务器。大量不存在的域名解析请求给服务器带来了很大的负载,当解析请求超过一定量级的时候,就会造成 DNS服务器 解析域名超时,使正常的域名都查询不到对应的 IP,达到了攻击的效果。

HTTP/CC Flood

CC攻击的原理是通过控制大量的 “肉鸡” 或者利用从互联网上搜寻的大量匿名的 HTTP 代理,模拟正常用户给网站发起请求直到该网站拒绝服务为止。大部分网站会通过 CDN 以及分布式缓存来加快服务端的响应,提高网站的吞吐量。而这些恶意的 HTTP 请求会有意的避开这些缓存,需要进行多次 DB 查询操作或者一次请求会返回大量的数据,加速系统资源的消耗,从而拖垮后端的业务处理系统。