DVWA详解:暴力破解篇(下)
前言:
没什么想说,快点把这个坑填了,至少先把暴力破解这个坑填完~~~
快速跳转
HIGH - 暴力破解 [ Burp Suite ]
在"HIGH"等级下,已经无法使用"hydra"工具进行暴力破解了,原因是"GET请求"中,额外的引入了"user_token="这个参数(TOKEN),而这个参数每点击完"Login"或刷"Brute Force"页面后都会重新生成(这是查看了PHP源码得出的结论),这就使"hydra"工具在这个情况下无能为力了;补充一下,HIGH级别的PHP源码中,首先使用"checkToken()"将"user_token="提交的值与服务器上的"session_token"值进行比较,之后会用"generateSessionToken()"重新生成TOKEN再将响应数据返回客户端,情况大概就是这样;
因此,要暴力破解HIGH难度的"Brute Force",我们需要使用新的方法,本篇博文使用的工具是"Burp Suite";该工具如何安装,读者只能自己去网上找了;首先,我们必须使用"Burp Suite"所附带的浏览器,目的是截获DVWA站点的"请求"与"响应"数据;打开"Burp Suite",执行下图的操作:
我们在"Burp Suite"所附带的浏览器上,使用任意账号与密码进行登录操作,让"Burp Suite"能够截获"/vulnerabilities/brute/..."的数据包,之后进入下一步:
现在,我们进入"Proxy"代理模块,找到最后一条"GET请求"的数据(上一步点击"Login"所发送的"GET请求"),将其发送至"Intruder"入侵模块,进入下一步:
进入"Intruder"入侵模块后,选择攻击类型为"Pitchfork",这是一种可以在"请求头"设定多个PLAYLOAD注入点的方式,选择这个方式,是因为在HIGH等级下,只有这个攻击类型最合适;另外还有其它攻击类型,其中有一种为"Cluster Bomb"(组合攻击),看上去应该是比"Pitchfork"更适合的模式,但这是错误的想法,由于"user_token="的存在及其"Cluster Bomb"的工作原理,此处使用这个模式并不合适;
这里,我们需要在"请求头"上设定我们的PLAYLOAD注入点;在我们将"GET请求"的数据发送至"Intruder"入侵模块时,"Burp Suite"已经为数据包自动设定了可能的注入点了,但这不合适,我们需要按实际情况修改;
1、强制设定"username="的值为"admin",即不定义注入点;这样设定,意味着我们在暴力破解前,已经知道了一个有效的用户名,我们现在只想暴力破解出该用户的密码;
2、设定"password="为PLAYLOAD注入点"§1§";
3、取消"Login="的注入点表示;
4、设定"user_token="的PLAYLOAD注入点"§2§";
5、取消"Cookie:"的注入点表示;
经过上面设定后,表明我们需要对两个PLAYLOAD进行配置;
补充:读者可能会想"将'username='也设定为一个PLAYLOAD注入点",不是更好吗?答案是可以的,但是基于"Pitchfork"攻击类型的工作原理,我们需要将原来的"user.dict"与"passwd.dict"进行改造才能实现,由于这篇博文的内容太长了,博主不想再增加这篇博文的长度了,有兴趣的读者可以自己去研究相关内容;
在完成以上操作后,进入下一步:
设定"第一个PLAYLOAD"(对应"§1§"注入点):
1、"Playload set"设定为"1"(对应"§1§"注入点);
2、"Playload type"设定为"Sample list";
3、导入"passwd.dict"字典(这个文件就是我们在"LOW"等级生成的密码字典文件);
现在我们需要对"第二个PLAYLOAD"进行设定(对应"§2§"注入点);想想"§2§"注入点需要的数据是什么?是TOKEN!!这个TOKEN每次都会变化,如何获取这个TOKEN?方法是,新发送一个"GET请求",然后从其响应的数据中获取!!这时我们就需要使用到"Playload type"中名为"Recursive grep"的方法了,这个方式可以基于规则,从响应数据中获取你所需要的"数据";
上面说了,"Recursive grep"方法需要"规则",那么,现在我们先去建立规则:
到"Option"选项,找到"Grep - Extrace",使用"ADD"功能新增规则;可以使用"user_token"关键字进行快速定位,然后选中所需要的内容(选中TOKEN的值),"Burp Suite"会自动帮你生成所需要的规则表达式,你只需要核对合理性即可;
在设定"第二个PLAYLOAD"之前,我们重设一下"Brute Suite"的重定向定义,因为就在同一个页面中;另外在这个页面中,我们也可以观察到之前创建的规则生成了;
现在,设定"第二个PLAYLOAD"(对应"§2§"注入点):
1、"Playload set"设定为"2"(对应"§2§"注入点);
2、"Playload type"设定为"Recursive grep",同时,我们发现刚刚建立的"规则",程序已经自动帮们导入了;
3、设定执行攻击时,第一次发送请求时所使用的TOKEN,实测效果非常不好,选择配置;
最后,我们需要单线程的去执行这个攻击!!!想想为什么?没错,因为每一次请求,都会重置TOKEN的值,如果使用并发执行,那"GET请求"中的"user_token="的值就无法保证正确性了;
1、进入"Resource Pool",设定一个"单线程执行的资源池"
2、设定见下图(不想写了):
3、设定完成后,点击"Start Attack"进行攻击!!!
当我们执行"攻击"操作后,会自动切换到相应的"攻击过程页面";待整个攻击过程结束后,我们就可以得到结果了,见下图:
在得到攻击结果后,我们如何知道我们是否攻击成功了呢?这就得说一下如何判断攻击是否成功的原理了!!!
实际上,"Burp Suite"并没有直接的破解结果,我们只能能完观察"每次请求所返回的响应数据的大小",来判断猜测破解成功的可能性;上图中,我们发现了一个特别的"响应数据包",其大小为"4733",明显 的与"其它响应的数据包"的大小不同,通过这个观察,我们可以大概猜测出,这个大小为"4733"的"响应数据包"所对应的"GET请求"请求应该执行成功了(登录成功),因为对于一次暴力破解,大部分"GET请求"所返回的"响应数据包"应该大小相同(均返回了登录失败的页面,所以"响应数据包"的大小应该相同);
再结合"GET请求"中的URL的参数定义("username=admin"),我们判断出一个有效的账号与密码组合,即"admin/password";到此,整个暴力破解过程执行成功;
HIGH - PHP源码解释
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 |
// 只对关键部分进行说明,其它见"LOW"或"MEDIUM"等级的源码解释; // 另外还有一些新的功能函数实了某些效果,如过滤特殊字符(防SQL注入), // 这些函数的作用请读者自己百度,这不在暴力破解的话题中; <?php if( isset( $_GET[ 'Login' ] ) ) { // 本处使用了"checkToken()"函数进行了TOKEN校验,如果校验失败,将自动跳转至"/vulnerabilities/brute/index.php"页面; // 然而这里的逻辑有点问题,后续的代码实际还是会继续执行....; // 另外,跳转至"/vulnerabilities/brute/index.php"页面后,还会再调用"high.php"一次,这逻辑... // // 本处官方注释是用于防"CSRF",这是对的,这是TOKEN的一个作用; checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); // Sanitise username input $user = $_GET[ 'username' ]; $user = stripslashes( $user ); $user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $user ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); // Sanitise password input $pass = $_GET[ 'password' ]; $pass = stripslashes( $pass ); $pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); $pass = md5( $pass ); // Check database $query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';"; $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>' ); if( $result && mysqli_num_rows( $result ) == 1 ) { // Get users details $row = mysqli_fetch_assoc( $result ); $avatar = $row["avatar"]; // Login successful echo "<p>Welcome to the password protected area {$user}</p>"; echo "<img src=\"{$avatar}\" />"; } else { // Login failed sleep( rand( 0, 3 ) ); echo "<pre><br />Username and/or password incorrect.</pre>"; } ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res); } // 为什么每次登录或刷新 BruteForce 页面都刷TOKEN的值, // 就是因为"generateSessionToken()"这个函数 generateSessionToken(); ?> |
结
终于写完这个话题了,太多内容了,如果你希望看到下一篇详细,那么博主能保证,一定会很久很久!!!完~
上一篇:《DVWA详解:暴力破解篇(上)》
DVWA详解:暴力破解篇(下):等您坐沙发呢!