dvwa靶场
brute force
LOW
输入账号密码直接抓包就行
接着ctrl+i传输到intruder模块中
为需要爆破的加上 §,不爆破的不加
选择攻击类型为Cluster bomb,选择username和password的参数作为爆破点;
Cluter bomb是两个字典进行交叉枚举,适用于用户名密码的破解。
payload中选择字典,开始爆破,然后寻找长短不一样的账户,这些多半就是账号密码
MIDDLE
与low差不多
HIGH
输入账号密码开始抓包,发现有个user_token,
token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识。
当用户第一次登录后,服务器生成一个token并将此token返回给客户端,以后客户端只需带上这个token前来请求数据即可,无需再次带上用户名和密码。
简单token的组成;uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token的前几位以哈希算法压缩成的一定长度的十六进制字符串。为防止token泄露)。
选择password和token作为爆破点,同时burp选择pitchfork模式
Pitchfork – 这一模式是使用多个payload组。对于定义的位置可以使用不同的payload组。攻击会同步迭代所有的payload组,把payload放入每个定义的位置中。比如:position中A处有a字典,B处有b字典,则a【1】将会对应b【1】进行attack处理,这种攻击类型非常适合那种不同位置中需要插入不同但相关的输入的情况。请求的数量应该是最小的payload组中的payload数量。
首先在option中
还有,这里要是1才行
payload1:普通字典即可
开始爆破
command injection(命令行注入)
Command Injection,即命令注入,是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的
常用连接符
&&:前一个指令执行成功,后面的指令才继续执行,就像进行与操作一样
||:前一个命令执行失败,后面的才继续执行,类似于或操作
&:直接连接多个命令,同时执行
|:管道符,将前一个命令的输出作为下一个命令的输入
;:直接连接多个命令,不管前面命令执行成功没有,后面的命令继续执行
常用命令:
ls :列出当前文件夹的内容;
sleep 5:观察是否存在时间差来检测是否存在漏洞;
whoami:当前的用户;
cat /etc/shadow:影子文件,存储linux中用户的密码信息
ls -alh /home/:查看用户
ls -alh /home/用户名/ : 查看具体用户的目录
usname -a:查看系统信息
LOW
可以使用127.0.0.1&&ipconfig
直接开始搞
MIDDLE
绕过:
127.0.0.1&ipconfig
会把;改为空格:127.0.0.0&;&ipconfig
第一个执行失败,执行第二个:asdf||ipconfig
HIGH
过滤不严格,使用|绕过
127.0.0.1|ipconfig
CSRF
CSRF 跨站请求伪造介绍
跨站请求伪造 (Cross-Site Request Forgery, CSRF),也被称为 One Click Attack 或者 Session Riding ,通常缩写为CSRF,是一种对网站的恶意利用。通常利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害者不知情的情况下以受害者的身份向服务器发送请求,从而完成非法操作(改密)。CSRF与XSS最大的区别在于,CSRF并没有盗取cookie而是直接利用。
CSRF(low)
进入CSRF,修改密码为123
修改成功,可以看到链接为get请求,其中中包含了我们要修改的密码,当然我们可以更改其中的参数
http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=123&password_conf=123456&Change=Change#
更改新的密码为123456,在浏览器复制以下链接,直接将密码修改成123456
http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#
需要注意的是,必须使用之前登录的浏览器打开链接才能修改成功。所以CSRF攻击的前提是目标网站存在CSRF,而且受害者需要保持目标站点的登录活动状态,还需要点击钓鱼链接。
CSRF攻击的改进:
1、生成短链接
2、将CSRF代码嵌入其他网页
<img src="http://192.168.115.130:89/vulnerabilities/csrf/?password_new=1234&password_conf=1234&Change=Change#" border="0" style="display:none;"/>
<h1>404<h1>
<h2>file not found.<h2>
代码分析:low级别的CSRF源码,利用mysql_real_escape_string()函数对$pass_new和$pass_conf变量进行了过滤,可以防止SQL注入,但无法阻止CSRF攻击。
<?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);
}
?>
CSRF(medium)
代码分析:
medium级别的CSRF源码,在获取$pass_new和$pass_conf两个变量之前,先利用if语句以及eregi()函数来判断"$_SERVER['HTTP_REFERER']"的值是否是主机ip。
stripos()函数查找字符串在另一个字符串中第一次出现的位置(不区分大小写),如何没有找到返回false。
<?php
if( isset( $_GET[ 'Change' ] ) ) {
// Checks to see where the request came from
if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false ) {
// 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>";
}
}
else {
// Didn't come from a trusted source
echo "<pre>That request didn't look correct.</pre>";
}
((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>
小笔记:HTTP头中的Referer字段,记录了该HTTP请求的来源地址
上述过滤规则是http的Referer参数的值中必须包含主机名,可以将攻击页面命名为ip.html(页面被放置在攻击者的服务器里)就可以绕过了
CSRF(high)
high级别的代码增加了Anti-CSRF token机制,用户每次访问改密页面时,服务器会返回一个随机的token,向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端请求。
<?php
if( isset( $_GET[ 'Change' ] ) ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// 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);
}
// Generate Anti-CSRF token
generateSessionToken();
?>
只有获取token才能进行CSRF,但是浏览器的跨域问题,不能直接获取,所以比较难利用。但是如果服务器存在存储XSS可以来获取token, 然后构造url和代码进行CSRF利用。所以high级别的CSRF将会组合存储XSS一起利用。
文件包含
File Inclusion,意思是文件包含(漏洞),是指当服务器开启allow_url_include选项时,就可以通过php的某些特性函数(include(),require()和include_once(),require_once())利用url去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。
文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是因为开启了php配置中的allow_url_fopen选项(选项开启之后,服务器允许包含一个远程的文件)。当被包含的文件在服务器本地时,就形成的本地文件包含漏洞,被包涵的文件在第三方服务是,就形成了远程文件包 含漏洞。
需要敏感
?page=a.php
?home=a.html
?file=content
目录遍历是可以读取web根目录以外的其他目录,根源在于web application的路径访问权限设置不严,针对的是本系统。
文件包含是通过include函数将web根目录以外的目录的文件被包含进来,分为LFI本地文件包含和RFI远程文件包含。
做一下upload靶场就了解了
LOW
利用include,require等,从一个文件读取另外一个文件
MIDDLE
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\"" ), "", $file );
?>
对http://进行过滤,不过可以用hthttp://tp://(双写)方式绕过
HIGH
<?php
// The page we wish to display
$file = $_GET[ 'page' ];
// Input validation
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}
?>
利用file协议绕过防护策略。
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=file:///c:/phpStudy_64/phpstudy_pro/WWW/DVWA/phpinfo.php
文件上传
LOW
直接上传一句话木马就行了,
MIDDLE
上传图片马,然后用burp抓包修改后缀为.php
HIGH
上传一个图片马,不修改后缀,然后使用其他文件,用include方式来引入图片马
验证码
LOW
从代码中可知,只使用了step和changge来判断是不是通过验证,
只需要抓包,然后修改step就行
MIDDLE
Medium级别的代码在第二步验证时,参加了对参数passed_captcha的检查,如果参数值为true,则认为用户已经通过了验证码检查,然而用户依然可以通过伪造参数绕过验证,本质上来说,这与Low级别的验证没有任何区别。
HIGH
<?php
if( isset( $_POST[ 'Change' ] ) ) {
// 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' ],
$_SERVER[ 'REMOTE_ADDR' ],
$_POST[ 'recaptcha_challenge_field' ],
$_POST[ 'recaptcha_response_field' ] );
// Did the CAPTCHA fail?
if( !$resp->is_valid && ( $_POST[ 'recaptcha_response_field' ] != 'hidd3n_valu3' || $_SERVER[ 'HTTP_USER_AGENT' ] != 'reCAPTCHA' ) ) {
// 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 ) {
$pass_new = mysql_real_escape_string( $pass_new );
$pass_new = md5( $pass_new );
// Update database
$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "' LIMIT 1;";
$result = mysql_query( $insert ) or die( '<pre>' . mysql_error() . '</pre>' );
// Feedback for user
echo "<pre>Password Changed.</pre>";
}
else {
// Ops. Password mismatch
$html .= "<pre>Both passwords must match.</pre>";
$hide_form = false;
}
}
mysql_close();
}
// Generate Anti-CSRF token
generateSessionToken();
?>
服务器的验证逻辑是当$ resp(这里是指谷歌返回的验证结果)是false,并且参数recaptcha_response_field不等于hidd3n_valu3(或者http包头的User-Agent参数不等于reCAPTCHA)时,就认为验证码输入错误,反之则认为已经通过了验证码的检查。
搞清楚了验证逻辑,剩下就是伪造绕过了,由于$resp参数我们无法控制,所以重心放在参数recaptcha_response_field、User-Agent上。
weak sessionid
用户访问服务器的时候,一般服务器都会分配一个身份证 session id 给用户,用于标识。用户拿到 session id 后就会保存到 cookies 上,之后只要拿着 cookies 再访问服务器,服务器就知道你是谁了。
但是 session id 过于简单就会容易被人伪造。根本都不需要知道用户的密码就能访问,用户服务器的内容了
LOW
按键点击一次,dvwasession就会+1,不安全
MIDDLE
按照时间获取dvwasession,时间戳转化器
HIGH
使用setcookie()设置cookie,
**setcookie(name,value,expire,path,domain,secure,httponly)**
- 参数 描述
- name 必需。规定cookie的名称。
- value 必需。规定cookie的值。
- expire 可选。规定cookie的有效期。
- path 可选。规定cookie的服务器路径。
- domain 可选。规定cookie的域名。
- secure 可选。规定是否通过安全的HTTPS连接来传输cookie。
- httponly 可选。规定是否Cookie仅可通过HTTP协议访问。
使用MD5来解密dvwasession,站长工具——MD5解密
xss(reflected)
LOW
<script>alert('adfa')</script>
MIDDLE
<script>
被替换为了空格
绕过:
1.大小写绕过:
<ScRipt >alert(/xss/);</ScRipt>
2.双写方式绕过 str_replace()函数
<scr<script>ipt>alert(/xss/);</script>
3.使用非 script 标签的 xss payload
img标签:
<img src=1 onerror=alert('xss')>
<img src="1" onerror=eval("\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29")></img>
iframe标签:
<iframe onload=alert(1)>
<iframe src=javascript:alert('xss');height=0 width=0 /><iframe>
HIGH
preg_replace() 函数用于正则表达式的搜索和替换,这使得双写绕过、大小写混淆绕过(正则表达式中i表示不区分大小写)不再有效。
虽然无法使用<script>标签注入XSS代码,但是可以通过img、body等标签的事件或者iframe等标签的src注入恶意的js代码。输入
<img src=1 onerror=alert(/xss/)>
<body onload=alert('XSS')>
<iframe onload=alert(/xss/)>
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4="></object>
XSS(store)
函数介绍:
isset()函数在php中用来检测变量是否设置,该函数返回的是布尔类型的值,即true/false
trim()函数作用为移除字符串两侧空白字符或其他预定义字符
stripslashes()函数用于删除字符串中的反斜杠
mysq1i_real_escape_string()函数会对字符串中的特殊符号(\x00,\n,\r,\,’,",\x1a)进行转义
在代码中对message,name输入框内容没有进行XSS方面的过滤和检查。且通过query语句插入到数据库中。所以存在存储型XSS漏洞
LOW
前端html中对name有字数长度限制: Burpsuite抓包改为<script>alert(/xss/)</script>:
MIDDLE
strip_tags()函数剥去字符串中的HTML、XML以及PHP的标签,但允许使用标签。
addslashes()函数返回在预定义字符(单引号、双引号、反斜杠、NULL)之前添加反斜杠的字符串。
可以看到,由于对message参数使用了htmlspecialchars函数进行编码,因此无法再通过message参数注入XSS代码,但是对于name参数,只是简单过滤了
使用非 script 标签的 xss payload:< img src=1 οnerrοr=alert(/xss/)>
HIGH
这里使用正则表达式过滤了< script>标签,但是却忽略了img、iframe等其它危险的标签,因此name参数依旧存在存储型XSS。
Burpsuite抓包改name参数为< img src=1 οnerrοr=alert(/xss/)>
dvwa靶场的更多相关文章
- DVWA靶场实战(五)——File Upload
DVWA靶场实战(五) 五.File Upload: 1.漏洞原理: File Upload中文名叫做文件上传,文件上传漏洞是指用户上传了一个可执行脚本文件(php.jsp.xml.cer等文件),而 ...
- DVWA靶场实战(四)——File Inclusion
DVWA靶场实战(四) 四.File Inclusion: 1.漏洞原理: 随着网站的业务的需求,程序开发人员一般希望代码更加灵活,所以将被包含的文件设置为变量,用来进行动态调用,但是正是这种灵活性通 ...
- DVWA靶场实战(三)——CSRF
DVWA靶场实战(三) 三.CSRF: 1.漏洞原理: CSRF(Cross-site request forgery),中文名叫做"跨站请求伪造",也被称作"one c ...
- DVWA靶场实战(二)——Command Injection
DVWA靶场实战(二) 二.Command Injection: 1.漏洞介绍: Command Injection,中文叫做命令注入,是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令 ...
- DVWA靶场实战(一)——Brute Force
DVWA靶场实战(一) 一.Brute Force: 1.漏洞原理: Brute Force是暴力破解的意思,大致原理就是利用穷举法,穷举出所有可能的密码. 2.攻击方法: Burpsuite中的In ...
- DVWA靶场——靶场搭建
DVWA靶场搭建 一.phpstudy环境准备: 第一步:下载PHPstudy: 找到PHPstudy官网,下载windows版小皮面板,然后安装.官网下载地址:https://www.xp.cn/ ...
- DVWA靶场实战(六)——Insecure CAPTCHA
DVWA靶场实战(六) 六.Insecure CAPTCHA: 1.漏洞原理: Insecure CAPTCHA(不安全的验证码),CAPTCHA全程为Completely Automated Pub ...
- DVWA靶场实战(七)——SQL Injection
DVWA靶场实战(七) 七.SQL Injection: 1.漏洞原理: SQL Inject中文叫做SQL注入,是发生在web端的安全漏洞,主要是实现非法操作,例如欺骗服务器执行非法查询,他的危害在 ...
- DVWA靶场实战(九)——Weak Session IDS
DVWA靶场实战(九) 九.Weak Session IDS: 1.漏洞原理: Weak Session IDS也叫做弱会话,当用户登录后,在服务器就会创造一个会话(session),叫做会话控制,接 ...
- DVWA靶场实战(十)——XSS(DOM)
DVWA靶场实战(十) 五.XSS(DOM): 1.漏洞原理: XSS全称为Cross Site Scripting,由于和层叠样式表(Cascading Style Sheets,CSS)重名,所以 ...
随机推荐
- C温故补缺(五):main函数的参数
main()的参数 main()函数的参数,用于在外部执行时传入参数,类似windows的bat脚本或linux的sh脚本.在bat脚本中传入参数,用%接收.sh脚本的参数用$接收. c语言编译成可执 ...
- 写一个frida通杀脚本
1. 前言 过年对我来说和平常没什么区别,该干什么干什么. 之前没接触过 frida 这个工具,前几天用了一些时间学习了一下,相比于 xposed hook 框架,frida 相对于调试方面真的很方便 ...
- 【Java框架】SSM-Spring总结:IOC、DI、AOP、JDBC、事务管理、实际案例
〇.概述 1.常用资料 2.组成 一.控制反转与依赖注入 (一)Spring概述 1.介绍 以IOC和AOP为内核的框架 通过IOC实现控制,使用spring创建对象,与DI描述同一个概念 DI是对象 ...
- 【Java EE】Day09 JavaScript基础
一.JavaScript简介 二.JavaScript语法 三.JavaScript对象
- v-model双向绑定原理
1 <div id="app"> 2 <div>{{msg}}</div> 3 <!-- 写法1 --> 4 <input t ...
- .net core 中 WebApiClientCore的使用
WebApiClient 接口注册与选项 1 配置文件中配置HttpApiOptions选项 配置示例 "IUserApi": { "HttpHost": &q ...
- JDBC的一些基础认识,写的不是特别完善,希望大家看的时候别太介意嘿嘿嘿
JDBC 1,概念和本质 Java DataBase Connectivity Java 数据库链接, Java语言操作数据库 JDBC的本质:是一套操作所有关系型数据库的规则(接口)而JDBC所有的 ...
- Redis 中ZSET数据类型命令使用及对应场景总结
转载请注明出处: 目录 1.zadd添加元素 2.zrem 从有序集合key中删除元素 3.zscore 返回有序集合key中元素member的分值 4.zincrby 为有序集合key中元素增加分值 ...
- [python] 基于matplotlib实现雷达图的绘制
雷达图(也称为蜘蛛图或星形图)是一种可视化视图,用于使用一致的比例尺显示三个或更多维度上的多元数据.并非每个人都是雷达图的忠实拥护者,但我认为雷达图能够以视觉上吸引人的方式比较不同类别各个特征的值.本 ...
- ffmpeg第8篇:使用ffprobe采集文件信息
1. 前言 ffprobe是ffmpeg的其中一个模块,主要用于查看文件信息,咱们知道一个MP4文件其实不仅仅包含了音视频数据,还有如元数据等其它信息,但是实际上咱们关心的往往是音视频数据部分,今天来 ...