DVWA(Damn Vulnerable WebApplication)是一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用,旨在为安全专业人员测试自己的专业技能和工具提供合法的环境,帮助web开发者更好的理解web应用安全防范的过程。
下载地址:http://www.dvwa.co.uk
DVWA共有十个模块,分别是Brute Force(暴力(破解))、CommandInjection(命令行注入)、CSRF(跨站请求伪造)、FileInclusion(文件包含)、File Upload(文件上传)、Insecure CAPTCHA(不安全的验证码)、SQL Injection(SQL注入)、SQL Injection(Blind)(SQL盲注)、XSS(Reflected)(反射型跨站脚本)、XSS(Stored)(存储型跨站脚本)。
DVWA 1.9的代码分为四种安全级别:Low,Medium,High,Impossible。初学者可以通过比较四种级别的代码,接触到一些PHP代码审计的内容。
burpsuite中intruder标签内attack type四种类型的用法和区别
第一种:
Sniper标签 这个是我们最常用的,Sniper是狙击手的意思。这个模式会使用单一的payload【就是导入字典的payload】组。它会针对每个position中$$位置设置payload。这种攻击类型适合对常见漏洞中的请求参数单独地进行测试。攻击中的请求总数应该是position数量和payload数量的乘积。
第二种:
Battering ram – 这一模式是使用单一的payload组。它会重复payload并且一次把所有相同的payload放入指定的位置中。这种攻击适合那种需要在请求中把相同的输入放到多个位置的情况。请求的总数是payload组中payload的总数。简单说就是一个playload字典同时应用到多个position中
第三种:
Pitchfork – 这一模式是使用多个payload组。对于定义的位置可以使用不同的payload组。攻击会同步迭代所有的payload组,把payload放入每个定义的位置中。比如:position中A处有a字典,B处有b字典,则a【1】将会对应b【1】进行attack处理,这种攻击类型非常适合那种不同位置中需要插入不同但相关的输入的情况。请求的数量应该是最小的payload组中的payload数量
第四种:
Cluster bomb – 这种模式会使用多个payload组。每个定义的位置中有不同的payload组。攻击会迭代每个payload组,每种payload组合都会被测试一遍。比如:position中A处有a字典,B处有b字典,则两个字典将会循环搭配组合进行attack处理这种攻击适用于那种位置中需要不同且不相关或者未知的输入的攻击。攻击请求的总数是各payload组中payload数量的乘积。
下面将对不同级别的代码进行分析
服务器端核心代码
'.mysql_error().'
');
if($result&&mysql_num_rows($result)==1)
{
//Getusersdetails $avatar=mysql_result($result,0,"avatar");
//Loginsuccessful echo"Welcometothepasswordprotectedarea{$user}
"; echo""; } mysql_close(); } ?>
Usernameand/orpasswordincorrect.
可以看到,服务器只是验证了参数Login是否被设置(isset函数在php中用来检测变量是否设置,该函数返回的是布尔类型的值,即true/false),没有任何的防爆破机制,且对参数username、password没有做任何过滤,存在明显的sql注入漏洞。
漏洞利用
方法一爆破利用burpsuite即可完成
第一步抓包
第二步,ctrl+I将包复制到intruder模块,因为要对password参数进行爆破,所以在password参数的内容两边加$、选中Payloads,载入字典,点击Start attack进行爆破
第四步、尝试在爆破结果中找到正确的密码,可以看到password的响应包长度(length)“与众不同”,可推测password为正确密码,手工验证登陆成功。
方法二、SQL注入:
1、username:admin’ or’1’=’1
password:空或者随便输入
2、 username:admin’ #
password:空或者随便输入
服务器端核心代码
'.mysql_error().'
');
if($result&&mysql_num_rows($result)==1)
{
//Getusersdetails
$avatar=mysql_result($result,0,"avatar");
//Loginsuccessful
echo"Welcometothepasswordprotectedarea{$user}
"; echo""; } mysql_close(); } ?>
Usernameand/orpasswordincorrect.
相比Low级别的代码,Medium级别的代码主要增加了mysql_real_escape_string()函数
mysql_real_escape_string() 函数转义 SQL语句中使用的字符串中的特殊字符。
下列字符受影响:
如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。
mysql_real_escape_string(string,connection)
参数 |
描述 |
string |
必需。规定要转义的字符串。 |
connection |
可选。规定 MySQL 连接。如果未规定,则使用上一个连接。 |
$pass做了MD5校验,杜绝了通过参数password进行sql注入的可能性。
mysql_real_escape_string()基本上能够抵御sql注入攻击但是MySQL5.5.37以下版本如果设置编码为GBK,能够构造编码绕过mysql_real_escape_string 对单引号的转义
漏洞利用和low一样
服务器端核心代码
'.mysql_error().'
');
if($result&&mysql_num_rows($result)==1)
{
//Getusersdetails
$avatar=mysql_result($result,0,"avatar");
//Loginsuccessful
echo"Welcometothepasswordprotectedarea{$user}
"; echo""; } mysql_close(); } //GenerateAnti-CSRFtoken generateSessionToken(); ?>
Usernameand/orpasswordincorrect.
High级别的代码加入了Token,可以抵御CSRF攻击,同时也增加了爆破的难度,通过抓包,可以看到,登录验证时提交了四个参数:username、password、Login以及user_token。
每次服务器返回的登陆页面中都会包含一个随机的user_token的值,用户每次登录时都要将user_token一起提交。服务器收到请求后,会优先做token的检查,再进行sql查询
同时,High级别的代码中,使用了stripslashes(去除字符串中的反斜线字符,如果有两个连续的反斜线,则只去掉一个)、 mysql_real_escape_string对参数username、password进行过滤、转义,进一步抵御sql注入。
漏洞利用
由于加入了Anti-CSRFtoken预防无脑爆破,这里就不推荐用Burpsuite,可以通过python脚本先从网页获取user_token进行爆破