文章目录

  • 一、常见的逻辑漏洞
    • 1、身份验证漏洞
    • 2、支付逻辑漏洞
    • 3、越权访问
  • 二、DedeCMS 任意用户密码重置分析
    • 1、漏洞分析
    • 2、漏洞复现
  • 三、CmsEasy7.6.3.2 订单金额修改漏洞分析
    • 1、漏洞复现
    • 2、漏洞分析
  • 四、参考资料

一、常见的逻辑漏洞

1、身份验证漏洞

1)暴力破解漏洞

  • 综述:

    暴力破解漏洞,是常见的web安全问题,往往有基于表单的暴力破解、针对验证码的暴力破解等。造成这种安全隐患的原因在于系统没有对用户的数据提交次数做限制,导致了攻击者能够无限制利用工具自动化提交数据。
    对于攻击者来说,只要在时间和计算力足够的情况下,大多数系统都是可以通过暴力破解来攻破的。
    
  • 防御方法:

    对于暴力破解漏洞的防御,主要是设置安全的认证策略:
    1.是否要求用户设置复杂的密码;
    2.是否每次认证都使用安全的验证码(想想你买火车票时输的验证码~)或者手机otp;
    3.是否对尝试登录的行为进行判断和限制(如:连续5次错误登录,进行账号锁定或IP地址锁定等);
    4.是否采用了双因素认证;
    

2)Session攻击

  • 综述:

    常见的Session攻击方式有Session会话劫持和Session会话固定攻击。攻击者在进行攻击的时候,往往胡通过预测、劫持、固定会话的方式来获取一个有效的Session来发起攻击。获取session的方式主要如下:1、 暴力破解:尝试各种Session ID,直到破解为止;2、 预测:如果Session ID使用非随机的方式产生,那么就有可能计算出来;3、 窃取:使用网络嗅探,XSS攻击等方法获得。
    
  • 防御:

    为了防止攻击者获取用户Session,就需要针对攻击者可能的攻击方式进行防御,比如:
    1、设置复杂的、不可逆向破解的Session,比如通过时间戳进行hash,防止Session暴力破解和猜解
    2、设置HttpOnly,防止攻击者通过XSS等方法劫持COOKIe
    3、校验http头信息,比如host,user-agent等
    4、防止SessionId长时间不变,让用户每次登录时的SessionId都发生改变或者固定时间重置SessionID。
    

3)短信轰炸

  • 综述:

    短信轰炸的原理和暴力破解漏洞类似,都是由于对操作没有做次数限制导致的,只不过这里的操作点在短信发送上。短信轰炸的影响是两个方面的,一是对用户造成干扰,二是消耗平台短信资源。
    
  • 防御:

    防御方法和暴力破解的防御方法类似,只要做好次数限制就可以很好的防御。
    

2、支付逻辑漏洞

  • 常见的支付逻辑漏洞

    • 修改支付价格
    • 修改订单数量
    • 修改优惠券、积分
    • 无限制使用等
  • 防御方法

    1、对支付流程的每个环节进行校验,并且防止跳过某一个环节。
    2、用户确认购买后,立即在后端验证商品价格(商品单价、商品数量、折扣优惠)、订单价格和到账金额。
    3、对一些优惠券、折扣券的使用方式进行测试。
    

3、越权访问

对于越权访问,可以分为两个类别,那就是水平越权和锤子越权。水平越权,简单理解就是操作同等权限的其他用户内容,垂直越权就是低权限用户操作管理员用户内容。

1)水平越权

该漏洞就是用户在权限相同级别下的组,可以进行越权访问、修改、删除数据。
形成的原因是由于服务区端在接受到请求数据进行操作时,没有判断数据的所属人而导致的越权数据访问漏洞。

2)垂直越权

由于系统没有做权限控制,仅仅在菜单和按钮上做了权限控制,导致恶意用户只要猜测其他管理页面的URL或者敏感的参数信息,就可以访问或控制其他角色用户的数据和页面,也就是意味着普通用户可以执行只有超级用户才拥有的操作。

3)未授权访问

未经身份认证的用户,访问到了系统中需要认证的用户才能访问的内容,这久属于未授权访问的范畴,这类漏洞往往是由于系统在设计了某些接口的时候,需要登录后的用户从某个入口进行调用,但是未考虑到攻击者在未经登录的情况下,直接调用该接口,从而导致了漏洞的产生。

