练习部分
验证码的作用:防止登录暴力破解,防止机器恶意注册。
验证码的认证流程:客户端request登录页面,后台生成验证码;把输入的验证码进行校验;客户端重新刷新页面,再次生成新的验证码。
验证码绕过on client
首先进入pikachu靶场第一章节验证码绕过(onclient),在网站中随意输入账号密码进行测试。
可见分别选择不输入验证码,输入错误的验证码,输入正确验证码但用户密码错误的三种情况中,网页弹出的提示分别不同。
打开brupsite利用proxy抓包,可以看到相比之前无验证码的登录方式,现在在请求中多了验证码的数据。
在pikachu网页右键选择查看网页的源代码
查看源代码找到验证码相关函数,观察可知此网站利用JavaScript在页面中利用createcode函数生成一个验证码,利用validate函数对验证码进行校验并弹出各项提示信息。
查看源代码的html部分,可见createcode函数被绑定给了input选框。由此可知该网页的验证码机制由前端的js代码负责,后端未对验证码进行验证。
回到burpsite把proxy中的请求,右键选择发送到repeater,在repeater模块中选中请求中验证码的部分,修改其数值为任意其他数字,点击发送进行测试
在发送之后得到响应,响应中进行查找源码,可见网页的响应不为之前我们测试中显示的验证码错误的提示信息,而是用户名密码错误的提示信息username or password is not exists。可知我们已经成功绕过了该验证码系统。
接下来重复pikachu漏洞练习第一章节基于表单的暴力破解步骤,在proxy中选中请求发送到intruder,在intruder选择clusterbomb攻击方式,把请求中的用户名密码静态数据替换为动态payload变量,设置不同payload集的字典,在payload设置中选择grepmatch,设置匹配项为username or password is not exists,最后开始攻击。
在得到攻击结果中单击username选项卡进行排序,可见只有两个申请请求项的结果不为1,且其响应长度也与其他结果不同,猜测这俩所使用的用户名密码即为正确的用户名密码。
将其输入至网页验证。成功登录网页。
验证码绕过on server
进入pikachu靶场第一章节验证码绕过(onserver),在网站中随意输入账号密码进行测试。
可见分别选择不输入验证码,输入错误的验证码,输入正确验证码但用户密码错误的三种情况中,网页弹出的提示分别不同。
我们使用刚刚针对client的验证码的思路,先使用proxy抓包,发送到repeater,修改验证码参数,发送请求,观察响应。可见响应中不像之前针对client的验证码时一样显示username or password is not exists,而是显示验证码错误。可知该验证码不能像之前那样绕过。
回到网页,刷新页面,在proxy中点击放行请求,回到网页,可见新的验证码被刷新了出来
我们把新的验证码输入到repeater,再次申请发送,在收到的响应中可见网页的提示信息由验证码错误变成了username or password is not exists。可知我们成功绕过了该网页的验证码系统。
我们把请求中的用户名密码改变,验证码不变,再次发送请求测试。在收到的响应中可见网页的响应依然是username or password is not exists。可知该验证码可以在不刷新的情况下反复使用不同的用户名密码进行验证。
在repeater中右键选择发送到intruder。接下来的操作就可以重复上文和之前第一章节第一题的步骤了,选择clusterbomb攻击,添加payload的位置,设置不同payload集的字典,设置grepmatch,开始攻击。
在攻击结果中可见两个成功登录的用户名密码对。
将其输入到网页中进行验证,成功登录网页。