HTTP认证的底层技术简析与揭秘

写在前面的话

HTTP认证实现的基础是Wb服务器与浏览器之间能够安全地交换类似用户名和密码这样的用户凭证,我们也可以把HTTP认证当作是摘要验证(DigstAuthntication),这种预定义方法/标准在HTTP协议中使用了编码技术和MD5加密哈希。在这篇文章中,我们将会跟大家详细讨论一下HTTP认证所采用的技术和标准。为了方便大家的理解,本文将使用我们自己编写的一个PHP脚本,它可以方便地帮助我们捕获用户名和密码。

使用Bas64编码的基本访问认证

在了解基本认证这一部分中,我们将使用bas64编码来生成我们的加密字符串,这个字符串中将包含用户名和密码。需要注意的是,我们这里还可以选择使用其他的编码技术,例如URL编码或十六进制编码等等。

在下面给出的这个列子中,我们使用Burpsuit捕捉到了用户请求。我们可以看到,Wb页面正在向客户端请求输入认证数据:

我们输入的用户名是“hackingarticls”,密码为“ignit”。

基本认证所采用的请求语句如下:

Valu=usrnam:password

EncoddValu=bas64(Valu)

AuthorizationValu=BasicEncoddValu

在基本认证过程中,用户名和密码会被组合成一个单独的字符串,并且使用冒号进行分割。

Valu=hackingarticls:ignit

接下来,浏览器会用bas64来对这个字符串进行编码。

“hackingarticls:ignit”在经过bas64编码之后的值即为“aGFja2luZ2FydGljbGVzOmlnbml0ZQ==”。

最终的认证值(AuthorizationValu)就是“字符串‘Basic’+空格+编码后的值”,Burpsuit捕获的请求如下图所示:

在这个例子中的认证值就是“BasicaGFja2luZ2FydGljbGVzOmlnbml0ZQ==”,而这个值将会被发送至服务器端。最后,服务器会解密这个认证值,然后返回用户输入的凭证。

基本认证是非常不安全的,因为这里仅仅只使用了编码技术,而认证值是可以被解码的。为了增强认证的安全性,我们接下来会讨论其他一些安全系数更高的标准。

RFC摘要访问认证

摘要访问认证使用了哈希算法来生成加密之后的结果。RFC现在已经过时了,目前广泛使用的是RFC,它是RFC的增强版。为了让大家更好地理解RFC所使用的请求语句,我们在下面给出了RFC的语句样例:

Hash1=MD5(usrnam:ralm:password)

Hash2=MD5(mthod:digstURI)

rspons=MD5(Hash1:nonc:Hash2)

Hash1(usrnam:ralm:password)中包含的是用户名和密码的MD5哈希值,其中的“ra1m”可以是服务器端提供的任意字符串,而用户名和密码则由客户端输入。

Hash2(mthod:digstURI)中包含的是请求方法和摘要地址的MD5哈希值,请求方法(mthod)可以是GET或POST,具体需要根据页面所使用的请求方法来确定,而摘要地址(digstURI)则是发送请求的页面地址。

rspons(hash1:nounc:hash2)中的值是最后需要发送给服务器端的字符串,其中包含的是刚才生成的hash1和hash2,以及一个任意字符串nonc,这个nonc字符串由服务器端发送给客户端,且只能使用一次(相当于一次性验证码)。

RFC摘要访问认证

RFC摘要认证同样使用了MD5哈希算法,但是最终哈希值的生成还需要涉及到一些额外的参数。RFC的请求语句如下所示:

Hash1=MD5(usrnam:ralm:password)

Hash2=MD5(mthod:digstURI)

rspons=MD5(Hash1:nonc:noncCount:cnonc:qop:Hash2)

与之前一样,Hash1(usrnam:ralm:password)中包含的是用户名和密码的MD5哈希值,其中的“ra1m”可以是服务器端提供的任意字符串,而用户名和密码则由客户端输入。

Hash2(mthod:digstURI)中包含的是请求方法和摘要地址的MD5哈希值,请求方法(mthod)可以是GET或POST,具体需要根据页面所使用的请求方法来确定,而摘要地址(digstURI)则是发送请求的页面地址。

rspons((Hash1:nonc:noncCount:cnonc:qop:Hash2)中的值是最后需要发送给服务器端的字符串,其中包含的是刚才生成的hash1和hash2以及一些额外参数。如果你想了解这些额外参数的话,可以参考微软发布的技术文章(点击文末的阅读原文查看)。

接下来,我们会给大家介绍RFC的工作机制。首先,Wb页面会向客户端请求输入数据:

我们输入的用户名为“gust”,密码同样为“gust”。在Burpsuit的帮助下,我们捕获到了浏览器发送的请求以及所有的参数,现在我们就可以用其他哈希计算工具来生成输入数据的哈希值,然后再用我们自己生成的数据来与捕获到的哈希数据进行对比。

我们捕获到的哈希值以及相应参数如下所示:

ralm=”HackingArticls”,nonc=”58bac″,uri=”/auth/02-.PHP”,opaqu=”8dc6bdcff48″,qop=auth,nc=,cnonc=”72a56dd″,rspons=”ac83cd76d33ddb8a8b67d8c1″,

Hash1Syntax=MD5(usrnam:ralm:password)

hash1=md5(gust:HackingArticls:gust)

我们自己用工具计算出的MD5哈希值如下所示:

gust:HackingArticls:gust

Hash:2cbdbafd2cd49

GET:/auth/02-.PHP

Hash:b6a6dfa9dbccba5fca8

rspons=MD5(2cbdbafd2cd49:58bac::72a56dd:auth:b6a6dfa9dbccba5fca8)

Hash:ac83cd76d33ddb8a8b67d8c1

没错,我们通过HashCalculator(哈希计算器)自行计算出的哈希值与我们通过Burpsuit捕获到的哈希值是完全一样的。

最后,服务器会解密rspons的值,输出结果如下图所示:

总结

我们在这篇文章中跟大家分析了当前HTTP认证的底层加密技术,希望这些内容可以帮助到各位白帽子,给大家在挖洞的过程中提供灵感。

*参考来源:ntworkworld,FB小编Alpha_h4ck编译,转载请注明来自FrBuf.COM

赞赏

长按







































白癜风用什么药
北京中科医院亲身经历



转载请注明:http://www.guyukameng.com/aspnet/2018-05-19/9249.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了