二、DedeCMS 任意用户密码重置分析

漏洞情报:

1、漏洞分析

首先可以看到,漏洞点在 resetpassword.php 中,所以我么进入文件中看看打字的逻辑:

if(empty($dopost)) $dopost = "";
$id = isset($id)? intval($id) : 0;if($dopost == ""){include(dirname(__FILE__)."/templets/resetpassword.htm");
}elseif($dopost == "getpwd"){//验证验证码、邮箱是否正确if($type == 1){//以安全问题取回密码;} else if ($type == 2){//以安全问题取回密码,if($member['safequestion'] == 0){showmsg('对不起您尚未设置安全密码,请通过邮件方式重设密码', 'login.php');exit;}require_once(dirname(__FILE__)."/templets/resetpassword3.htm");}
......
}else if($dopost == "safequestion"){//如果采用的安全问题验证,在这里验证安全问题是否正确if ($row['safequestion'] == $safequestion && $row['safeanswer'] == $safeanswer) {//如果正确,执行sn函数   sn($mid, $row['userid'], $row['email'], 'N');exit();}
......
}else if($dopost == "getpasswd"){//验证通过,重置密码if(empty($setp)){//判断临时修改码是否过期} elseif($setp == 2){//判断临时修改码是否正确,并检验两次输入的密码是否一致,一致则使用udate语句重置密码}
}

可以看到,大致的逻辑就是通过$dopost参数来标识要执行哪一个步骤。

当我们的dopost为getpwd时,验证用户邮箱是否正确,然后通过用户选择的密码找回方式进行执行后续步骤。这里type=1标识使用邮箱找回,就会发送邮件。当type等于2时就会检测是否设置了安全密码,在设置了的情况下,就会包含“templets/resetpassword3.htm”,让用户输入安全问题。

当用户选择安全问题验证,并输入内容后,就会传入$dopost='dafequestion',然后验证我们的安全问题。在源文件的第86行,验证安全问题的方式是这样的:

if ($row['safequestion'] == $safequestion && $row['safeanswer'] == $safeanswer) {sn($mid, $row['userid'], $row['email'], 'N');exit();}

在这里,要求同时满足两个条件,就是安全问题正确、并且安全答案正确。当我们的用户没有设置安全问题和答案的时候,默认情况下安全问题的值为0,答案为NULL。即数据库中的值$row['safequestion']="0"$row['safeanswer']=null

所以当我们传入的安全问题的值和答案都为空时,if表达式是这样的:

if('0' == '' && null == '')

等价于:

if(false && true)

所以我们只需要让$row['safequestion'] == $safequestion 的结果为true即可绕过检测。由于这里使用的== 而不是使用的===,所以我们就可以利用php弱类型的方法来进行绕过,比如我们的0、0.0、0e1都可以绕过。当我们传入safequestion=0.0&&$safeanswer='的时候,就会导致我们的if语句执行结果为if(true && true),从而绕过安全问题验证。然后执行sn()函数。

