OWASP top 10——失效的身份认证和会话管理

弱口令&口令破解

弱口令

弱口令(weak password)没有严格和准确的定义,通常认为容易被别人猜测到或被破解工具破解的口令均为弱口令。弱口令指的是仅包含简单数字和字母的口令。

弱口令危害

1.进入后台修改资料。
2.财务报销。如某企业的财务申请,将现金打入你的卡中。
3.窃取企业内部资料。如OA平台中的文件。
4.获取用户的信息。如通过后台登陆某个用户的账号,把里面的资金转出。
5.实时监控。

防范弱口令

1.不使用空口令或系统缺省的口令,因为这些口令众所周知,为典型的弱口令。
2.口令长度不小于8个字符。
3.口令不应该为连续的某个字符(例如:AAAAAAAA)或重复某些字符的组合。
4.口令应该为以下四类字符的组合,大写字母(A-Z)、小写字母(a-z)、数字(0-9)和特殊字符。每类字符至少包含一个。如果某类字符只包含一个,那么该字符不应该为首字符或尾字符。
5.口令中不应该包含本人、父母、子女和配偶的名字和出生日期、纪念日期、登录名、E-mail地址等等与本人有关的信息。
6.口令不应该为用数字或符号代替某些字母的单词。
7.口令应该易记且可以快速输入,防止他人从你身后很容易看到你的输入。
8.至少90天内更换一次口令,防止未被发现的入侵者继续使用该口令。

个人注意

1.在笔记本或其他地方不要记录口令。
2.向他人透露口令,包括管理员和维护人员。
3.在e-mail或即时通讯工具中不透露口令。
4.离开电脑前,锁定电脑,设置密码。
5.在多个账户之间使用不相同的口令。
6.在公共电脑不要选择程序中可保存口令的功能选项。

口令破解

密码攻击类型

1.唯密文攻击:攻击者仅能获得一些加密过的密文。
2.已知明文攻击:攻击者除了掌握密文,还掌握了部分明文和密文对应关系。
3.选择明文攻击:攻击者知道加密算法,同时能够选择明文并得到所对应的密文。
4.选择密文攻击:攻击者知道加密算法,同时可以选择密文并得到对应的明文。采用选择密文攻击这种攻击方式,攻击者的该攻击目标通常是加密过程使用的密钥。

密码攻击和防御方法

1.穷举攻击法:

穷举攻击法的破解思路是尝试所有的可能以找出明文或者密钥。穷举攻击法可以划分为穷举密钥和穷举明文两类。

为了对抗穷举攻击,现代密码系统设计时往往采用扩大密钥空间或者提高加密、解密算法复杂度。 2.系统分析法:

统计分析法是通过分析明文和密文的统计规律来破解密文的一种方法。统计分析法首先需要获得密文的统计规律,在此基础上,将密文的统计规律与已知的明文规律对照比较,提取明、密文的对应关系,进而完成密文破解。

要对抗统计分析攻击,密码系统在设计时应当着力避免密文和明文在统计规律上存在一致,从而使攻击者无法通过分析密文的统计规律来推断明文内容。

3.数学分析法:

大部分现代密码系统以数学难题作为理论基础。数学分析法是指攻击者针对密码系统的数学基础和密码学特性,利用一些已知量,如一些明文和密文的对应关系,通过数学求解破译密钥等未知量的方法。

cookie伪造&cookie绕过

按照浏览器的约定,只有来自同一域名的cookie才可以读写,而cookie只是浏览器的,对通讯协议无影响。

cookie伪造方法

1.跳过浏览器,直接对通讯数据改写。
2.修改浏览器,让浏览器从本地可以读写任意域名Cookie
3.使用签名脚本,让浏览器从本地可以读写任意域名Cookie
4.欺骗浏览器,让浏览器获得假的域名

预防方法

1.不要在公共场合登录自己重要的用户名和密码。
2.cookie+ip等信息加密。
3.cookie+ip+动态。

越权访问

越权访问分为垂直越权访问和水平越权访问。垂直越权访问是指不同用户级别之间的越权,如普通用户执行管理员用户的权限。水平越权是指相同级别用户之间的越权操作。

漏洞产生

越权访问漏洞产生的原因是Web程序未对用户提交的参数进行权限校验。

