分析有个不对头的地方:http://wooyun.jozxing.cc/static/bugs/wooyun-2014-080211.html

后面再补

这个漏洞比较简单。

我们看到配置文件来。/include/common.inc.php  第86-94行。

if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
$onlineip = getenv('HTTP_CLIENT_IP');
} elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
$onlineip = getenv('HTTP_X_FORWARDED_FOR');
} elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
$onlineip = getenv('REMOTE_ADDR');
} elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
$onlineip = $_SERVER['REMOTE_ADDR'];
}

  如果获取不到HTTP_CLIENT_IP的环境变量,返回false,往下执行。接着就获取HTTP_X_FORWARDED_FOR的环境变量,这个变量用户是可控的,所以我们可以伪造HTTP_X_FORWARDED_FOR来对$onlineip进行赋值。

接着看到用户登录界面,位于 logging.php  第39-139行

	if(!($loginperm = logincheck())) {
showmessage('login_strike');
}

  我们跟进logincheck()

位于 /include/misc.func.php  第368-381行。

function logincheck() {

	global $db, $tablepre, $onlineip, $timestamp;

	$return = 0;
$login = $db->fetch_first("SELECT count, lastupdate FROM {$tablepre}failedlogins WHERE ip='$onlineip'");
$return = (!$login || ($timestamp - $login['lastupdate'] > 900)) ? 4 : max(0, 5 - $login['count']); if($return == 4) {
$db->query("REPLACE INTO {$tablepre}failedlogins (ip, count, lastupdate) VALUES ('$onlineip', '1', '$timestamp')");
$db->query("DELETE FROM {$tablepre}failedlogins WHERE lastupdate<$timestamp-901", 'UNBUFFERED');
}
return $return;
}

  

先导入全局变量,然后进行查询。在cdb_failedlogins中查询$onlineip,

如果没查询到,!$login 将返回True,又或者当前的时间减去查询到的id上次登录的时间大于900秒 ($timestamp - $login['lastupdate'] > 900)

就返回4,否则返回max(0, 5 - $login['count'])当中最大的值

如果 $return是4的话,往下执行:

REPLACE INTO {$tablepre}failedlogins (ip, count, lastupdate) VALUES ('$onlineip', '1', '$timestamp')

来看下replace的用法:

1.replace into 
replace into table (id,name) values('1','aa'),('2','bb') 
此语句的作用是向表table中插入两条记录。如果主键id为1或2不存在 
就相当于 
insert into table (id,name) values('1','aa'),('2','bb') 
如果存在相同的值则不会插入数据

也就是在表中记录下 $onlineip  以及登录次数设置为1,还有当前的时间值。

接着就是对表进行delete操作,删除被限制900秒登录的ip,然后把$return赋值给$loginperm

返回logging.php ,如果登录失败的话 会执行这个函数loginfailed($loginperm);

function loginfailed($permission) {
global $db, $tablepre, $onlineip, $timestamp;
$db->query("UPDATE {$tablepre}failedlogins SET count=count+1, lastupdate='$timestamp' WHERE ip='$onlineip'");
}

  所以会对当前的$onlineip的count值进行+1 操作。

综上所述,我们可以利用变化的X-Forwarded-For值进行伪造,绕过同一ip可登录五次的限制。

