网络安全编程:DVWA实例

  • A+
所属分类:安全文章

网络安全编程:DVWA实例

文章来 计算机与网络安全 

本文对DVWA进行简单的演示,在这里将安全级别选择为“low”(低),且没有开启PHPIDS。

1. Brute Force模块练习

Brute Force 是暴力破解的意思,是指黑客利用穷举工具并配合合理的密码字典,来猜解用户的密码。这里主要介绍Burp Suite工具,与DVWA的Brute Force模块。在DVWA中打开Brute Force模块,如图1所示。
网络安全编程:DVWA实例
图1  Brute Force模块

在图1中可以看到有两个用来接受“Username”和“Password”的输入控件,还有一个“Login”按钮。该模块是用来测试暴力破解的,那么如何才能够进行暴力破解呢?难道一个渗透平台也需要自行编程来完成任务吗?那样对于没有编程基础的Web安全初学者就要求太高了,而且在很多实际的情况下,通常是使用现有的工具来进行检测。这里选用一款Web安全检测及攻击的套件来完成暴力破解的任务,该检测套件就是著名的Burp Suite。

Burp Suite是一款集合了Web安全检测及攻击的套件,它像是一款瑞士军刀一样,每一项功能都可以独立完成特定的功能,而且各个功能还能配合进行使用,从而发挥更强大的作用。Burp Suite界面如图2所示。
网络安全编程:DVWA实例
图2  Burp Suite界面

下面直接演示如何使用Burp Suite来测试DVWA中Brute Force的模块。

在Burp中选择“Proxy”页签,即代理页签,在该页签下选择“Options”子页签,来设置一个监听的IP地址和端口号。Burp的代理功能是专门用于拦截HTTP和HTTPS数据用的,它存在于浏览器和目标应用之间,它可以将拦截到的HTTP/HTTPS数据进行修改后再次发送,它是整个Burp套件的核心部分。在设置好代理地址之后,切换到“Proxy”页签下的“Intercept”子页签,并将“Intercept is on”按钮激活,即启动代理拦截功能,开始拦截HTTP/HTTPS的数据。虽然Burp的代理拦截功能设置好了,但是工作只是完成了一半,剩下一半需要设置浏览器的代理,通过设置浏览器的代理地址为Burp监听的地址和端口从而将请求的HTTP/HTTPS数据发送给了Burp,这样Burp就相当于在Web应用与浏览器之间了。如图3所示。
网络安全编程:DVWA实例
图3  Burp设置

准备工作已经完成了,接下来在DVWA的Brute Force模块的“Username”框和“Password”框输入账号“admin”和任意一个密码,单击“Login”来进行登录。这时Burp就会拦截住浏览器提交的HTTP请求,如图4所示。
网络安全编程:DVWA实例
图4  Burp拦截的HTTP请求

在HTTP的数据上单击右键,在弹出的菜单上选择“Send to Intruder”,然后切换到“Intruder”页签下的“Positions”子页签中,如图5所示。注意观察其中的数据,有很多值都在两个“$”符号之间,需要将这些“$”符号清除,单击“Clear$”即可将所有的“$”清除,然后选中第一行中间的“password=12345”的“12345”,这是刚才在“Password”框中输入的密码,选中它以后单击“Add$”按钮,将选中的“12345”变成“$12345$”,这样密码部分就成为了“变量”,在进行暴力破解的时候,字典会不断地对它进行替换。
网络安全编程:DVWA实例
图5  Burp的Intruder页签

接着选择“Positions”子页签右侧的“Payloads”子页签,如图6所示。
网络安全编程:DVWA实例
图6  Intruder页签下的Payloads子页签

单击图6中的“Add from list”下拉框,在下拉框中选择“Passwords”,然后在下拉框上面的列表中会出现很多常用的密码,然后在该子页签的右上角单击“Start attack”按钮进行暴力破解。这时会在“Intruder attack”窗口中使用密码字典来逐个替换刚才的“变量”来尝试暴力破解,但是从列表中没有给出破解成功的提示,怎么能够知道哪条才是真正破解成功的密码呢?其实这就体现出了Burp的强大了,因为它是一个通用的工具,在保证通用的前提下,失去一些具体的提示并不为过,那么如何判断哪个是暴力破解成功的记录呢?其实很简单,只要看一下“Length”列即可。因为破解成功返回的数据的长度肯定和其他数据的长度不一致,这样就可以判断出哪条是破解成功的密码了,如图7所示。
网络安全编程:DVWA实例
图7  Intruder attack列表

为了能够快速地找到密码,可以通过单击“Length”列来进行排序,从图7中可以看出,爆破成功的密码是第2590行的记录,密码是“password”。

通过上面的测试得出“admin”用户的密码是“password”,可以通过输入这组账号和密码进行测试,再输入错误的账号和密码进行测试就会发现,返回的结果是不相同的,这就说明可以通过判断返回包的长度来判断众多测试中哪条才是正确的。