//file /inc/inc_pwd_functions.php
function sn($mid,$userid,$mailto, $send = 'Y')
{global $db;$tptim= (60*10);$dtime = time();$sql = "SELECT * FROM #@__pwd_tmp WHERE mid = '$mid'";$row = $db->GetOne($sql);if(!is_array($row)){//发送新邮件;newmail($mid,$userid,$mailto,'INSERT',$send);}elseif($dtime - $tptim > $row['mailtime']){//10分钟后可以再次发送新验证码;newmail($mid,$userid,$mailto,'UPDATE',$send);}else{return ShowMsg('对不起,请10分钟后再重新申请', 'login.php');}
}

可以看到,在这里,主要调用了newmail()函数:

//file /inc/inc_pwd_functions.php
function newmail($mid, $userid, $mailto, $type, $send)
{global $db,$cfg_adminemail,$cfg_webname,$cfg_basehost,$cfg_memberurl;$mailtime = time();$randval = random(8);$mailtitle = $cfg_webname.":密码修改";$mailto = $mailto;$headers = "From: ".$cfg_adminemail."\r\nReply-To: $cfg_adminemail";$mailbody = "亲爱的".$userid.":\r\n您好!感谢您使用".$cfg_webname."网。\r\n".$cfg_webname."应您的要求,重新设置密码:(注:如果您没有提出申请,请检查您的信息是否泄漏。)\r\n本次临时登陆密码为:".$randval." 请于三天内登陆下面网址确认修改。\r\n".$cfg_basehost.$cfg_memberurl."/resetpassword.php?dopost=getpasswd&id=".$mid;if($type == 'INSERT'){.....} elseif($type == 'UPDATE'){$key = md5($randval);$sql = "UPDATE `#@__pwd_tmp` SET `pwd` = '$key',mailtime = '$mailtime'  WHERE `mid` ='$mid';";if($db->ExecuteNoneQuery($sql)){if($send == 'Y') {.....} elseif($send == 'N'){return ShowMsg('稍后跳转到修改页', $cfg_basehost.$cfg_memberurl."/resetpassword.php?dopost=getpasswd&id=".$mid."&key=".$randval);}} else{ShowMsg('对不起修改失败,请与管理员联系', 'login.php');}}
}

由于我们传入的$type=update,$send="N",所以我们只关注

return ShowMsg('稍后跳转到修改页', $cfg_basehost.$cfg_memberurl."/resetpassword.php?dopost=getpasswd&id=".$mid."&key=".$randval);

这里返回了我们的密码修改链接,即/resetpassword.php?dopost=getpasswd&id=".$mid."&key=".$randval,其中,$randval`为我们的临时修改码。到这里就是我们修改密码的地方。整个漏洞利用也就结束了。

所以综合来分析一下,可以发现,我们可以直接绕过验证码验证步骤,直接请求$dopost=dafequestion来构造safequestion=0.0&&$safeanswer=''绕过安全问题检测,从而通过修改id(管理员id为1)来修改未设置密保问题的任意用户密码。

2、漏洞复现

构造payload,通过id获取用户密码修改链接:

/member/resetpassword.php?dopost=safequestion&safequestion=0.0&safeanswer=&id=1

这里设置的id=1,即修改admin用户的密码,然后可见,返回了admin用户的密码修改链接,我们访问:

成功的进入了admin用户的密码修改页面,然后只需要重新设置密码即可。

三、CmsEasy7.6.3.2 订单金额修改漏洞分析

1、漏洞复现

搭建好环境之后,先注册会员,然后选择商品添加到购物车:

在加入购物车这里抓包,然后修改商品数量为-10:

发包,重放后,进入购物车结算,可见金额已经变为了负数:

然后选择支付,就能够发现,钱包余额增加了。

2、漏洞分析

这个漏洞的原理和逻辑也非常的简单,就是我们在添加购物车的时候,没有添加数量做验证和处理,直接保存到了数据库中,而结算金额的时候,依赖数据库中的商品数量进行计算的时候,也咩有对金额和数量做处理,导致了”越买越多“的情况出现。具体的代码逻辑很简单,没分析的必要,就不浪费时间了。。。。。

四、参考资料

  • 狼组安全wiki—常见的逻辑漏洞
  • 逻辑漏洞梳理与总结
  • 暴力破解漏洞详解
  • Session攻击手段分析
  • 支付逻辑漏洞详解
  • 知乎—Web安全之越权漏洞
  • DedeCMS V5.7 任意用户密码重置漏洞复现
  • CmsEasy7.6.3.2 订单金额修改漏洞复现

PHP代码审计11—逻辑漏洞相关推荐

  1. 【BP靶场portswigger-服务端5】业务逻辑漏洞-11个实验(全)

    前言: 介绍: 博主:网络安全领域狂热爱好者(承诺在CSDN永久无偿分享文章). 殊荣:CSDN网络安全领域优质创作者,2022年双十一业务安全保卫战-某厂第一名,某厂特邀数字业务安全研究员,edus ...

  2. 攻防演练中的业务逻辑漏洞及检测思路

    随着各类前后端框架的成熟和完善,传统的SQL注入.XSS等常规漏洞在Web系统里逐步减少,而攻击者更倾向于使用业务逻辑漏洞来进行突破.业务逻辑漏洞,具有攻击特征少.自动化脆弱性工具无法扫出等特点,也为 ...

  3. 逻辑漏洞小结之SRC篇

    最近在挖各大src,主要以逻辑漏洞为主,想着总结一下我所知道的一些逻辑漏洞分享一下以及举部分实际的案例展示一下,方便大家理解. 主要从两个方面看,业务方面与漏洞方面.(接下来就从拿到网站的挖掘步骤进行 ...

  4. java 审计 漏洞函数_Java Web代码审计流程与漏洞函数

    常见框架与组合 常见框架 Struts2 SpringMVC Spring Boot 框架执行流程 View层:视图层 Controller层:表现层 Service层:业务层 Dom层:持久层 常见 ...

  5. 横向越权访问java_基于ThinkPhp5开发横向越权逻辑漏洞安全指南

    什么是纵向越权逻辑漏洞?纵向越权也是垂直越权指的是一个低级别攻击者尝试访问高级别用户的资源,例如本实验:普通用户获取管理员用户权限进行新增/删除便签操作. 越权漏洞是Web应用程序中一种常见的安全漏洞 ...

  6. 利用梆梆加固逻辑漏洞取巧脱壳

    首先要道个歉,之前要发的进程注入,开发hook框架.插件化等技术,因为原公司产品还在使用,暂时是不能开源了,还是食言了. 抽空看了几家加固的应用,做了个通用脱壳机(轻量化,只需要进程注入埋点,全Jav ...

  7. 商品支付,支付逻辑漏洞安全(niushop)——实例讲解一毛钱购买手机

    一.什么是支付逻辑安全 支付逻辑漏洞是指系统的支付流程中存在业务逻辑层面的漏洞 二.常见支付流程: 选择商品和数量--选择支付及配送方式--生成订单编号--订单支付选择--完成支付 如:最常见的支付逻 ...

  8. 常见的登录逻辑漏洞总结

    目录 1.采用弱密码或者无密码进行登录(弱口令) 2.密码可爆破 3.验证码可爆破 4.短信轰炸 5.手机验证码凭证可查看 6.万能验证码 7.前端验证登录结果 8.任意用户密码找回/重置 9.未授权 ...

  9. WEB攻防-通用漏洞水平垂直越权购买逻辑漏洞

    目录 水平垂直越权 水平越权 垂直越权 访问控制原理 漏洞判别 防护 购买逻辑漏洞 知识点 详细介绍 防护 案例演示-优惠券 案例演示-CMS-订单修改 水平垂直越权 水平越权 同级用户权限共享--- ...

  10. 网络安全菜鸟学习之漏洞篇——逻辑漏洞(二)

    上篇文章我们学习了逻辑漏洞中的水平越权,这篇文章我们来学习垂直越权. 其实垂直越权也很简单.所谓的垂直越权就是通过一个普通用户去执行一个高权限用户的功能.因为他们的权限是有层次差的,所以被称为垂直越权 ...

最新文章

  1. 这7款APP到底有什么好,值得知乎2万人点赞,原来如此!
  2. SAP MM 向交货单的存在不阻止PO被删除
  3. 华表 单元格公式设定与计算
  4. Cisco 2950 系列交换机实例配置
  5. RTL行为级仿真、综合后门级功能仿真和时序仿真
  6. Java:使用Fork / Join框架的Mergesort
  7. rtrim php,php rtrim() 格式化中文问题
  8. 安谋中国发布“玲珑”多媒体产品线,首款ISP处理器面世
  9. 重启ADB的bat文件
  10. 【三维建模】基于MATLAB的立体图形三维建模仿真
  11. 百万级别数据库优化方案
  12. OpenCV——硬币检测与计数的设计实现
  13. canvas的雨滴特效
  14. 构造方法的作用和特点
  15. 正则表达式匹配行首和行尾
  16. 将字符串“123”转换为十六进制0x123或者十进制123
  17. border-radius的使用
  18. 中国人必须知道的76个常识
  19. [AGC001E]BBQ Hard
  20. 极速pdf文件打印时此计算机未连接到网络,PDF文件不能打印的五种解决方案

热门文章

  1. 深度学习--激活函数之sigmoid激活函数
  2. Sumatra PDF——好用快捷工具介绍及使用
  3. Android 加载数据或者联网等待的弹框动画
  4. 通过ICE轻松部署WES7镜像
  5. 从零开始编译LEDE固件 默认中文material主题_php_sir_新浪博客
  6. 请问如何查一篇外文文献的DOI号?
  7. python qt教程视频 下载_PyQt5开发与实战教程,视频教程下载
  8. livereload_LiveReload
  9. React-CRON表达式生成器
  10. cat3速度 rj45_综合布线当中,CAT8网线开始渐入佳境