在管理员登录这里也有个

	function init_var() {
$this->time = time();
$cip = getenv('HTTP_CLIENT_IP');
$xip = getenv('HTTP_X_FORWARDED_FOR');
$rip = getenv('REMOTE_ADDR');
$srip = $_SERVER['REMOTE_ADDR'];
if($cip && strcasecmp($cip, 'unknown')) {
$this->onlineip = $cip;
} elseif($xip && strcasecmp($xip, 'unknown')) {
$this->onlineip = $xip;
} elseif($rip && strcasecmp($rip, 'unknown')) {
$this->onlineip = $rip;
} elseif($srip && strcasecmp($srip, 'unknown')) {
$this->onlineip = $srip;

所以也能绕过ip限制进行爆破,还有一点就是对于验证码的重复使用。

只需要seccodehidden是请求验证码参数时候的seccodehidden ,

/uc_server/admin.php?m=seccode&seccodeauth=edb516z36gQ7e0R0YNxCOpXry3WTyJMf0qr5YKmJBpyWU0I&780815552

看到这里:

/uc_server/control/admin/user.php  第70-77行

				$seccodehidden = urldecode(getgpc('seccodehidden', 'P'));
$seccode = strtoupper(getgpc('seccode', 'P'));
$seccodehidden = $this->authcode($seccodehidden, 'DECODE', $authkey);
require UC_ROOT.'./lib/seccode.class.php';
seccode::seccodeconvert($seccodehidden);
if(empty($seccodehidden) || $seccodehidden != $seccode) {
$errorcode = UC_LOGIN_ERROR_SECCODE;
}

  

从post的数据中获取:$seccodehidden   $seccode 两个参数,然后对$seccodehidden进行解码

$seccodehidden = $this->authcode($seccodehidden, 'DECODE', $authkey);

解码$seccodehidden参数

require /lib/seccode.class.php ,然后调用seccodeconvert($seccodehidden)函数

	function seccodeconvert(&$seccode) {
$s = sprintf('%04s', base_convert($seccode, 10, 20));
$seccodeunits = 'CEFHKLMNOPQRSTUVWXYZ';
$seccode = '';
for($i = 0; $i < 4; $i++) {
$unit = ord($s{$i});
$seccode .= ($unit >= 0x30 && $unit <= 0x39) ? $seccodeunits[$unit - 0x30] : $seccodeunits[$unit - 0x57];
}
}

  对$seccodehidden进行计算,算出$seccodehidden的值,与$seccode的值做对比,如果和计算出来的相同,就进行下一步。

也就是说我们只要第一次验证的时候保持$seccodehidden   $seccode  两个参数不变,并且绕过ip限制,这样我们就能对后台进行爆破了。

后台对于返回的提示消息,设计的规范但是不友好。比如用户名错误,他就返回用户名不存在,这样就能爆破用户名了,当用户名正确的时候,他返回:用户名无效,或密码错误, 这样我们就能爆破密码。

如果要修复的话,ip不应该从用户可控的地方来判断,直接从REMOTE_ADDR来判断。

  

Discuz!X 系列 HTTP_X_FORWARDED_FOR 绕过限制进行密码爆破的更多相关文章

  1. Kali系列之Hydra/Medusa mysql密码爆破

    hydra hydra -L /home/chenglee/zidian/user.txt -P /home/chenglee/zidian/wordlist.TXT 192.168.137.133 ...

  2. 关于Discuz! X系列远程代码执行漏洞

    一.漏洞起源 突然有同事反馈,无法注册 看到这里不了解的同行估计一年懵逼,这里也是常用的漏洞攻击,可以肯定的是  badwords.php文件被修改了 ,可以查看这个文件内容 <?php $_C ...

  3. [视频]K8飞刀 Discuz! X 系列(1.5 2.5 3.x)产品升级漏洞GetShell教程

    K8飞刀 Discuz! X 系列(1.5 2.5 3.x)产品升级漏洞GetShell教程 https://pan.baidu.com/s/1bnv2euz

  4. iOS 13 绕过锁屏密码漏洞

    iOS 13 很快就要发布了,在未正式发布之前,西班牙的安全研究员 Jose Rodriguez 公开了一个漏洞,能够查绕过锁屏密码查看通讯录.照片.短信. 在 iOS 设备上,当屏幕锁定时,用户无法 ...

  5. 【漏洞分析】Discuz! X系列全版本后台SQL注入漏洞

    0x01漏洞描述 Discuz!X全版本存在SQL注入漏洞.漏洞产生的原因是source\admincp\admincp_setting.php在处理$settingnew['uc']['appid' ...

  6. Web安全测试学习笔记-DVWA-登录密码爆破(使用Burp Suite)

    密码爆破简单来说,就是使用密码本(记录了若干密码),用工具(手工也可以,if you like...)一条条读取密码本中的密码后发送登录请求,遍历密码本的过程中可能试出真正的密码. 本文学习在已知登录 ...

  7. 安全测试——利用Burpsuite密码爆破(Intruder入侵)

    本文章仅供学习参考,技术大蛙请绕过. 最近一直在想逛了这么多博客.论坛了,总能收获一堆干货,也从没有给博主个好评什么的,想想着实有些不妥.所以最近就一直想,有时间的时候自己也撒两把小米,就当作是和大家 ...

  8. 数据库密码爆破HexorBase

    数据库密码爆破HexorBase   数据库服务是服务器上最常见的一类服务.由于数据库保存大量的敏感信息,所以它的安全非常重要.测试数据库服务安全的重要方式,就是检查口令的强壮度.   Kali Li ...

  9. Burp_用户名密码爆破

    burp 全称 Burp Suite, 是用于攻击web 应用程序的集成平台.它包含了许多工具,可以抓包可以爆破也可以扫描漏洞. 主要组件如下: Proxy--是一个拦截HTTP/S的代理服务器,作为 ...

随机推荐

  1. win10下NeuralStyle的tensorflow版实验

    ---恢复内容开始--- 首先配置win10下的tensorflow-gpu的运行环境,然后在github上将NeuralStyle拷贝下来,最后根据文档说明参数,运行文件,即可得到自己喜欢的styl ...

  2. 多目标跟踪(MOT)论文随笔-SIMPLE ONLINE AND REALTIME TRACKING (SORT)

    网上已有很多关于MOT的文章,此系列仅为个人阅读随笔,便于初学者的共同成长.若希望详细了解,建议阅读原文. 本文是使用 tracking by detection 方法进行多目标跟踪的文章,是后续de ...

  3. 敏捷冲刺(Beta版本)

    评分基准: 按时交 - 有分(计划安排-10分,敏捷冲刺-70分),检查的项目包括后文的三个个方面 冲刺计划安排(单独1篇博客,基本分5分,根据完成质量加分,原则上不超过满分10分) 七天的敏捷冲刺( ...

  4. 项目Beta预备

    项目名称:城市安全风险管控系统 Beta预备: 讨论组长是否重选的议题和结论 项目组长可以说是一个团队的灵魂和核心.一个好的领导者可以激发团队成员的工作热情,提高开发效率,保质保量的完成工作.虽然在A ...

  5. Alpha冲刺Day9

    Alpha冲刺Day9 一:站立式会议 今日安排: 经过为期5天的冲刺,基本完成企业人员模块的开发.因第三方机构与企业存在委托的关系.第三方人员对于风险的自查.风险列表的展示以及自查风险的统计展示(包 ...

  6. Python 线程复习

    修改全局变量,设立flag来避免线程间数据冲突,低效率版 from threading import Thread import time g_num=0 g_flag = 1 def test1() ...

  7. 【iOS】OC-时间转化的时区问题

    -(void)testTime{ NSDate *now = [NSDate date];//根据当前系统的时区产生当前的时间,绝对时间,所以同为中午12点,不同的时区,这个时间是不同的. NSDat ...

  8. caffe使用ctrl-c不能保存模型

    caffe使用Ctrl-c 不能保存模型: 是因为使用的是 tee输出日志 解决方法:kill -s SIGINT <proc_id> 或者使用 GLOG_log_dir=/path/to ...

  9. js 获取 最近七天 30天 昨天的方法 -- 转

    自己用到了 找了下  先附上原作的链接  http://www.cnblogs.com/songdongdong/p/7251254.html 原谅我窃取你的果实  谢谢你谢谢你 ~ 先附上我自己用到 ...

  10. Spring邮件发送1

    注意:邮件发送code中,邮件服务器的申请和配置是比较主要的一个环节,博主这里用的是QQ的邮件服务器.有需要的可以谷歌.百度查下如何开通. 今天看了下Spring的官方文档的邮件发送这一章节.在这里记 ...