首页
社区
课程
招聘
[原创]Web登录安全隐患分析和POC
2012-9-28 22:00 27946

[原创]Web登录安全隐患分析和POC

2012-9-28 22:00
27946
这篇贴主要是分析了亚马逊,支付宝等登陆设计。指出登陆信息被截获并且用于重放攻击可能性,指出登陆设计存在改进空间。附近中是POC(Proof of Concept)程序,在浏览器内部抓取POST登陆信息,保存在c:\hijackhttp.txt中,亚马逊,支付宝的登陆信息可以明文重现。

正文

OWASP对web登录设计给出的建议包括密码要具有一定的长度和复杂度,正确的登录提示,始终使用TLS加密通道传输密码防止密码被截获等。参考:https://www.owasp.org/index.php/Authentication_Cheat_Sheet
但是仅仅是加密通道传输登陆信息仿佛还是不够,因为即使是通过TLS加密的传输的登录信息也可能被截获。

登陆case分析:

首选看几个站点的登陆设计。
1.        亚马逊
亚马逊将用户登陆信息用户名和密码使用https传输。这里从截获的数据中可以清楚的看到登录email和相应的password。


2.        看雪论坛http://bbs.pediy.com/login.php?do=login
看雪论坛使用http明文传输登录信息,password做了一次MD5运算。由于MD5是不可逆的,理论上无法推出password。但对于黑客来说其实无需知道password具体是多少,用password的MD5值构造一个数据包模拟发送给服务器,同样可以收到有效的cookie信息成功登陆。这就是所谓的重放攻击。下图是登陆数据包,202cb962ac59075b964b07152d234b70是密码123的MD5值。


3.        淘宝/支付宝
淘宝,支付宝的非控件登陆和亚马逊的相同。直接将用户名和密码等登陆信息使用https传输。使用控件登陆时password进行了加密处理,但是经过分析得知控件加密时密钥是固定,只要password相同,加密后的密文永远不变。这意味着即使password被加密了,也不能抵御重放攻击。经过试验利用抓取的password密文构造数据包模拟登陆,确实可以登陆成功。



以上web登陆设计主要问题在于不能抵御重放攻击,一旦登陆信息被截取就可以被利用来登陆。像支付宝一控件登陆一样的,密钥永远不变的加密没任何意义。支付宝登陆密码加密,亚马逊登陆密码明文,他们的安全性相同,攻击利用难度相似。
然而遗憾的是登陆数据包是可以被截获的,即便使用了https加密通道。

截获数据包的方法

方法一:架设代理服务器比如Burp Proxy,然后设置浏览器使用代理服务器。这样浏览器所有的http以及https数据都会被Burp Proxy代理截获,并且可以查看https解密后的明文数据。当https数据被截获后,浏览器会验证主机的证书,证书验证不通过时浏览器会发出访问安全警告阻止用户继续访问。所以这种方法通常用于http和https数据包分析。Firefox的代理设置:



方法二:注入代码到浏览器进程中,从浏览器内部截取明文登陆数据。Firefox使用函数Pr_write()发送http数据,IE使用函数HttpSendRequest()发送http数据。只有hook相关函数就可以截取到http/https的明文数据。
我以Firefox为例做了实验,可以抓取网站的登陆信息。实验工具在附件中,有兴趣的可以自己测试。
Hook Pr_write。虽然网上有很多hook库,但都不够稳定。微软detours库是最好用最稳定的hook库。Hook Pr_write时不能简单替换前5个字节,因为它前2条指令并不是5个字节。Detours会反编译相关指令然后根据需要替换不通长度字节的指令,稳定性好。
中国大部分电脑上都装有360杀毒,而貌似360对各个代码注入路径都防的很死。进程注入不了,就改注入文件。修改firefox.exe或者相关DLL的PE导入表,从而加载hook的DLL. 附件中setdll.exe是命令行工具可以将指定DLL加入到PE文件导入表中。

