官方公众号企业安全新浪微博
FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。
FreeBuf+小程序
前言
编写代码就是把一个复杂的进程分解成一些非常简单而又相互独立的逻辑步骤。在所有即使是非常简单的Web应用中,每个阶段会执行非常庞大的逻辑操作。这些逻辑也是一个攻击面,但是与TOP漏洞不同的是,这些逻辑漏洞的每一个似乎都是唯一的,逻辑缺陷没有共有的“指纹”属性,也更加难以发现。
现实中的逻辑缺陷
token加解密可控
并不是指破译,而是在设计程序的过程中,提供了某种破译的机制(例如某个属性采用了和session相同的加解密机制,这个属性却可以在程序中解密出来,我们就可以通过破译和修改session来达到越权的目的)
参数缺失导致的逻辑混乱
当某些设计的极为离谱的应用程序中,可能会存在高权限账户和低权限账户之间的鉴定机制仅仅是依靠某些由用户控制的键值,而在前端页面做输入限制。当抓包修改之后,可能会将普通用户视为管理用户。
在关键功能中探查逻辑缺陷时,尝试轮流删除在请求中提交的每一个参数,包括cookie、查询字符串、POST数据项。
强制浏览
应用程序可以跳过某个步骤,例如跨过支付步骤来到结算页面。
应用程序没有对各个步骤之间的流动做强制限定。想当然的认为用户只会按照程序设定的步骤走,诚然普通用户不会修改数据包,但某些有心人就不一定了。
通常测试一个多阶段过程时,我们可以按照其他顺序提交这些请求,尝试完全省略某些阶段、几次访问同一个阶段或者推后访问前一个阶段。
应用程序的最后一个步骤可能也可以仅仅通过修改某些参数就可以到达。
范围限制
很多web程序在他们的交易过程中都会采用数字限额。但是有些开发者仅仅对输入的上限做了限定而没对输入的下限做限定。
例如财务人员仅仅只能处理10000美元账务,而超过10000美元的账务则需要向项目经理申请,若是没有对负数做出一个限定,可能在转账的过程中出现打钱过去钱没少反而多了,以及可以绕过这10000美元的限制的问题。
转义的转义
将程序输入的一些可能对程序结构进行改变的危险字符进行净化,从而防御这种风险。
开发者确信他们的设置方法可以防止注入攻击(只要他们考虑到了每一个可能被攻击者利用的字符)
但若是开发者忘记了对转义字符本身进行转义。
攻击者提交以下输入
foo\;ls
应用程序的输入会变为
foo\\;ls
竞态条件
当两个不同的用户在同一时间登录,就可能会发生错误(极少情况下)。发生错误的根本原因在于,应用程序将与新近通过验证的用户有关的知识符保存在一个静态(非会话)变量中。改写这个值不久后,应用程序再读取这个变量的值,如果这个过程中有另外一个进程写入到变量中,早先登录道的用户就会分配到属于随后登录的用户的会话中。
文件上传中也包含一个条件竞争的漏洞,系统会时刻监控本地文件夹中可疑文件并且进行删除。漏洞的利用原理也是十分简单,当本地的文件在调用的过程中是无法被删除的(受到进程锁保护),我们就一边利用脚本大量发送利用一句话木马,同时利用burpsuite等连接工具不断的访问上传到的文件,当删除的速度没有上传的速度快且碰巧被burpsuite访问到的时候,getshell成功。
一般而言,只有当用户数量足够大、可导致反常现象(顾客上报)发生时,这种条件才会出现。