在图7的最上面一条记录,即测试成功的记录上单击右键,在弹出的菜单中选择“Generate CSRF PoC”会打开一个新的窗口,在窗口的下半部分会有一段HTML代码,代码如下:
<html> <!-- CSRF PoC - generated by Burp Suite Professional --> <body> <form action="http://localhost/dvwa-1.9/vulnerabilities/brute/"> <input type="hidden" name="username" value="admin" /> <input type="hidden" name="password" value="password" /> <input type="hidden" name="Login" value="Login" /> <input type="submit" value="Submit request" /> </form> </body></html>
将该段代码保存成扩展名为“html”的文件,然后直接双击即可显示出登录成功后的提示。

2. File Upload模块

文件上传是很多网站都有的,比如社交网站的上传头像,上传照片,比如资源网站可以上传一个共享软件,上传压缩包等。那么在这种情况下,如果网站对于上传过滤不严格的话,就可以上传木马或恶意程序,这对于服务器危害是非常大的。这里仍然用Burp Suite来演示DVWA中的File Upload模块(设置为Medium级别,因为Low级别可以直接上传)是如何被上传一个木马的。

单击“File Upload”打开上传模块的部分,看到一个可以选择上传文件的文件框和上传文件的提交按钮,选择一个正常的图片文件上传,会提示上传成功,并返回一个上传的地址,地址为“../../hackable/uploads/test.jpg”,用该返回的地址直接贴到当前URL后面就会打开图片,打开后的URL地址为“http://localhost/dvwa/hackable/uploads/test.jpg”。然后选择一个PHP的木马文件上传,会提示不是JPEG或PNG的文件,如图8所示。
网络安全编程:DVWA实例
图8  cmd.php上传失败

打开Burp启动拦截,然后设置浏览器的代理,然后再次上传PHP木马查看Burp中截取到的HTTP数据,如图9所示。
网络安全编程:DVWA实例
图9  Burp对木马上传的抓包

在图9中的“Content-Type”中可以看出,这里提交的类型并不是图片的类型。那么将如何修改呢?将本地木马的扩展名修改为“png”或“jpg”的格式,然后再次提交,如图10所示。
网络安全编程:DVWA实例
图10  Burp对修改扩展名的木马上传抓包

从图10中可以看到“Content-Type”的类型已经改变了,但是注意在“filename”处文件名是“cmd.jpg”,这样上传后文件就是一个jpg的文件,那么在这里修改jpg的扩展名为php,然后单击“Forward”让Burp将数据包提交到Web服务器。返回DVWA中可以看到cmd.php的木马文件已经上传成功了,打开地址“http://localhost/dvwa/hackable/uploads/cmd.php”,可以正常打开上传的木马文件。

之前写过一个通过发包来进行暴力破解的程序,在程序中每次发包时会修正包的长度,而Burp Suite会自动修正包的长度,这一个小的功能就非常“贴心”。从第二个实例中可以体会到Burp Suite存在于浏览器和服务器的中间,可以对浏览器提交的数据包进行截取、修改、发送,因此善于利用Burp Suite的这个功能可以很好地绕过很多Web前端页面的数据校验,也可以通过修改数据包达到欺骗后台的效果,类似于上面的例子,提交的类型是图片类型,但是实际上却是一个PHP的文件。

3. SQL Injection模块

SQL Injection是用来练习SQL注入攻击的模块,SQL注入也是常见的Web攻击方式。SQL是结构化查询语言,是一种针对数据库设计的查询语言,可以完成对数据库的增、删、改、查等操作,最主要的还是进行各种各样的查询,而且可以通过简单的语句构造出来复杂的查询。SQL注入就是通过构造SQL语句从而进行攻击的一种技术。

在使用SQL Injection模块进行练习之前,简单描述什么是SQL注入。在可以交互的Web系统中,通常都会有用来进行输入的输入框,比如输入用户名和密码的输入框,填写注册信息的输入框等都可以向Web系统提交信息。在正常情况下用户会按照提示进行相应的输入,但是不怀好意的人会有意地输入其他有特殊意义的符号,由于特殊符号的作用,就会导致意想不到的情况(不怀好意的人不一定是攻击者,比如注册的时候随便填写可能导致Web页面不正常显示之类,现在这样的系统比以前大大减少,但并不是说已经不存在了)。对于恶意攻击者而言,则会有意地使用SQL语法的关键字或符号来构造一些输入,使得构造的输入在数据库中被执行,从而获得更有价值的信息。

经过上面简单的介绍,大家可能对SQL注入已经有个简单的了解了,现在来看一下DVWA系统中的SQL Injection模块(级别为Low),如图11所示。
网络安全编程:DVWA实例
图11  DVWA的SQL Injection模块