改进方法:

一家韩国游戏公司的登陆设计可以用来参考。登陆地址https://nid.naver.com/nidlogin.login
他的登陆过程分为两步, 首先从www.nid.naver.com/login/ext/keys.nhn 获取公钥加密key
然后利用上一步得到的key加密用户名和密码,提交加密后的用户名和密码到www.nid.naver.com/nidlogin.login。由此得到的登陆信息是动态变化的,不可重放。

[培训]《安卓高级研修班(网课)》月薪三万计划

上传的附件:
收藏
点赞2
打赏
分享
最新回复 (30)
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
IBMLover 2012-9-28 22:49
2
0
不得不顶!!楼主的思路值得借鉴!
雪    币: 3474
活跃值: (236)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
hoyer 2012-9-28 23:03
3
0
图挂了? 字节补丁
雪    币: 389
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
plgs 2012-9-29 08:31
4
0
留名mark
雪    币: 194
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xScorpion 2012-9-29 09:01
5
0
技术、思维、文笔都牛X
雪    币: 264
活跃值: (194)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lsmjj 2012-9-29 09:05
6
0
没想到这么不安全
雪    币: 72
活跃值: (60)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
后恋 2 2012-9-29 09:58
7
0
https解密是怎么回事?能解密?没搞懂。
雪    币: 72
活跃值: (60)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
后恋 2 2012-9-29 10:00
8
0
Burp Proxy 抓取的包属于应用层级的包,是在本机做实验,可能会抓取到明文包,如果是在局域网路,混淆模式抓包,https应该是不可能明文,也不可能被解密的。如果验证可以本机wireshark抓包,才能确定是不是明文。
雪    币: 1740
活跃值: (584)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
cmdxhz 1 2012-9-29 12:40
9
0
图片怎么全部挂了·!?
雪    币: 20
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
疯子·修 2012-9-29 12:43
10
0
楼主说的方法好像没说HTTPS解密吧,只是说代码重放吧,没必要去解密,网站都是通过一个端口与服务器连接的,只要保正发送到服务器的验证信息是对的,那么,不管你在本机上是否使用了正确的帐号密码,服务器都会反回正确的信息吧!
     就像通关文碟一样,它产生的过程城门守卫不会去管,不管谁拿到那个通关文碟,只要服务器没确证通关文碟与持碟人是否是对应的,那么,守卫对于持有通关文碟的人就只能放行,而且守卫还不会有任何感觉意外,只会把他当成一个正常的过客进行处理。
     不过参考的解决方法很有趣,呵。。。分两次,第一次以不同的机器来分配不同的密钥,第二次才验证,而且第一次的密钥不接收还不行,不接收服务器就真接PASS了~
