DVWA
是一款基于PHP和mysql开发的web靶场练习平台,集成了常见的web漏洞如sql注入
,xss
,密码破解
等常见漏洞。本教程将以DVWA为例,演示常见的web漏洞的利用和攻击。
dvwa
下载安装
点击下面的连接开始下载,并配置config.inc.php
文件。
$_DVWA[ 'db_server' ] = '127.0.0.1';
$_DVWA[ 'db_database' ] = 'dvwa';
$_DVWA[ 'db_user' ] = 'dvwa';
$_DVWA[ 'db_password' ] = '123456';
更改为你的数据库账号信息。
登录创建数据库
访问http://127.0.0.1
输入账号和密码均为admin
点击Create / Reset Database
创建数据库,当数据库创建完成后,会自动登出,用户名:admin
密码:password
重新登录。
配置完成后的界面
登录成功
这样dvwa的安装和配置就完成了。
!!!
在dvwa security选项中,可以调整dvwa的难易程度,
!!!
Brute Force(low)
Brute Force
即为暴力破解,通过枚举获取管理员的账号和密码,在实际的操作中,一般用来破解后台管理系统的登录。
准备
user.txt pass.txt(用户字典和密码字典)
神器burp
在burp中抓包
打开浏览器,在该模块任意输入账号和密码,在burp中抓包。
burp抓包
抓到包后,右键send ro intruder
send to intruder
在intruder
的positions
选择中,先点击clear$
清除所有的变量。
然后分别给username
和password
这两个字段后面的内容添加add$
添加变量
并将attack type
的值设置为cluster bomb
在payloads
选择中分别给payload 1
和payload 2
设置字典路劲。
然后点击上方的start attack
如上,开始枚举破解。
通过length
的长度判决即可。
红色部分为破解的密码
通过上面的破解,我们发现length
的长度存在不一样,大的为破解成功的账号和密码。
Brute Force(medium)
中等等级的暴力破解和低等级的相同,只是低等级的暴力破解可以进行sql注入,而中等级的把其中的字符串给过滤掉了,但是操作相同。
需要注意的是中级的暴力破解相对来说较慢是因为有个sleep函数,在破解失败后会使程序停止运行两秒。
Brute Force(higt)
高等级的暴力破解和低等级、中等等级的暴力破解不相同,它增加了一个user_token参数,所以增加了爆破难度,但是依然可以破解
通过和low的对比,多了一个token
参数。
将抓到的包发送到intrude
,选择攻击模式为pitchfock
,并且给要破解的项带上美元符号
在options
选项中,找到grep-extact
找到Redirections
模块设置允许重定向,选择always
设置密码本,点击payload,选择第一项的密码本与低等级的相同,第二项的时候选择Recursive grep 并且把之前得到的token值粘贴到下方的方框中。
破解效果
命令注入 Command Injection
命令注入(Command Injection),对一些函数的参数没有做过滤或过滤不严导致的,可以执行系统或者应用指令(CMD命令或者bash命令)的一种注入攻击手段。PHP命令注入攻击漏洞是PHP应用程序中常见的脚本漏洞之一。
命令连接符
command1 && command2
&&表示先执行command1,执行成功后执行command 2,否则不执行command 2command1 & command2
$表示先执行command 1,不管是否成功,都会执行command 2command1 || command2
||表示先执行command1,执行失败后,执行command2
low
我们先选输入一个ip地址,发现是对ip地址的ping功能
解决乱码问题
解决此问题的方法:在DVWA-master\dvwa\includes目录下找到dvwaPage.inc.php文件中所有的”charset=utf-8”,修改”charset=gb2312”,即可。
利用
192.168.0.1 && net user
Medium级别
服务端代码解读
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$target = $_REQUEST[ 'ip' ];
// Set blacklist
$substitutions = array(
'&&' => '',
';' => '',
);
// Remove any of the charactars in the array (blacklist).
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
// 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级别的代码,服务器端对ip参数做了一定过滤,即把”&&” 、”;”删除,本质上采用的是黑名单机制,因此依旧存在安全问题。
漏洞利用
127.0.0.1 & ipconfig
High
代码解读
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$target = trim($_REQUEST[ 'ip' ]);
// Set blacklist
$substitutions = array(
'&' => '',
';' => '',
'| ' => '',
'-' => '',
'$' => '',
'(' => '',
')' => '',
'`' => '',
'||' => '',
);
// Remove any of the charactars in the array (blacklist).
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
// 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>";
}
?>
相比Medium级别的代码,High级别的代码进一步完善了黑名单,但由于黑名单机制的局限性,我们依然可以绕过。
漏洞利用
黑名单看似过滤了所有的非法字符,但仔细观察到是把|
(注意这里|后有一个空格)替换为空字符,于是 |
成了“漏网之鱼”。
127.0.0.1|dir
跨站请求(csrf)
CSRF,全称Cross-site request forgery,翻译过来就是跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密等)。
low级别
我们先对其抓包
也就是说,当我们访问http://127.0.0.1/vulnerabilities/csrf/?password_new=888888&password_conf=888888&Change=Change我们的密码就会改变,我们可以伪造这条链接,发送给受害者,在不知不觉中对方的密码就会被修改。
Medium
Medium级别的代码检查了保留变量 HTTP_REFERER(http包头的Referer参数的值,表示来源地址)中是否包含SERVER_NAME(http包头的Host参数,及要访问的主机名,这里是192.168.153.130),希望通过这种机制抵御CSRF攻击。
漏洞利用
过滤规则是http包头的Referer参数的值中必须包含主机名(这里是192.168.153.130)
我们可以将攻击页面命名为192.168.153.130.html(页面被放置在攻击者的服务器里,这里是10.4.253.2)就可以绕过了
hig
High级别的反CSRF机制,关键是要获取token,要利用受害者的cookie去修改密码的页面获取关键的token。
试着去构造一个攻击页面,将其放置在攻击者的服务器,引诱受害者访问,从而完成CSRF攻击。
File Inclusion(文件包含)
File Inclusion,意思是文件包含(漏洞),是指当服务器开启allow_url_include选项时,就可以通过php的某些特性函数(include(),require()和include_once(),require_once())利用url去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是因为开启了php配置中的allow_url_fopen选项(选项开启之后,服务器允许包含一个远程的文件)。
low
我们先点击file1.php
效果如下:
在bur中对其抓包
读取任意文件测试,我们在D盘新建一个txt
构造下面命令:
读取d盘下的bbskali.txt文件
http://192.168.123.129/vulnerabilities/fi/?page=D:\bbskali.txt
访问远程文件
http://192.168.123.129/vulnerabilities/fi/?page=http://192.168.123.129/22.php
这样便完成了文件包含攻击。
Medium
Medium级别的代码增加了str_replace函数,对page参数进行了一定的处理,将”http:// ”、”https://”、 ” ../”、”..\”替换为空字符,即删除。但是对相对路劲的限制没多大。
http://192.168.123.129/vulnerabilities/fi/?page=hthttp://tp://192.168.123.129/22.php
当然,上面的方法比较麻烦的话,我们可以尝试将url进行编码。这样便躲过了规则的限制。
High
High级别的代码规定只能包含file开头的文件,看似安全,但依然可以利用file协议绕过防护策略。
文件上传(File Upload)
利用文件上传,我们可以上传我们的一句话木马,很方便的会获得系统shell
low
我们建立一个php文件,浏览后直接上传成功。
medium
如果我们直接上传,会提示如下Your image was not uploaded. We can only accept JPEG or PNG images.
可以看到,对上传的文件做出了要求,必须是jpg和png
解决方法
抓包修改文件类型即可
如下,成功上传。
还有一种方法就是将php的后缀改成jpg,然后在burp中将其重新改回php即可。
high
要求上传的文件类型必须为:”.jpg”、”.jpeg” 、”*.png”之一,同时限制了文件的长度。
所以,一种简单的方法就是,合成图片木马。但是这种方法受到php环境的限制,有时不能成功解析php图片木马。
最佳方案
图片木马配合命令注入
我们先做一个图片木马
GIF98
<?php
phpinfo();
?>
然后在命令注入模块中,执行下面命令
127.0.0.1 & copy D:\phpstudy_pro\WWW\hackable\uploads\22.jpeg D:\phpstudy_pro\WWW\hackable\uploads\aa.php
成功将图片转变为php
SQL Injection
low
首先我们对其进行抓包
废话不说,神器sqlmap走一波
sqlmap -u "http://192.168.123.129//vulnerabilities/sqli/?id=1&Submit=Submit" --dbs
提示302跳转到了登录页面
所以,我们要在命令中加入cookie保存会话的在线
在burp抓到的包里面,我们复制PHPSESSID=ff4rv0j6rkgv9fnqlvfmhch8bh; security=low
放到sqlmap即可。
所以,最终的命令为:
sqlmap -u "http://192.168.123.129//vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=ff4rv0j6rkgv9fnqlvfmhch8bh; security=low" --dbs
成功爆出数据库
其他的后续操作我这里就不在啰嗦了。
medium
同样的方法,还时对其抓包
通过抓包和low的对比发现,由原来的get方式变成了post
将抓到的包复制另存为bbskali.txt
执行如下命令;
sqlmap -r "/root/bbskali.txt" --dbs