23

DVWA渗透测试之旅与代码分析

 4 years ago
source link: https://www.freebuf.com/articles/web/217899.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

前几天小白有幸的为学校的信科的学生进行前期的培训,说实在的这次的培训有点不成功,状况百出,反正整个过程下来也是没有头绪。培训的时候一般都是用dvwa来讲解top10的漏洞,再加上代码分析来亲身体现处漏洞的危害之处。但是小白没有按照这个思路来讲,直接利用靶机来讲远程代码执行漏洞、上传、爆破、SQL注入,看着下面的学生听的有点……。通过这次培训,终于体会到了之前老师讲课的辛苦,讲课除了自己能够明白自己讲的什么,还要让学生怎么很快消化知识点,这个是最主要的一点。还有一点就是不能站在自己的角度来讲,要切合实际站在学生的角度,没有基础的理解,更谈不上后面的学习。所以小白今天就把dvwa再次分享一下自己的思路,代码审查作为辅助,前期我就不演示怎么装dvwa这个靶机了。

DVWA主要包括暴力破解、SQL注入、XSS跨站脚本攻击、文件上传、文件包含、CSRF、命令注入、不安全的验证码。大体的概括了当今环境中常见的漏洞,当然一些代码执行漏洞、溢出漏洞等,大家可以去在靶机上面进行漏洞复现。由于时间原因再加上还需要分析代码,下面先复现加分析三个常见漏洞,包括暴力破解、文件上传、命令注入、文件包含。下面的一系列操作都是在虚拟机中搭建的,仅供大家学习,不可未授权的对网站进行测试,否则造成的一切后果将由测试者自己承担,与本文无关。

暴力破解:

首先我们先看一下暴力破解这一块,我们先不进行暴力破解,先看一下源码:首先说明一下,这个dvwa中的每个漏洞模块都有四种级别,分别为:低、中、高、最高。

rmuqYrj.jpg!web

Lowe级别爆破:

yiUruaQ.jpg!web 通过代码中可以看出,后台登陆对用户名和密码未做任何的过滤或者防爆破的措施,get接收到username和password的值,并带入到数据库进行查询进行判断,如果正确就说明登陆成功,否则失败。可能大家在想这里肯定有注入,但是我们先讲暴力破解。

1、我们使用burpt来抓取登陆信息的包,可以看到用户名和密码都是可以看到并且是明文传输的,后面竟没有跟token,看来可以爆破,即使有token也可以爆破的。

zQNn632.jpg!web

2、一般情况下,我们是不知道用户名和密码的,故这两个参数都要添加标记:

JBb2Izj.jpg!web

3、然后发送到intruder(攻击)模块,这里选择是最后一个模式,因为我们设置的是两个变量,每个定义的位置中有不同的payload组。攻击会迭代每个payload组,每种payload组合都会被测试一遍。如果是一个参数的话我们可以使用第一个模式。

ZjqERjJ.jpg!web

4、设置payload1为用户名,payload2为密码,设置完毕后点击start attack开始爆破按钮: Yb2I7fV.jpg!webINFv2uf.jpg!webfyqIZbb.jpg!web

5、这么多的结果我们如何让筛选爆破出来的用户名和密码,可以根据length长度,因为输入的账号以及密码返回的长度可能不一样,只是针对登陆成功和登陆失败。这样我们就可以找到爆破成功的用户名和密码:

nqU32ae.jpg!web

medium等级爆破:

RjyQ73r.jpg!web 这段代码实际上是对get接收到的User和pass的值进行处理,mysqli_real_escape_string函数是转义字符串中的特殊字符。但是未对爆破做任何限制,这样的情况还是能进行爆破的。在代码的第28行中有一个sleep()函数。意思值得是当用户名或者密码错误的时候,会停留2秒钟的。在爆破的时候也会看到爆破的时间明显慢了许多。

YnEJRbf.jpg!web 直接跳转到爆破的界面,参数的设置和前面的一样:

high级别爆破:

Fz6Fnib.jpg!web 通过代码我们看到出现了登陆前要检查user_token的值,我们在登陆的时候每个用户都需要进行检查user_token的值,这样的防御机制可以防御CSRF,我们先抓取登陆信息包,可以看到有四个参数,包括username、password、Login、user_token,其中user_token的值可以在页面进行抓取,那么我们也可以进行爆破,可能就是爆破的时间的有点慢。

我们用爆破模块Pitchfork(草叉模式),添加爆破的参数password和user_token:

讲密码加入到里面:

进入到option中设置线程数,固定的是1,大于1会报错的:

在Options选项找到Grep-Extract,选择Extract the following items from responses,点击Add:

nqe2maQ.jpg!webauQzmii.jpg!webyieU7zj.jpg!web impossible不可能的级别:

VfQb6bf.jpg!web

ayARFfr.jpg!web 做了一些限制,只要登陆失败三次就会限制15分钟后才能登陆,还运用了PHP 数据对象,这样安全性就提高多了,在代码中限制了多次登陆。

bQJbiq6.jpg!web 命令注入

利用各种调用系统命令的web应用,通过命令拼接、绕过黑名单等方式实现在服务端实现想要实现的系统命令。在代码审计中经常遇见,这个是一个危险函数,如果处理不当的话就会被执行系统名利。