雪    币: 8820
活跃值: (2364)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 10 2012-9-29 13:09
11
0
其实只要能运行,有权限注入能hook,什么RSA动态key也没用,直接接受时本地给替换丫pubkey,然后发送时解密开然后再用官方的动态key加密发就好了~浮云啊~
只要能运行,能注入ok,能hook,别说web登录了,就客户端登录也一样,唉~
雪    币: 321
活跃值: (113)
能力值: ( LV15,RANK:280 )
在线值:
发帖
回帖
粉丝
ctaotao 6 2012-9-29 14:58
12
0
在网络上截获的https数据本身无法解密,比如wireshark抓https,密文,无解!
网络代理原理不一样,浏览器显示跟代理协商密钥,然后把数据发送给代理,代理解密数据后,再和真正的服务器协商密钥,最后把浏览器的数据发送给真正服务器。这个过程中代理当然能看到https中的密文数据了,不管代理是在本机还是在网络中。
雪    币: 321
活跃值: (113)
能力值: ( LV15,RANK:280 )
在线值:
发帖
回帖
粉丝
ctaotao 6 2012-9-29 15:03
13
0
是的,基于username/password的登陆认证没有完美安全的解决方案。所以OWASP说的是需要Multiple-Factors. 我这贴是想说登陆数据能抓取,能被利用,警钟长鸣
雪    币: 73
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kingcomer 2012-9-29 19:23
14
0
又长见识了~~
雪    币: 962
活跃值: (1496)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
loqich 2012-9-29 19:39
15
0
https重放不了吧?这里指的是要注入dll到ie进程中抓取数据, 我觉得没意义,无论你用什么方法,在内存中总有某一时刻是明文,能被Hook抓取的
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
spide 2012-9-30 00:39
16
0
楼主说的其实是一种密码验证方式,本质是在客户端就使用了md5散列进行密码验证,虽然解决了传输途中的加密,但是这样做的风险在于如果有人知道了密码的md5,那么他不需要破解该md5,直接使用md5散列值即可伪造cookie。针对这样的方式,其实服务器端可做salt,通过salt+md5 password的方式对其进行验证即可
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
uwmnth 2012-9-30 01:18
17
0
那楼主你说,有的网页你存他书签就可以登录,地址本身就包含密码,相当于密码,如果可以截取包,只要截取了链接就是可以登录的?不知道是不是这么回事?别告诉我链接也可以加密。
雪    币: 8820
活跃值: (2364)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 10 2012-9-30 02:32
18
0
md5如果是通过js计算的话,还是可以hook出来明文密码的~
反正用某些人常说的话:能运行能hook了,什么都是爆弱的~
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
spide 2012-9-30 12:04
19
0
并不是谁的机器都是那么容易被hook的!如果真的那样了,那这个世界就太可怕了
雪    币: 321
活跃值: (113)
能力值: ( LV15,RANK:280 )
在线值:
发帖
回帖
粉丝
ctaotao 6 2012-10-1 11:09
20
0
请大家关注一下重点。不管登陆数据时怎样被截获,代理截获也好,hook截获也吧。
我关心的是现有大部分登陆设计,一但登陆数据被截获就很容易被重放利用。为什么不加大攻击利用难度呢? 安全无绝对,谁都不能保证百分百的安全,只能说是提供攻击难度和成本。很明显case韩国游戏登陆的安全性要高,利用难度更大。
再想想有多少从来没有过中病毒,病毒进入个人电脑的途径多了去,Oday漏洞经常在报,安装不明来源的破解安装包。一但进入电脑,修改注册表实现代理截获,修改普通的exe,dll实现hook很容易。在360的保护中,进程hook不容易,修改PE实现hook还是很容易的。
雪    币: 321
活跃值: (113)
能力值: ( LV15,RANK:280 )
在线值:
发帖
回帖
粉丝
ctaotao 6 2012-10-1 11:19
21
0
其实MD5+salt是理论上很好的方法,存在的问题就是你所说的某一时刻,明文依旧可以被hook获取。这时候就需要利用安全控件来解决问题了。支付宝安全控件登陆,无法抓取明文。所以MD5+SALT+安全控件是一个方案。
支付宝的问题是不需要抓取他的密码明文,因为他是固定密钥加密,密文密码永远不变,重放可行。
雪    币: 8820
活跃值: (2364)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 10 2012-10-1 22:20
22
0
支付宝的安全控件一样可以抓去,支付宝安全控件没用VMP保护自己的菊花,随便hook一下啥都知道了~倒是韩国某游戏的web登录安全控件很到位首先上XX保护,然后自身加强VM壳~~
雪    币: 38
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
troops 2012-10-4 04:36
23
0
mark一下……
雪    币: 46
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xiaocaijk 2012-10-7 20:08
24
0
https,重放的话,也是在本地 ,怎么感觉 意义不大。。想测试下,不在同一台机子,不同ip是否能登录成功~
雪    币: 6
活跃值: (841)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
路易 2013-7-23 19:19
25
0
问题在于不是动态加密,知道密文就可以回放。。这是致命的问题。
游客
登录 | 注册 方可回帖
返回