如,某个订单系统,用户可以查询自己的订单信息。A用户查询订单时,发送的HTTP请求中包含参数”orderid=A”,订单系统取得orderid后最终会查询数据库,查询语句类似于”select * from tablename where orderid = A“。B用户查询订单时,发送的HTTP请求中包含参数”orderid=B“,系统查询数据库语句类似于”select * from tablename where orderid = B“。正常情况下,每个用户只会查询到自己的订单。但是,当B用户将自己的HTTP请求参数修改为”orderid=A“,那么最终B用户执行的数据库语句变成了”select * from tablename where orderid = A“,导致A的订单信息被B用户获取到了。

漏洞危害

Web应用程序如果存在越权访问漏洞,可能导致以下危害:

1.导致任意用户敏感信息泄露。
2.导致任意用户信息被恶意修改或删除。

安全建议

1.用户登录后,将用户的个人信息存入session中。
2.当后续程序中出现增删改查语句的时候,通过session来唯一确定权限。
3.用户退出之后,记得清理session,设置cookie等。

会话固定

会话固定(Session fixation)是一种诱骗受害者使用攻击者指定的会话标识(SessionID)的攻击手段。这是攻击者获取合法会话标识的最简单的方法。(让合法用户使用攻击者预先设置的sessionID进行登录,从而是Web不再进行生成新的sessionID,从而导致攻击者设置的sessionId变成了合法桥梁。)

会话固定也可以看成是会话劫持的一种类型,原因是会话固定的攻击的主要目的同样是获得目标用户的合法会话,不过会话固定还可以是强迫受害者使用攻击者设定的一个有效会话,以此来获得用户的敏感信息。

攻击步骤

1.攻击者通过某种手段重置目标用户的SessionID,然后监听用户会话状态;
2.目标用户携带攻击者设定的Session ID登录站点。
3.攻击者通过Session ID获得合法会话。

Web接收sessionID机制:

早期浏览器存贮的sessionID容易暴露、使用URL来传送sessionID

首先检查携带cookie是否含有sessionID;若没有则再检查get、post数据中是否含有,若有则使用此数据;没有才会使系统生成一个sessionID发给客户端。(经测试,get与post都不能设置sessionID【也许是被浏览器限制或者被代码本身禁止了吧】)

重置sessionID方式

1.使用客户端脚本来设置Cookie到浏览器。大多数浏览器都支持用客户端脚本来设置Cookie的,例如document.cookie=”sessionid=123”,这种方式可以采用跨站脚本攻击来达到目的。防御方式可以是设置HttpOnly属性,但有少数低版本浏览器存在漏洞,即使设置了HttpOnly,也可以重写Cookie。所以还需要加其他方式的校验,如User-Agent验证,Token校验等同样有效。
2.使用HTML的标签加Set-Cookie属性。服务器可以靠在返回的HTML文档中增加标签来设置Cookie。例如,与客户端脚本相比,对标签的处理目前还不能被浏览器禁止。
3.使用Set-Cookie的HTTP响应头部设置Cookie。攻击者可以使用一些方法在Web服务器的响应中加入Set-Cookie的HTTP响应头部。如会话收养,闯入目标服务器所在域的任一主机,或者是攻击用户的DNS服务器。

这个还有一点要注意,攻击者如果持有的是有效的SessionID,那么防御措施就一定要校验。如攻击者可以先到目标站点登录,获得有效的Session ID,然后再拿这个Session ID去重置目标用户的会话标志,那么这时候用户将会在不知不觉的情况下访问攻击者设定的合法的会话(实际上登录的是攻击者的账号),从而攻击者将有可能获取到目标用户的敏感信息。

防御方法

1.用户登录时生成新的Session ID。如果攻击者使用的会话标识符不是有效的,那么这种方式将会非常有效。如果不是有效的会话标识符,服务器将会要求用户重新登录。如果攻击者使用的是有效的Session ID,那么可以通过校验的方式来避免攻击。
2.大部分防止会话劫持的方法对会话固定攻击同样有效。如设置HttpOnly,关闭透明化Session ID,User-Agent验证,Token验证。

推荐网址:Session攻击与防御

会话劫持