shell_exec — 通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。从代码中的if语句中可以执行ping命令,当我们输入一个ip地址后我们就会执行ping主机的命令,最后会输出到界面。

AJFNj2I.jpg!web medium级别命令注入:

YrIRbem.jpg!web 从代码的第8行设置了一个数组,里面包括两个键值对,&&和;对应的键值都是空格,第14行代码中str_replace函数是字符对换,讲变量中的$target(对应的是用户输入的IP)中的空格字符转换。当我们输入 192.168.106.1 && net user就会报错,这时候代码就会对&&字符进行替换为空格,显然这样的命令是执行不成功的。

qyERJvy.jpg!web 我们了解到了代码中过滤的规则,那我们可以照样进行绕过的  192.168.106.1 &;& net user  —>>  192.168.106.1 && net user,:

MZbmia6.jpg!web high级别命令注入:

yYbU3qm.jpg!web 这个过滤的有点多了哈,从过滤的字符来看就知道之前的绕过的命令肯定不行了。我们看到代码中的|管道符号,说一下这个管道符,将前者处理的结果作为参数传递给后者,但是代码中的|管道符后面加了一个空格,那么,我们可不可以通过|来过滤?这显然是可以的:

IzYZriQ.jpg!web impossible级别命令注入:

7juyayu.jpg!web 这段代码主要是前期对用户输入的参数做了过滤,首先是先进行user_token值的验证,如果是和服务器的值一样那就可以进行下一步,再者利用stripslashes()函数进行将字符串中的\进行删除,explode()函数:使用一个字符串分割另一个字符串,这里是以.为分隔符。加入user_token主要是为了防止CSRF攻击。

uU7Vzyy.jpg!web

文件包含:

是代码注入的一种。其原理就是注入一段用户能控制的脚本或代码,并让服务器端执行,代码注入的典型代表就是文件包含File inclusion。文件包含可能会出现在jsp、php、asp等语言中。如果过滤的不严格,服务利用包含函数进行包含来历不明或者恶意可执行的文件时就会造成极大的危害。本地包含和远程包含在代码审计中这个漏洞也是优先检查的,危险函数主要包括:include、include_once、require、require_once函数。

low级别文件包含:

这串代码未作任何的过滤或者限制,直接就可以进行文件包含:

YBNbY3n.jpg!web6jiiY3y.jpg!web medium级别文件包含:

通过代码中可以看出对于文件的远程包含做了过滤,str_replace()函数做了限制,将http://以及https://、../以及..\做了转换禁止目录转换,只要匹配了这样的字符就会转换为空格,这样就不能利用之前的方法来读取文件了,但是不幸的是只是做了一次过滤,看来还是过滤的不严谨。我们可以使用 http://127.0.0.1/DVWA-master/vulnerabilities/fi/?page=hthttp://tp://192.168.106.129/shell.txt

qquyQrq.jpg!web hight级别文件包含:

YfuQBrz.jpg!web 这个代码做了白名单策略,只有是以file开头的文件才会被包含。既然他们有策略,我们也可以发挥我们的大脑,用file://协议去来绕过限制。

QVz6zqU.jpg!web

文件上传:

文件上传漏洞指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。比如伤处一个小马脚本,服务器如果没做任何限制就会被解析,这样的话就可以获取到服务器的webshell,危害是不可忽视的。文件上传也可以配合解析漏洞、%00截断等进行,有兴趣的可以去看一下常见的文件上传绕过姿势。

low级别上传:

Q7n6NzF.jpg!web 从代码中可以看出对上传的文件未做任何限制,上传的路径是由当前hackable目录中/hackable/uploads/xx,basename()函数是返回路径中的文件名的部分。我们直接上传shell.php,抓取上传路径,发现成功上传到服务器。 http://127.0.0.1/DVWA-master/hackable/uploads/shell.php

36Nz2m6.jpg!webR3ENBzr.jpg!web medium级别上传:

zQbyYzA.jpg!web 显然代码对上传的文件的类型以及大小做了限制,只允许是jpg和png的文件且文件大小小于100000,不到100kb。我们绕过的思路就是,先将shell.php修改为shell.png或者jpeg,抓包后再进行修改后缀,只是进行简单地mime验证,未对上传的内容以及后缀做限制:

hight级别上传:

36zMFr7.jpg!web 先看这段代码,第10行中的strrpos()函数计算指定字符串在目标字符串中最后一次出现的位置,这段代码的含义就是无论你前面的格式写的什么,最后的结果还是只是.jpg,可见我们用前面的绕过方法显然是不行的,测试的php版本是5.6的,所以用%00截断是显然不行的。

ZRvmQ3F.jpg!web 这段代码个人觉得是另一道墙,更能验证了之前的方法都是无用的。除了%00截断,我们还可用图片马,或者是如果测试站点有文件包含漏洞,也可以利用文件包含漏洞。我们用一下图片马的方式:

 copy 1.jpg/b + 1.php/a 2.jpg 

3eeqeea.jpg!web

这样显然不是我们得到的结果,服务器 没有解析这个图片马:

2AZrya6.jpg!web 我们可以利用文件包含漏洞进行解析此图片马:


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK