zoukankan      html  css  js  c++  java
  • Xiaocms验证码绕过分析

    事实证明这套程序验证码没有办法存在绕过。具体分析在t00ls上。但是这套程序获取验证码的逻辑是存在问题的,思路是可以借鉴的。

    第一次请求后台是,红线位置是请求验证码的url。

    当我们第一次请求时,也就是没有点击提交。程序会包含这个前台页面。

    跟进前台页面,前台页面会通过img的src属性加载验证码。

    <img id="code" src="../index.php?c=api&a=checkcode&width=85&height=26" align="absmiddle" title="看不清楚?换一张" onclick="document.getElementById('code').src='../index.php?c=api&a=checkcode&width=85&height=26&'+Math.random();" style="cursor:pointer; margin-top:-3px;"></td>

    跟进生成验证码图片的代码(api控制器下的checkcodeAction方法),加载了image类,继续跟进:

    1     public function checkcodeAction() {
    2         $api    = xiaocms::load_class('image');
    3         $width  = $this->get('width');
    4         $height = $this->get('height');
    5         $api->checkcode($width,$height);
    6     }

     这里将生产的验证码赋值到session中了。

    上面我们清楚了,验证码获取的流程。

    我们看下验证码怎么验证的。

    跟进checkCode函数。

    1     protected function checkCode($value)
    2     {
    3         $code = $this->session->get('checkcode');
    4         var_dump($value);
    5         $value = strtolower($value);
    6         $this->session->delete('checkcode');   //删除session中的验证码
    7         return $code === $value ? true : false;
    8     }

    就是我们post的验证码和session中生产的验证码比较。关键这里有一句删除验证码,就导致了问题。

    捋一下逻辑,当我们第一次请求的时候submit为空,就不会进入if分支,就会包含前台页面,前台页面就会请求获取验证码。

    当我们第一次提交验证码时候,sumbit就不为空了,会进入if分支。然而第一次提交验证码后会把存验证码的session删掉。session=null

    当我们第二次请求的时候,submit不为空,继续进入if分支,就不会请求验证码。session=null 当我们post也是null时,就能绕过验证码了。

    GitHub:https://github.com/Afant1
    不忘初心、方得始终
    Copyright@2021 Afant1
    [转载文章务必保留出处和署名,谢谢!]
  • 相关阅读:
    微信公众号教程(5)自动回复操作案例
    微信公众号教程(4)微信公众平台编辑模式介绍
    微信公众号教程(3)微信公众平台群发消息
    微信公众号教程(2)微信公众平台后台介绍
    微信公众号教程(1)微信公众账号注册、设置、登陆
    二级c程序设计题(2)
    二级c程序设计题(1)
    C++经典编程题#6:分配病房
    C++经典编程题#5:寻找下标
    python-----面向对象三大特性
  • 原文地址:https://www.cnblogs.com/afanti/p/8039519.html
Copyright © 2011-2022 走看看