会话劫持(Session Hijack)是一种结合了嗅探以及欺骗技术在内的攻击手段。广义上说,会话劫持就是在一次正常的通信过程中,攻击者作为第三方参与到其中,或者是在数据里加入其他信息,甚至将双方的通信模式暗中改变,即从直接联系变成有攻击者参与的联系。简单的说,就是攻击者把自己插入到受害者和目标机器之间,并设法让受害者和目标机器之间的数据通道变为受害者和目标机器之间存在一个看起来像“中转站”的代理机器(攻击者的机器)的数据通道,从而干涉两台机器之间的数据传输,例如监听敏感数据、替换数据等。由于攻击者已经介入其中,他能轻易知道双方传输的数据内容,还能根据自己的意愿去左右它。这个“中转站”可以是逻辑上的,也可以是物理上的,关键在于它能否获取到通信双方的数据。

会话劫持攻击分类

按会话劫持攻击类型划分:

1.中间人攻击(Man In The Middle,简称MITM)
2.注射式攻击(Injection)

按会话攻击主被动划分:

1.被动攻击
2.主动攻击

被动劫持实际上就是在后台监视双方会话的数据流,从中获得敏感数据;而主动劫持则是将会话当中的某一台主机“踢”下线,然后由攻击者取代并接管会话,这种攻击方法危害非常大,攻击者可以做很多事情,比如“cat etc/master.passwd”(FreeBSD下的Shadow文件)。

原理结构

会话劫持利用了TCP/IP工作原理来设计攻击。TCP使用端到端的连接,即TCP用(源IP,源TCP端口号,目的IP,目的TCP端号)来唯一标识每一条已经建立连接的TCP链路。另外,TCP在进行数据传输时,TCP报文首部的两个字段序号(seq)和确认序号(ackseq)非常重要。序号(seq)和确认序号(ackseq)是与所携带TCP数据净荷(payload)的多少有数值上的关系:序号字段(seq)指出了本报文中传送的数据在发送主机所要传送的整个数据流中的顺序号,而确认序号字段(ackseq)指出了发送本报文的主机希望接收的对方主机中下一个八位组的顺序号。因此,对于一台主机来说,其收发的两个相临TCP报文之间的序号和确认序号的关系为:它所要发出的报文中的seq值应等于它所刚收到的报文中的ackseq的值,而它所要发送报文中ackseq的值应为它所收到报文中seq的值加上该报文中所发送的TCP净荷的长度。

TCP会话劫持的攻击方式可以对基于TCP的任何应用发起攻击,如HTTP、FTP、Telnet等。对于攻击者来说,所必须要做的就是窥探到正在进行TCP通信的两台主机之间传送的报文,这样攻击者就可以得知该报文的源IP、源TCP端口号、目的IP、目的TCP端号,从而可以得知其中一台主机对将要收到的下一个TCP报文段中seq和ackseq值的要求。这样,在该合法主机收到另一台合法主机发送的TCP报文前,攻击者根据所截获的信息向该主机发出一个带有净荷的TCP报文,如果该主机先收到攻击报文,就可以把合法的TCP会话建立在攻击主机与被攻击主机之间。带有净荷的攻击报文能够使被攻击主机对下一个要收到的TCP报文中的确认序号(ackseq)的值的要求发生变化,从而使另一台合法的主机向被攻击主机发出的报文被被攻击主机拒绝。TCP会话劫持攻击方式的好处在于使攻击者避开了被攻击主机对访问者的身份验证和安全认证,从而使攻击者直接进入对被攻击主机的的访问状态,因此对系统安全构成的威胁比较严重。

会话劫持步骤

1.找到一个活动的会话

会话劫持的第一步要求攻击者找到一个活动的会话。这要求攻击者嗅探在子网上的通讯。攻击者将寻找诸如FTP之类的一个已经建立起来的TCP会话。如果这个子网使用一个集线器,查找这种会话是很容易的。一个交换的网络需要攻击者破坏地址解析协议。

2.猜测正确的序列号码

下一步,攻击者必须能够猜测正确的序列号码。请记住,一个基本的TCP协议设计是传输的数据的每一个字节必须要有一个序列号码。这个序列号用来保持跟踪数据和提供可靠性。最初的序列号码是在TCP协议握手的第一步生成的。目的地系统使用这个值确认发出的字节。这个序列号字段长度有32个字节。这就意味着可能有大约4,294,967,295个序列号。一旦这个序列号一致,这个账户就会随着数据的每一个字节逐步增加。

3.把合法的用户断开

一旦确定了序列号,攻击者就能够把合法的用户断开。这个技术包括拒绝服务、源路由或者向用户发送一个重置命令。无论使用哪一种技术,这个目的都是要让用户离开通讯路径并且让服务器相信攻击者就是合法的客户机。

如果这些步骤取得成功,攻击者现在就可以控制这个会话。只要这个会话能够保持下去,攻击者就能够通过身份验证进行访问。这种访问能够用来在本地执行命令以便进一步利用攻击者的地位。

预防和检测

处理会话劫持问题有两种机制:预防和检测。预防措施包括限制入网的连接和设置你的网络拒绝假冒本地地址从互联网上发来的数据包。

加密也是有帮助的。如果你必须要允许来自可信赖的主机的外部连接,你可以使用Kerberos或者IPsec工具。使用更安全的协议,FTP和Telnet协议是最容易受到攻击的。SSH是一种很好的替代方法。SSH在本地和远程主机之间建立一个加密的频道。同时,有些网站也用Https代替Http协议。Https在本地和远程主机之间建立一个加密的频道。通过使用IDS或者IPS系统能够改善检测。交换机、SSH等协议和更随机的初始序列号的使用会让会话劫持更加困难。此外,网络管理员不应该麻痹大意,有一种安全感。虽然会话劫持不像以前那样容易了,但是,会话劫持仍是一种潜在的威胁。允许某人以经过身份识别的身份连接到你的一个系统的网络攻击是需要认真对付的。

密码找回

互联网中,有用户注册的地方,基本就会有密码找回的功能。而密码找回功能里可能存在的漏洞,很多程序员都没有想到。而这些漏洞往往可能产生非常大的危害,如用户账号被盗等。

思维导图

检测方式

1.密码找回的凭证太弱,如只需要填入一个四位或者六位的纯数字就可以重置密码,导致暴力破解。
2.密码找回凭证可从客户端直接获取。在密码找回时注意抓包查看所有url返回响应等,看是否有最终的凭证出现,这样就可以绕过手机或者安全邮箱了。
3.密码找回凭证在页面中可以直接获取。如,找回密码的答案在网页源代码中…
4.密码找回凭证可以比较容易的猜出。
5.密码找回凭证存并非只是与单个用户并绑定的问题。找回密码凭证发到邮箱中,url中包含用户信息以及凭证,但是这个凭证可以重置任意用户。
6.用户找回密码的邮箱地址或者手机号被修改。这个其实应该是绑定安全手机的逻辑问题,导致任意用户绑上自己可控的安全手机,然后就可以重置任意人的手机号码了。
7.在最后提交修改密码处的逻辑错误。在重置密码处跟随一个用户ID,改成其它用户的ID,即可把其它用户改成你刚刚修改的密码。

修复方案

找回密码凭证够复杂并且不可猜测,同时注意以上逻辑问题,不可存在越权,或者重要的凭证在不该出现的地方出现。

验证码安全

验证码实现原理

1.客户端发起一个请求。
2.服务端响应并创建一个新的SessionID同时生成一个随机验证码。
3.服务端将验证码和SessionID一并返回给客户端。
4.客户端提交验证码连同SessionID给服务端。
5.服务端验证验证码同时销毁当前会话,返回给客户端结果。

验证码安全问题

1.验证码有客户端js生成并且仅仅在客户端用js验证。
2.验证码输出在html中。
3.验证码输出在cookie中。
4.验证码不过期,没有及时销毁会话导致验证码复用。
5.验证码灭有进行非空判断。
6.产生验证码问题集内的答案非常有限。
7.设计缺陷。
8.万能验证码。
9.验证码太简单,容易被机器识别。

推荐网址:验证码安全那些事 验证码的前世今生

业务执行乱序

部分网站逻辑可能是先A过程后B过程然后C过程最后D过程。

用户控制着他们给应用程序发送的每一个请求,因此能够按照任何顺序进行访问。于是,用户就从B直接进入了D过程,就绕过了C。如果C是支付过程,那么用户就绕过了支付过程而买到了一件商品。如果C是验证过程,就会绕过验证直接进入网站程序了。