DVWA 靶场的通关
刚建立和使用
输入
http://dvwa:8898/setup.php //进入
用户名 密码
dvwa
你自己设计的
想要进入数据库
点击creat
用户名 密码
admin
password
Attack type
Sniper模式
在Sniper模式下,Payload字典用于逐个替换请求中标记的位置。例如,如果一个表单需要用户名和密码,Sniper会依次尝试不同的用户名和密码组合,直到找到有效的登录凭证或确定该字段不存在漏洞1。
Battering Ram模式
Battering Ram模式则是在所有标记位置插入相同的Payload。这种模式适用于需要在多个地方输入相同数据的场景,如验证码或会话令牌验证1。
Pitchfork模式
Pitchfork模式通过多个Payload字典组合使用,每个字典针对不同的输入位置。这种方式适用于需要关联输入的场景,例如,用户名列表和对应的密码列表需要一一匹配1。
Cluster Bomb模式
Cluster Bomb模式生成所有可能的组合,适用于完全独立的多参数组合爆破。这种模式可以有效地测试各种复杂的输入组合,帮助发现潜在的漏洞1。
payload
字典是一些预设的参数集合 用于构造和发送攻击请求 这些参数可以是用户名 密码 url参数等 至于这些参数那里来的可以从一些现有的字典获取(github)
token值
- 服务器随机生成的随机字符串 用于验证请求的合法性 每次用户访问页面时 服务器会生成一个新的token (他是有期限的 过期了需重新获得)
登录场景:用户提交用户名和密码时,还需附带服务器返回的Token值。
防御机制
:
- 防止CSRF攻击:攻击者无法伪造包含有效Token的请求。
- 阻断自动化爆破:每次爆破需携带最新Token,而Token需从服务器动态获取,导致传统字典爆破失效。
+++
shell_exec函数
- Php 中的一个内置函数 作用是通过shell环境执行命令
- 它允许PHP代码在服务器的操作层面执行外部命令
+++
Low Mudium High
Brute Force
low
这里直接在登录框中随便输入一些提交 并用bp拦截
在顶部看到了username =
password =
这里直接发送到intruder 中 攻击模式选择cluster bomb
->分别在username =
password =
后面用add 载荷
将你写的东西包住 之后payload set
中 在1 和 2 中分别导入字典 之后直接开始攻击 这里是否攻击成功主要取决于你的字典中东西的组合是否可以匹配到正确的用户名和密码
medium
这里于low的区别在于这里增加了sleep
,也就是用户每一次输入失败都会导致暂停两秒之后才可以登录 所以这只是延长了我们的爆破时间而已 步骤和上述没有什么区别
+++
Command Injection
**原理 **:
命令注入(Command Injection)是一种严重的安全漏洞,通常发生在应用程序未能正确验证、过滤或转义用户输入的情况下。攻击者可以通过构造特殊的命令字符串如
8.8.8.8 && net user
,利用这一漏洞执行外部程序或系统命令,从而达到非法获取数据或控制服务器的目的1。
low
它让我们输入ip 地址 我们输入127.0.0.1 它这里出现了ping 也就是和我们的cmd
有类似的效果 但是我们尝试输入ipoconfig
发现不可以
这是因为ipconfig 不是一个ip地址 所以不给 但是 我们输入127.0.0.1|ipconfig
就可以了
- 这里我们要说一下命令连接符
& :前面一个命令无论是否执行,后面的命令都能执行,两个命令都执行
&&:前面一个命令执行成功后,才能执行后面一个命令,两个命令都执行
|:前面一个命令无论是否执行,后面的命令都能执行且只执行后面一个
||:前面一个命令不能正常执行后,才能执行后面一个命令
medium
代码审计
<?php
if( isset( $_POST[ 'Submit' ] ) ) { //检查是否通过Post提交submit
// Get input
$target = $_REQUEST[ 'ip' ]; //用request 超全局变量将ip地址交给target
// Set blacklist
$substitutions = array( //建立黑名单过滤
'&&' => '',
';' => '',
);
// Remove any of the characters in the array (blacklist).
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target ); //这里直接将用户输入的内容拼接到ping 后面
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
// Feedback for the end user
$html .= "<pre>{$cmd}</pre>"; //这是html中的一个标签 全程为preformation 叫预格式化处理 使文本按照原始输入的格式在网页显示
}
?>
这里发现黑名单禁止了&&
但是没有禁止|
或者 ||
所以还是可以执行的
原理:利用未被过滤的符号拼接额外的命令 后端直接拼接用户输入到系统命令中
+++
CSRF跨站请求伪造
原理:
-
它利用的使网站对用户浏览器的信任 攻击者通过伪造用户端的浏览器请求 向访问一个用户曾经访问过的网站发送出去恶意命令 使目标网站接收并误认为是用户的真实操作而执行命令
-
如A为存在CSRF漏洞的网站 B为攻击者恶意搭建的网站 C为A网站的合法用户 用户A登录A网站之后 网站A就产生了cookie 并且返回到浏览器 这时用户A要是没有推出网站 并在同一浏览器中访问网站B 浏览器接受到恶意代码之后根据网站B的请求在用户不知情的情况下向A发出请求 这时候网站A并不知道这个请求是B发起的 所以就以C的权限出路请求 造成了 恶意代码被执行
low
这里显示要修改密码 我们先输入两个一致的密码在之后提交 发现Password changed 我们发现url框中出现了疑似我们更改密码的
password_new=1234&password_conf=1234&Change=Change#
//这里new 是指我们第一次输入的密码 conf 是第二次输入的密码
那么我们考虑输入两次不一样的密码
之后提交 发现提交失败 但是我们尝试在url
中将conf=
后面的密码修改并提交 发现提交成功了!
漏洞 在于我们可以不通过它给的修改密码的地方而直接在url中修改 意味着我们可以通过控制url 传参在网站之外执行更改密码的操作
源码分析
<?php
if( isset( $_GET[ 'Change' ] ) ) {
// Get input
$pass_new = $_GET[ 'password_new' ]; //通过get传参获得两个变量的值
$pass_conf = $_GET[ 'password_conf' ];
// Do the passwords match?
if( $pass_new == $pass_conf ) {
// They do! //从数据库中查询
$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$pass_new = md5( $pass_new );
// Update the database
$current_user = dvwaCurrentUser(); //修改密码
$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . $current_user . "';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
// Feedback for the user //返回
$html .= "<pre>Password Changed.</pre>";
}
else {
// Issue with passwords matching
$html .= "<pre>Passwords did not match.</pre>";
}
((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>
Medium
源码分析
if (stripos($_SERVER['HTTP_REFERER'], $_SERVER['SERVER_NAME']) !== false) {
// 通过验证,允许请求
} else {
// 拒绝请求(可能是CSRF攻击)
}
//这里通过$_SERVER['HTTP_REFERER']检查http refer 头是否包含当前的服务器域名 是一种常见的CSRF防御手段
漏洞在于我们可以直接通过bp
增加或者修改refer 头啊
这里我们先输入new 和 conf 一致的密码 之后change 并用bp 拦截 , 发现里面有Refer 字段
我们再输入new 和 conf不一样的密码 之后提交显示did’t match 之后在url框中继续回车 然后bp拦截 发现里面没有Refer
字段 我们手动加入如(这里面是我们想要修改的密码)
Referer:dvwa:8898/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#
之后forword 发现change 成功!!
High
这里我们用bp拦截 发现里面的第一行Get那里面有token
那么我们在拦截之后在上两关的基础上在Referer
后面加上&user_token=c018e2889915ff0d2f1b754685469fba#
(get那里获得的token) 就change 成功了!
+++
File Inclusion 文件包含
原理
-
是指当服务器开启特定配置选项时 攻击者可以通过用户输入来包含并执行服务器上的任意文件 分为
本地文件包含lfi
和远程文件包含rfi
-
LFI(Local File Inclusion)
- 定义:使用文件包含函数包含执行本地(Web应用所在主机)文件。
- 危害:可以查看系统任意文件内容,如果具备一些条件,也可以执行命令1。
RFI(Remote File Inclusion)
- 定义:当服务器开启
allow_url_include
选项时,可以通过 PHP 的某些特性函数(如include()
,require()
)利用 URL 去动态包含远程文件。 - 危害:可以直接执行任意命令
low
+++
快马加鞭更新ing …