图11中有一个输入框,从该输入框中就要完成SQL注入的联系。随便输入一个“1”(实际输入没有引号),会返回ID为1的“First name”和“Surname”,接着输入一个“2”,同样会返回ID为2的“First name”和“Surname”。那么再输入一个“a”,就什么都没有返回。输入“1”和“2”有返回结果,而输入“a”没有返回结果,那是因为数据库中并没有ID为“a”的记录,而数据库中存在ID为“1”和“2”的记录,那这能说明什么问题呢?说明有没有该ID对应的数据,是需要在数据库中进行查询的,那么是怎么查询的呢?可能是这样的两种查询语句,第一种查询语句如下:
Select firstname, surname from 表名 where id = '1'
第二种查询语句如下:
Select firstname, surname from 表名 where id = 1
这两种语句的写法如果对于没有SQL语言基础的朋友又不仔细看的情况下可能没有看出差别,第一句和第二句的差别在于第一句的1是被单引号引住的,第二句则直接是1。它们的差别是第一句查的ID是一个字符串类型的,第二句查的ID是一个数值型的。至于是数值型还是字符串型的,对注入攻击有什么差别呢?是有的。因为那个ID的值是输入的,那里是一个变量,实际写程序时可能是进行拼接的,看一下上面的字符串是如何拼接的。

第一种拼接方法:
$sql = "select firstname, surname from 表名 where id = '" . $id . "'";
第二种拼接方法:
$sql = "select firstname, surname from 表名 where id = " . $id;
可以看到,在第一种使用字符串拼接的时候,$id的前后会有引号的存在,而在第二种字符串拼接的时候,$id的前后是没有使用引号的。

在各种语言中都有逻辑运算符,当然在SQL语句中也有,SQL中的“与”用and表示,或用or表示。如果一条逻辑语句是“××× and 1=1”这样写的,是不会影响×××原来逻辑的,因为1=1是永远为真的。来构造一下输入的内容,这里输入“1' and '1' = '1”,如图12所示。
网络安全编程:DVWA实例
图12  构造的AND语句

点提交以后仍然会看到ID为1的信息,那么上面的输入是如何拼接成SQL语句的呢?大体如下:
$id = "1 and '1'='1";$sql = "select firstname, surname from 表名 where id = '" . $id . "'";
那么拼接后的语句如下:
select firstname, surname from 表名 where id = '1' and '1'='1';
现在知道and '1'='1'是不改变前面的逻辑值的,也就是对id='1'是否存在是不改变的,也就是id='1'是真,id='1' and '1'='1'就是真,如果id='1'是假,那么id='1' and '1'='1'还是假。在输入时,第一个1后面有一个单引号,是用来和代码中的SQL语句中的单引号进行闭合的,而最后一个1的前面有一个单引号,它是用来和SQL语句中的单引号进行配对的。因为在代码中本身就存在单引号的。如果在代码中用的不是字符串,而输入框中构造的有单引号,则会抛出异常。因此,猜测的两种方法这里使用的是第一种。

那么如何让这个语句永真呢,还是利用该等式'1'='1',只是逻辑连接符由and改为or。

那么再次在输入框中提交“1' or '1'='1”,提交后如图13所示。
网络安全编程:DVWA实例
图13  构造的or语句

从图13中可以看出,由于提交的内容是“1' or '1'='1”,那么构造的SQL语句就成为了如下语句:
Select firstname, surname from 表名 where id = '1' or '1' = '1'
由于查询条件永真,那么将会把所有的记录都列出来。那么该语句还适合于在前面的“Brute Forece”模块中进行测试,在输入用户名的地方输入“admin' or '1'='1”,在输入密码的地方也输入“admin' or '1'='1”,同样可以得到与输入正确密码的一样的效果。

SQL注入是非常灵活的,下面再随便输入几个测试的语句,如“1' union select user(), '1”和“1' union select database(), '1”,可以显示出系统登录数据库的用户名和当前系统所使用的库名,如图14和图15所示。
网络安全编程:DVWA实例
图14  系统登录数据的用户为root

网络安全编程:DVWA实例
图15  系统所使用的库名为dvwa

SQL注入的灵活是因为SQL语句本身的灵活,要想更好地掌握SQL注入那么就一定要先掌握SQL语言的使用。

本文演示了DVWA系统的3个模块,分别是Brute Force、File Upload和SQL Injection。Web系统的漏洞基本也是因为对用户提交的数据过滤不严格而造成的,一切用户的输入都应该视为不安全的,因此安全编码就是从开发人员层面来杜绝系统产生漏洞,在系统上线之前还会有代码审计、Web漏洞扫描等上线前的安全检查,针对Web安全防护的系统有ADS、WAF、网页防篡改等。当然了,最关键的还是从编码时就考虑安全的问题,从源头杜绝系统产生漏洞。

参考文献:C++ 黑客编程揭秘与防范(第3版)


如侵权请私聊公众号删文网络安全编程:DVWA实例

网络安全编程:DVWA实例

网络安全编程:DVWA实例

本文始发于微信公众号(黑白之道):网络安全编程:DVWA实例

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: