Web安全-攻击篇 | 青训营笔记
这是我参与「第四届青训营 」笔记创作活动的的第5天
XSS攻击
XSS攻击全称跨站脚本攻击,是一种在Web应用中的计算机安全漏洞,它允许恶意Web用户将代码植入到提供给其他用户使用的页面中。
特点: 通常难以从UI上感知(暗地执行脚本)、窃取用户信息(cookie/token)、绘制UI(例如弹窗),诱骗用户点击/填写表单
常见XSS攻击有: Stored XSS、Reflected XSS、DOM-based XSS
Stored XSS
此种XSS攻击主要将代码提交存储在服务器端(数据库,内存,文件系统等),当目标用户访问该页面获取数据时,XSS代码会从服务器解析之后加载出来,返回到浏览器做正常的HTML和JS解析执行,XSS攻击就发生了。
//前端:2.html
<html>
<head lang="en">
<meta charset="UTF-8">
<title>存储型XSS</title>
</head>
<body>
<form action="action2.php" method="post">
输入你的ID: <input type="text" name="id" /> <br/>
输入你的Name:<input type="text" name="name" /> <br/>
<input type="submit" value="提交">
</form>
</body>
</html>
//后端:action2.php
<?php
$id=$_POST["id"];
$name=$_POST["name"];
mysql_connect("localhost","root","root");
mysql_select_db("test");
$sql="insert into xss value ($id,'$name')";
$result=mysql_query($sql);
?>
//供其他用户访问页面:show2.php
<?php
mysql_connect("localhost","root","root");
mysql_select_db("test");
$sql="select * from xss where id=1";
$result=mysql_query($sql);
while($row=mysql_fetch_array($result)){
echo $row['name'];
}
?>
例如:当前端input框提交内容为<script>alert(111)</script>时,数据交给后端处理,后端存储在数据库中,当其他用户访问另一个页面时,后端调出该数据,显示给另一个用户,XSS代码就执行了,页面中就会直接弹出一个警示框,内容为111,这种漏洞数据流向是:前端 --> 后端 --> 数据库 --> 后端 --> 前端
Reflected XSS
此种XSS攻击一般是攻击者通过特定手法,诱导用户去访问一个包含恶意代码的URL,当受害者点击这些专门设计的链接的时候,恶意代码就会直接在受害者主机上的浏览器执行。
//前端 1.html:
<html>
<head lang="en">
<meta charset="UTF-8">
<title>反射型XSS</title>
</head>
<body>
<form action="action.php" method="post">
<input type="text" name="name" />
<input type="submit" value="提交">
</form>
</body>
</html>
//后端 action.php:
<?php
$name=$_POST["name"];
echo $name;
?>
例如:当前端input框提交内容为<script>alert(111)</script>时,数据交给后台处理,页面中就会直接弹出一个警示框,内容为111,这就是最基本的Reflected XSS漏洞,这种漏洞数据流向是:前端 --> 后端 --> 前端
DOM-based XSS
此种XSS攻击是指通过恶意脚本修改页面的DOM结构,是纯粹发生在客户端的攻击。属于前端JavaScript自身的安全漏洞。
// 前端3.html
<html>
<head lang="en">
<meta charset="UTF-8">
<title>DOM型XSS</title>
</head>
<body>
<form action="action3.php" method="post">
<input type="text" name="name" />
<input type="submit" value="提交">
</form>
</body>
</html>
// 后端action3.php
<?php
$name=$_POST["name"];
?>
<input id="text" type="text" value="<?php echo $name; ?>"/>
<div id="print"></div>
<script type="text/javascript">
var text=document.getElementById("text");
var print=document.getElementById("print");
print.innerHTML=text.value; // 获取 text的值,并且输出在print内。这里是导致xss的主要原因。
</script>
例如:当前端input框提交内容为<img src=1 onerror=alert(111)>时,数据交给后台处理,页面中就会直接弹出一个警示框,内容为111,这种漏洞数据流向是:前端 --> 浏览器
CSRF攻击
也称跨站请求伪造,与XSS攻击不同,CSRF通过伪装来自受信任用户的请求来攻击受信任的网站。简单理解就是攻击者首先盗用了你的身份,然后以你的名义进行某些非法操作,例如使用你的账户发送邮件,获取你的敏感信息,甚至盗走你的账户购买商品等等。
CSRF攻击过程
- 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A
- 在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A
- 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B
- 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A
- 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。
从上面的流程可以看出,想要达成CSRF攻击,必须达到两个基本条件:
- 登录受信任站点A,并在本地生成Cookie。
- 在不登出A的情况下,访问危急站点B。
常见的CSRF攻击类型
- GET类型
银行站点A:它以GET请求来完毕银行转账的操作,如:http://www.mybank.com/Transfer.php?toBankId=11&money=1000
危急站点B:它里面有一段HTML的代码例如以下:
<img src=http://www.mybank.com/Transfer.php?toBankId=11&money=1000>
首先,你登录了银行站点A,然后訪问危急站点B,这时你会发现你的银行账户少了1000块。为什么会这样呢?原因是银行站点A违反了HTTP规范,使用GET请求更新资源。在访问危急站点B的之前,你已经登录了银行站点A,而B中的 一个合法的请求,但这里被不法分子利用了)。所以你的浏览器会带上你的银行站点A的Cookie发出Get请求,去获取资源以GET的方式请求第三方资源(这里的第三方就是指银行站点了,原本这是http://www.mybank.com/Transfer.php?toBankId=11&money=1000,结果银行站点服务器收到请求后,觉得这是一个更新资源操作(转账操作),所以就立马进行转账操作。 \
- POST类型
这种类型的CSRF危害没有GET型的大,利用起来通常使用的是一个自动提交的表单
<form action=http://wooyun.org/csrf.php method=POST>
<input type="text" name="xx" value="11" />
</form>
<script> document.forms[0].submit(); </script>
访问该页面后,表单会自动提交,相当于模拟用户完成了一次POST操作。
SQL Injection攻击
SQL Injection就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的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);
}
// 读取请求字段
// 直接以字符串的形式拼接SQL语句
fetch("/api", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
username: "any; DROP TABLE table;",
})
})
// SELECT xxx FROM xxx; DROP TABLE table;
SSRF攻击
服务器请求伪造,攻击者在未能获取服务器所有权限时,利用服务器漏洞以服务器的身份发送一条构造好的请求给服务器所在内网。SSRF通常针对外部网络无法访问的内部系统。
SSRF主要攻击方式
攻击者想要访问主机B上的服务,但是由于存在防火墙或者主机B是属于内网主机等原因导致攻击者无法直接访问主机B。而服务器A存在SSRF漏洞,这时攻击者可以借助服务器A来发起SSRF攻击,通过服务器A向主机B发起请求,从而获取主机B的一些信息。
Dos攻击
拒绝服务攻击,其目的是使计算机或网络无法提供正常的服务
常见Dos攻击
- 带宽攻击:以极大的通信量冲击网络,使得所有可用网络资源都被消耗殆尽,最后导致合法的用户请求无法通过。
- 连通性攻击:指用大量的连接请求冲击计算机,使得所有可用的操作系统资源都被消耗殆尽,最终计算机无法再处理合法用户的请求。
- D网络:基于巨量的Flood耗尽目标网络带宽资源
- 攻击协议漏洞发起的拒绝服务攻击
DDos攻击
分布式拒绝服务,即利用大量合法的分布式服务器对目标发送请求,从而导致正常合法用户无法获得服务。
DDos攻击特点
第一:造成网络瘫痪
通过控制大量攻击主机同时连接网站端口,制造大流量无用数据,造成通往被攻击主机的网络拥塞,使被攻击主机无法正常和外界通信。
第二:肉鸡攻击
肉鸡也称傀儡机,是指可以被黑客远程控制的机器,肉鸡通常被用作DDoS攻击,通过肉鸡发起的攻击请求占用服务器各项资源。
第三:网络层攻击
通过发送伪造源IP的TCP数据包发送SYN或ACK包、发送包含错误设置的地址值等攻击方式,耗尽服务器资源,导致服务器拒绝访问。
第四:CC攻击
黑客借助代理服务器生成指向受害主机的合法网页请求,实现DDoS和伪装就叫CC(Challenge Collapsar)。肉鸡CC攻击是黑客使用CC攻击软件,控制大量肉鸡发动攻击,模拟正常用户访问网站的请求,伪造成合法数据包。