其实这是一道很简单的题,题目中也给了提示:
提示的意思是验证码不会变,结合网上的一些解析也是对此直接默认了,但是这个验证码是怎么不变的,没有看到有人细说,也许这些思考对于一些人来说已经微不足道了,但是结合一些搭建网站前后端的知识,我想从一个初学者的角度更深层次的解释一下这个问题。
——————————————————————————————
解题方法
爆破是基于上一题对于用户名密码的简单爆破,这题关键在于有了验证码。
初步的试探一下,如果输错了验证码,不管用户名密码是什么,都会显示“验证码输入错误哦!”,然后验证码会刷新。
而把验证码输入正确,用户名密码不正确,就会显示“username or password is not exists~”,然后验证码也会刷新。
所以总结一下网站的展现的表象,这个验证码在两种情况下会变,第一种情况是刷新页面的时候,第二种情况是点击验证码图片的时候。
然后打开burpsuite按照正常顺序,打开代理,输入用户名、密码、验证码,点击“Login”,然后发的请求就会被burpsuite捕获到。
发现这个请求是POST,然后一共有四个参数分别是 username password vcode submit
其中submit是前端代码中在“Login”按钮里写死的
<input class="submit" name="submit" type="submit" value="Login">
而username与password是需要爆破的,所以想着这个vcode先不让他变,把这个请求送到Repeater里面去,先改变用户名和密码看一看响应的回来代码的变化,尤其是“Login”按钮下面那一行小字,看看是返回的文字是验证码不对还是用户名密码不对。
于是在Repeater中如下操作:
在左面的请求中,用户名、密码改成222,验证码(vcode)是正确的,只不过刷新了页面不是原来的验证码了。
在右面的响应中,在html代码中找到那个“Login”按钮,下面显示的是用户名密码不对。
如是再更改几次用户名密码,验证码vcode不改变,结果还是显示用户名密码不对,说明验证码一直是对的。
由此就知道了,在burpsuite里面操作这期间,没有碰浏览器,验证码一直是没有变的。
所以此时把请求发送到intruder来进行爆破,由于是用户名和密码两个参数的爆破,需要选择pitchfork模式,将username和password添加进参数。
分别为用户名和密码选择爆破字典,然后进行爆破。
这里字典简单了些,就是为了做题。
结果如下:
然后发现admin和123456组合的响应报文长度不一样,点进去看发现他是“login success”字样,所以比别的“username or password is not exists~”字样会少一点字。
到此这道题就做完了。
深度思考
那为啥这个验证码当时在burpsuite里就不变呢?单单的试一试发现他不变有点瞎猫碰死耗子的侥幸,感觉这道题和闹着玩一样。但其实仔细深究的话,这里面知识还是不少的。
这个pikachu平台我是搭建在自己电脑上的,随时可以看源代码,这个问题的答案就是藏在源代码里,所以就先细细的分析一下代码。
首先要知道一个事情,这个网站由php、html、js等代码写成的,php属于后端代码,由服务器来解析运行;html、js是前端代码,在浏览器(客户端)来解析运行。所以在网页中右键,再点击查看网页源代码之后,能看见的只有html和js代码,以及php代码运行过之后对html代码的一些更改、添加等效果。要是想看后端的php代码就要去本地文件夹中去看。
查看浏览器中的验证码图片这个区域的源代码(对应的后端文件是bf_server.php),观察到img标签中的src指向showvcode.php;后面的onclick事件是对于showvcode.php的重新请求,后面用get方法传日期那个没有用,后面代码可以看出来。
在本地文件中找到这个文件,这是pikachu作者的源文件:
showvcode.php
<?php
session_start();
include_once 'function.php';
//$_SESSION['vcode']=vcode(100,40,30,4);
$_SESSION['vcode']=