# 14.逻辑漏洞 ## 1. 业务逻辑漏洞 #### 1.1 漏洞成因 逻辑错误漏洞是指由于程序逻辑不严谨或逻辑太复杂,导致一些逻辑分支不能够正常处理或处理错误。通俗地讲,一个系统的功能太多后,程序开发人员难以思考全面,对某些地方可能有遗漏,或者未能正确处理,从而导致逻辑漏洞。逻辑漏洞也可以说是程序开发人员的思路错误、程序开发人员的逻辑存在漏洞。 #### 1.2 特性 逻辑漏洞非常隐蔽,危害巨大,且无法被 WAF 等安全设备拦截。逻辑漏洞覆盖面很广,一直以来对于逻辑漏洞尚未产生明确的分类。其大致包括了:绕过功能限制、遍历、越权、弱口令、信息泄漏、任意用户密码重置、竞争性问题等。在一些场景下,由于功能本身设计复杂、易于出现纰漏,导致针对特定场景下的特定逻辑漏,如支付漏洞、验证码绕过漏洞等。 ## 2. 账户 ### 2.1 注册账户 #### 2.1.1 注册覆盖 注册重复用户名对用户数据进行覆盖 #### 2.1.2 注册遍历 进行注册的时候注册重复的用户名会提示用户名已被注册,我们可以利用该方法猜测用户名。如果可以批量提交,将会产生严重问题。 ### 2.2 登陆账户 #### 2.2.1 登陆认证绕过 ##### 2.2.1.1 直接访问登陆后的界面 一般登陆界面登陆成功后会进行跳转到主页面,例如:main.php。但是如果没有对其进行校验的话,可以直接访问主页面绕过了登陆认证。 ##### 2.2.1.2 前端认证 登陆状态如果只以登陆状态码进行判断登陆成功标识,那么修改登陆状态码就能进行登录。 ##### 2.2.1.3 暴力破解 暴力破解,又叫撞库、穷举,使用大量的字典逐个在认证接口尝试登录,理论上,只要字典足够强大,破解总是会成功的。 撞库:黑客从别的站点获取到用户名和密码,然后用于爆破别的系统。 阻止暴力破解的最有效方式是设置复杂度高的密码(英文字母大小写、数字、符号混合)并且同时设置验证码使其无法批量提交数据。 靶场地址:dvwa 打开 burpsuite 抓包 输入任意用户名和密码,点击 login ![image-20240420171416733](14.逻辑漏洞/image-20240420171416733.png) 将抓到的包发送到 Intruder 模块 ![image-20240420171422339](14.逻辑漏洞/image-20240420171422339.png) Clear 原来的 tag,选择 Cluster bomb 模式 ![image-20240420171427218](14.逻辑漏洞/image-20240420171427218.png) 为 username 和 password 添加 tag ![image-20240420171433746](14.逻辑漏洞/image-20240420171433746.png) 设置 payload,加载字典,设置完成后点击 Start Attack ![image-20240420171438669](14.逻辑漏洞/image-20240420171438669.png) 根据长度判断用户名密码应该是 admin/password ![image-20240420171444655](14.逻辑漏洞/image-20240420171444655.png) ##### 2.2.1.4 身份凭证可伪造 当用户登录后,在服务器就会创建一个会话(session),叫做会话控制,接着访问页面的时候就不用登录,只需要携带对应的 cookie 去访问。如果 cookie、session 等代表用户身份的凭证被设置的过于简单,或者有一定规律,就可以被黑客猜测出来,从而修改、伪造身份。 靶场地址:DVWA Low:cookie 里面有一个 dvwaSession 的字段,点一下 Generate value 就 +1 ![image-20240420171449462](14.逻辑漏洞/image-20240420171449462.png) Medium:dvwaSession 是个时间戳 ![image-20240420171454112](14.逻辑漏洞/image-20240420171454112.png) High:dvwaSession 是经过 md5 加密的,但是过于简单可被破解 ![image-20240420171458368](14.逻辑漏洞/image-20240420171458368.png) ![image-20240420171503877](14.逻辑漏洞/image-20240420171503877.png) #### 2.2.2 验证码 ##### 2.2.2.1 图形验证码 ###### 2.2.2.1.1 前端可以获取验证码 验证码直接出现在 html 源码中或者隐藏在 Cookie 中,或者验证码使用前端校验 靶场地址:pikachu 查看前端 JS 源码,发现验证码是使用的前端 JS 校验,**前端校验等于没有校验**,解法有如下几种: - 因为验证码是前端校验的,可以抓包删除掉验证码 抓取登录包,发送到 Repeater 模块 ![image-20240420171509538](14.逻辑漏洞/image-20240420171509538.png) 删除掉验证码,重放,发现返回包的长度和删除验证码之前是一样的 ![image-20240420171514123](14.逻辑漏洞/image-20240420171514123.png) 删除掉验证码,重放 ![image-20240420171518931](14.逻辑漏洞/image-20240420171518931.png) - 直接删除掉 JS 代码或者禁用 JS - ###### 2.2.2.1.2 **图形验证码可识别** 这种验证码由于没有对其做模糊处理,导致可以利用脚本直接识别 1. OCR 识别 2. xp_CAPTCHA 4.2 - Burp验证码识别插件 免费版:[https://github.com/smxiazi/NEW_xp_CAPTCHA](https://github.com/smxiazi/NEW_xp_CAPTCHA) 收费版:[https://github.com/smxiazi/xp_CAPTCHA](https://github.com/smxiazi/xp_CAPTCHA) ###### 2.2.2.1.3 验证码重复利用 有的网页只要不刷新,验证码就能重复被利用。通常情况下,系统会比对 session 和用户输入的验证码值,当服务器端受理请求后,没有将上一次保存的 session 及时清空,将会导致验证码可重复使用 修复建议:当服务器端处理完一次用户提交的请求之后,及时将 session 域中的验证码清除,并生成新的验证码。 靶场地址:pikachu 使用 burpsuite 抓包,开启 Intercept ![image-20240420171523440](14.逻辑漏洞/image-20240420171523440.png) 将抓到的包发送到 Repeater 模块,反复重放,发现返回包长度并没有变化,页面提示也是用户名或密码不存在,猜测验证码可以反复使用 ![image-20240420171527313](14.逻辑漏洞/image-20240420171527313.png) ![image-20240420171530979](14.逻辑漏洞/image-20240420171530979.png) 将抓到的包发送到 Intruder 模块进行爆破 ![image-20240420171535749](14.逻辑漏洞/image-20240420171535749.png) 跑出密码为 123456 ![image-20240420171540106](14.逻辑漏洞/image-20240420171540106.png) ##### 2.2.2.2 短信验证码 1. 短信验证码可重复利用 如果服务端未对短信验证码的验证时间/次数进行限制,那么我们就可以利用其进行爆破。 此处测试方法等同图片验证码的测试 2. 短信验证码与用户未绑定 一般来说短信验证码仅能供自己使用一次,如果验证码和手机号未绑定,那么就可能出现如张三的手机的验证码,李四可以拿来用的情况。 修复建议: 作为一个安全的短信验证码,他的设计要求应该满足如下几点: 用户获取的短信验证码只能够供自己使用 用户短时间内获取的多条短信只有最新的一条能使用 短信验证码设置为6位数,有效期30分钟甚至更短,当验证码失败3次后失效。 ### 2.3 密码找回/修改 找回密码的验证码为四位数字可爆破真实验证码; 采用本地验证,可以先尝试修改自己的帐号密码,保存正确的返回包,然后修改他人密码的时候替换返回包; 最终修改密码的数据包,以另外的ID作为身份判断(例如userid),而该ID在别处可以获取到; 接受验证码的手机号修改为自己的号码,然后输入自己的号码接收到的验证码去进行密码重置; 获取验证码的时候,会生成一个身份标识(例如cookie值),那么我们就替换他人账号的身份标识重置他人的密码; #### 2.3.1 找回密码 ##### 2.3.1.1 短信找回密码 类似短信验证码可以重复使用,攻击者就可以修改用户的密码。短信验证码未与用户绑定,攻击者可以利用其他用户的包来修改本用户的密码。 ##### 2.3.1.2 用户名找回密码 随便输入一个用户他有一个包检验用户是否存在,这里回显了用户全部信息。 这里的问题在于查询用户处,回显了多余的个人信息。 ##### 2.3.1.3 邮箱找回密码 如果邮件中的重置密码链接未使用 token参数让链接具有唯一性,或者是 token 可预测,会导致链接可以直接被猜解访问。重置时验证码过于简单,如纯 4 位数字,则容易遭受验证码被穷举风险。 ###### 2.3.1.3.1 cms 实战 靶场地址:semcms 源码分析 lnlq_Admin/index.html 文件 从代码可以看到,当点击登录按钮旁边的链接"如果忘记账号与密码,试试找回?",时,会执行 js 的 views() 函数,该函数是弹出一个对话框并向SEMCMS_Remail.php?type=find 发送请求,让用户填写要接收重置后密码的邮箱地址 ![image-20240420171550365](14.逻辑漏洞/image-20240420171550365.png) ![image-20240420171554600](14.逻辑漏洞/image-20240420171554600.png) 点击确认找回,提交到了这个 URL ```php ../Include/web_email.php?type=fintpassword ``` 查看找回密码的代码,代码会根据用户输入的 E-mail 地址,查找 sc_user 表,看是否存在使用该 E-mail 地址的用户,如果存在,则随机生成 4 位数的认证码,并将其拼接到一个密码重置链接中,最后以邮件的形式发送给用户。用户点击邮件中的密码重置链接即可;但如果不存在,则弹出对话框,提示“此邮箱不存在!” ![image-20240420171558530](14.逻辑漏洞/image-20240420171558530.png) 认证码是随机的四位纯数字,很容易联想到爆破,但是每次重新进入到这里的时候认证码就会随机生成,难以利用。再回到 index.html 中 ![image-20240420171602965](14.逻辑漏洞/image-20240420171602965.png) 当请求参数 type=ok 时,SEMCMS_Remail.php 后面跟的参数 type 也是ok,而前面提到,这种情况下,SEMCMS_Remail.php 会构造另外一个表单,如下: ![image-20240420171606841](14.逻辑漏洞/image-20240420171606841.png) 点击确认找回按钮,数据提交到 ```php ../Include/web_email.php?type=findok ``` web_email 部分密码找回部分的代码如下 ![image-20240420171613007](14.逻辑漏洞/image-20240420171613007.png) 密码是经过 md5 加密后才存入数据库的,但是如果认证码正确就能将密码改掉。尝试使用 burpsuite 爆破这里的认证码从而修改掉密码 查看数据库,原先的密码是 1234 ![image-20240420171622305](14.逻辑漏洞/image-20240420171622305.png) ![image-20240420171628137](14.逻辑漏洞/image-20240420171628137.png) 使用 burpsuite 跑包,抓取重置密码的包,验证码处添加 tag,进行爆破 ![image-20240420171632421](14.逻辑漏洞/image-20240420171632421.png) 验证码正确与否,返回包长度和状态码都是一样的 ![image-20240420171637829](14.逻辑漏洞/image-20240420171637829.png) 查看数据库,密码已经变成了我们改的数据 11111 ![image.png](https://cdn.nlark.com/yuque/0/2023/png/35303923/1691291620874-b1ef8812-0a41-4729-94ed-c3fbb4f32863.png#averageHue=%23ebe6e5&clientId=u360bff62-327d-4&from=paste&height=60&id=u5ae09c58&originHeight=90&originWidth=1519&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=26989&status=done&style=none&taskId=u511f84bb-170b-4309-9ff8-ccd444bac01&title=&width=1012.6666666666666) ![image-20240420171642623](14.逻辑漏洞/image-20240420171642623.png) ##### 2.3.1.4 越权修改密码 有时候开发再写代码时,会直接用到某一参数直接调取该参数对应的数据,而再调用时并不考虑当前登陆用户是否有权限调用。这就导致了,可以利用抓该包工具,将传递给后台的数据进行修改,修改后可以查看原本自己没有权限看到内容。 ##### 2.3.1.5 修改密码未验证旧密码 修改密码前应该先对用户身份进行再次校验,如验证旧密码。 ## 3. 交易 ### 3.1 购买 #### 3.1.1 支付逻辑漏洞 ##### 3.1.1.1 靶场练习 靶场地址: 访问 niushop,登录。选择任意一件商品购买,提交订单。 ![image-20240420171647789](14.逻辑漏洞/image-20240420171647789.png) 打开 burpsuite,再选择一件商品,开启 intercept 拦截数据包,点击立即购买,将数量改为 0.001 ![image-20240420171654898](14.逻辑漏洞/image-20240420171654898.png) 数量真的变成了 0.001,相应价格也变成了 0.1 元 ![image-20240420171700237](14.逻辑漏洞/image-20240420171700237.png) 点击提交订单,生成一个价格为 0.1 的订单。点击去支付 ![image-20240420171706628](14.逻辑漏洞/image-20240420171706628.png) 记下支付流水号 ![image-20240420171710920](14.逻辑漏洞/image-20240420171710920.png) 回到刚刚第一个数量正常的订单,开启 intercept 拦截数据包,点击去支付 ![image-20240420171716977](14.逻辑漏洞/image-20240420171716977.png) 将此处的支付流水号改为刚刚我们记录下来的流水号 ![image-20240420171720892](14.逻辑漏洞/image-20240420171720892.png) 放包,发现支付流水号变成了刚刚的,订单金额也变成了 0.1 ![image-20240420171725159](14.逻辑漏洞/image-20240420171725159.png) ## 4. 越权 ### 4.1 未授权访问 ### 4.2 越权访问 该漏洞是指应用在检查授权时存在纰漏,使得攻击者在获得低权限用户账户后,利用一些方式绕过权限检查,访问或者操作其他用户或者更高权限。越权漏洞的成因主要是因为开发人员在对数据进行增、删、改、查询时对客户端请求的数据过分相信而遗漏了权限的判定。越权访问漏洞主要分为水平越权访问和垂直越权访问。 #### 4.2.1 水平越权 定义:水平越权就是相同级别(权限)的用户或者同一角色的不同用户之间,可以越权访问、修改或者删除的非法操作。 危害:如果出现此类漏洞,那么可能会造成大批量数据泄漏,严重的甚至会造成用户信息被恶意篡改 挖掘思路:替换鉴权参数,定位出鉴权参数,然后替换为其他账户鉴权参数的方法来发现越权漏洞 假设用户A和用户B属于同一角色,拥有相同的权限等级,他们能获取自己的私有数据(数据A和数据B),但如果系统只验证了能访问数据的角色,而没有对数据做细分或者校验,导致用户A能访问到用户B的数据(数据B),那么用户A访问数据B的这种行为就叫做水平越权访问。 ##### 4.2.1.1 靶场练习 靶场地址:pikachu 先登录,点击提示有用户名和密码 ![image-20240420171731803](14.逻辑漏洞/image-20240420171731803.png) 登录了 lucy 的号,查看个人信息 ![image-20240420171736303](14.逻辑漏洞/image-20240420171736303.png) 将名字改成 lili,个人信息也变成 lili 的了 ![image-20240420171740888](14.逻辑漏洞/image-20240420171740888.png) #### 4.2.2 垂直越权 垂直越权是一种“基于URL的访问控制”设计缺陷引起的漏洞,又叫做权限提升攻击。 由于后台应用没有做权限控制,或仅仅在菜单、按钮上做了权限控制,导致恶意用户只要猜测其他管理页面的URL或者敏感的参数信息,就可以访问或控制其他角色拥有的数据或页面,达到权限提升的目的。 ##### 4.2.2.1 靶场练习 登录管理员用户 ![image-20240420171745378](14.逻辑漏洞/image-20240420171745378.png) 管理员有添加用户功能 ![image-20240420171749969](14.逻辑漏洞/image-20240420171749969.png) 尝试添加一个用户 ![image-20240420171753827](14.逻辑漏洞/image-20240420171753827.png) 用 burpsuite 抓取添加用户的包并且发送到 repeater ![image-20240420171757804](14.逻辑漏洞/image-20240420171757804.png) 退出管理员用户,登录普通用户,抓取普通用户的 cookie,并且替换刚刚抓取的修改密码的包的对应 cookie 位置 ![image-20240420171801890](14.逻辑漏洞/image-20240420171801890.png) 重放 ![image-20240420171806743](14.逻辑漏洞/image-20240420171806743.png) 以普通用户身份添加用户成功 ![image-20240420171811328](14.逻辑漏洞/image-20240420171811328.png) ##### 4.2.2.2 cms 实战 靶场地址:熊海 cms [http://d22.s.iproute.cn/admin/?r=login](http://d22.s.iproute.cn/admin/?r=login) 源码分析,如果 cookie 为空,则跳转到登录页面 ![image-20240420171815533](14.逻辑漏洞/image-20240420171815533.png) 访问靶场,右键检查,查看 cookie,此处 cookie 为空,尝试伪造任意一个 cookie ![image-20240420171819588](14.逻辑漏洞/image-20240420171819588.png) 可以直接访问 [http://d22.s.iproute.cn/admin/?r=index](http://d22.s.iproute.cn/admin/?r=index) 读取后台内容 ![image-20240420171824110](14.逻辑漏洞/image-20240420171824110.png) 如果将 cookie value 改成 admin,能够以管理员身份访问 ![image-20250619150207776](14.逻辑漏洞/image-20250619150207776.png)