emlog绕过验证码刷评论

最近博客常常被人刷评论,最狠的一次被刷了10000多广告。

先看看评论验证码是怎么检查的。

emlog/include/controller/comment_controller.php,先获得$imgcode:

<?php
$imgcode = isset($_POST['imgcode']) ? addslashes(trim(strtoupper($_POST['imgcode']))) : '';

检查:

<?php
...
} elseif (ISLOGIN == false && Option::get('comment_code') == 'y' && session_start() && $imgcode != $_SESSION['code']) {
    emMsg('评论失败:验证码错误');
}

上述代码,几个判断依次是:

  1. 没有登录(非管理员和作者)
  2. 后台开启了评论验证码
  3. 开启session
  4. 将session中的code与$imgcode比较,不相等则验证码错误

第4步明显有问题。熟悉php验证码流程的同学应该清楚,验证码生成的时候将会设置一个session,这里就是code,再和POST过来的也就是用户输入的做比较。

然而如果我们并没有访问验证码生成页面,那么也就没生成session。那么$_SESSION['code']就是NULL。

php中==是弱类型比较,NULL和''(空字符串)比较的结果是TRUE的。

所以这里,我们的$imgcode如果输入一个空值,并且不去访问生成验证码的页面,那么这个$imgcode != $_SESSION['code']就不成立,就不会提示验证码错误,从而绕过了验证码检查逻辑。

所以,我这里做测试。

先正常留言,填写验证码,中途抓包:

QQ20150614-1@2x.png

将PHPSESSID修改成随意一个值,目的是让其$_SESSION不存在。再将imgcode修改成空:

QQ20150614-2@2x.png

发送数据包,可见没有提示失败(302跳转了),说明评论成功:

QQ20150614-3@2x.png

载入一个字典,即可刷评论:

QQ20150614-4@2x.png

QQ20150614-5@2x.png

修复方法是判断session是否为空:

empty($_SESSION['code']) || $_SESSION['code'] != $imgcode

不满足这个条件即提示错误。

另外的方法是和我博客一样,使用第三方验证码,简洁又方便:极验

赞赏

喜欢这篇文章?打赏1元

评论

admin 回复

不拉不拉

admin 回复

测试不拉不拉

admin 回复

测试中

admin 回复

测试

御坂网络 回复

御坂网络御坂网络御坂网络御坂网络御坂网络

御坂网络 回复

御坂网络御坂网络御坂网络

御坂网络 回复

御坂网络

test404 回复

然而没什么卵用 www.test404.com

Test 回复

楼主这个验证有点6我得好好研究...

Test 回复

测试....

404notfound 回复

p师父 为什么修改phpsessionid就能使服务端session为空?这两者有关系吗,还是eblog中生成验证码和phpsessionid有关

phithon 回复

@404notfound:回去学习HTTP基础,包括SESSION是怎么认证的。

小张 回复

你好我的站被黑了 帮忙下 我可以出费用

phithon 回复

@小张:抱歉,实在没时间~

c 回复

empty大法好!
如果不需要0之类的我都用empty糊上……

Th1nk 回复

请将广告引到我的博客。开站两年没有留言了。

lonewolf 回复

如果评论没有开启验证码这个功能呢,

phithon 回复

@lonewolf:那就没事。

mrxn 回复

@lonewolf:我的就一直没开验证码 哈哈 我的书打勾勾

小胖 回复

@mrxn:牛

captcha