URL 的黑魔法,还能用机制数表示

转载文章,原文来源: https://juejin.cn/post/695413...

目录

  1. 连接的构成
  2. 浏览器如何对 URL 进行解析
  3. 测试的例子
  4. 连接只能固定格式吗?
  5. 连接真的只是你看到的那样吗

1. 连接的构成

  • 第一部分:协议名(以单个冒号结束) ,如http、https、ftp(少见)等等
  • 第二部分:用户信息 也就是帐号密码!(登录ftp时经常使用)
  • 第三部分:主机名(也就是域名)
  • 第四部分:端口
  • 第五部分:查询,?号后的内容是查询!
  • 第六部分:片断ID(是不会发送到服务器的!)

ftp连接:我最经常使用的一个,ftp://ftp.ncbi.nlm.nih.gov/genomes/refseq/ 打开访达html

片断ID:假若有个名为 example.html 的文档中包含一个 id 属性值为 myelement 的元素,那么使用 example.html#myelement 这个 URL 便可直接导航至该元素,该 URL 中的 #myelement 即称为 URL 片断标志符。简单来讲就是锚点。web

2. 浏览器对 URL 的解析

1. 提取协议名称

查找第一个: ,:在哪里,那 :前面的就是协议名,若是在协议中获取了不应获取的字符,那么将认为这是一个相对的 URL ,并非一个协议名。浏览器

2. 去除层级url标记符

字符串//应该算跟在协议名后面的,若是发现有该字符 则会跳过该字符 若是没有找到便无论了!因此 http:baidu.com 也是能够访问的! 浏览器中还能够用反斜杠 \ 来代替正斜杆,firefox除外!服务器

url解析1.gif

3. 获取受权信息部分

依次扫描url,若是这三个符号中 哪一个先出现便以哪一个为准来截取
/(正斜杠)、?(问号)、#(井号)
从url里提取出来的信息,就算受权部分信息!
除了IE跟safari其余浏览器还接受 ;(分号)也算受权信息部分中可接受的分隔符!xss

  1. 定位登录信息,若是有的话:受权部分信息提取出来后,在截取出来的信息里再来查找 @ 若是找到了 那么他前面的部分即是登录信息!登录信息再查找 : (冒号) 冒号前面的即是帐号 后面即是密码!
  2. 提取目标地址,受权信息部分剩下的即是目标地址了 第一个冒号分开的就算主机名跟端口!用方括号括起来的就是ipv6地址,这也是个特例!

结合以上信息 咱们分析下如下连接:post

ftp://admin:admin@192.168.1.100:21

这样的连接我常常用来登录ftp!这样便会以admin的身份 密码为:admin
ftp协议去登录主机192.168.1.100,端口号是21端口!测试

4. 肯定路径

若是受权部分的结尾跟着一个正斜杆,某些场景里,跟着一个反斜杠或者分号,就像以前提到的,依次扫描下一个? #或字符串结尾符,那个先出现便以哪一个为准!截取出来的部分就是路径信息!最后根据unix路径语义进行规范化整理!网站

5. 提取查询字符串

若是在上一条解析里,后面跟着的是一个问号,便继续扫描下一个 # 或到字符串结尾,哪一个先出现便以哪一个为准!中间的部分即是查询字符串。编码

6. 提取片断ID

若是成功解析完上一条信息,它最后还跟着#号 那么从这个符号到字符串的结尾便算片断ID了,片断ID是不会发送到服务器的!通常用来跳到A标签的锚连接 或者用来js的 location.hash 取值 等等!url

3. 测试的例子

例子1

http://xss1.com&action=test@w...
这个连接会跳转到哪里了,咱们按照上面的思路来模拟一下浏览器的解析过程。

  1. 解析:,解析到的前面就是协议
  2. 解析//,跳过
  3. 解析受权信息,找/,?,#,;发现都没有,那直到结尾都是受权信息
  4. 受权新信息查找@,前面是登陆信息,xss1.com&action=test为登陆信息
  5. 后面的就被当作主机名解析,因此跳转到了www.baidu.com

url解析2.gif

例子2

http://xss1.com\@www.baidu.com
按照 URL 的解析思路,大胆想想这个 URL 会去哪里了?

  1. 解析:,解析到的前面就是协议
  2. 解析//,跳过
  3. 解析受权信息,找/,?,#,;这里就有点不同了,通常浏览器会把 \ 转换成 / ,http://xss1.com\@www.baidu.com 也就是 http://xss1.com/@www.baidu.com 这个正常的解析也就访问搭配http://xss1.com了。可是在fire...
  4. 在firefox 下,找/,?,#,;发现都没有,那直到结尾都是受权信息
  5. 受权新信息查找@,前面是登陆信息,http://xss1.com\为登陆信息。

例子3

http://xss1.com;.baidu.com/
在不一样的浏览器对;的处理不太同样。
一些浏览器会自动的把url纠正成http://xss1.com/;.baidu.com/
,谷歌浏览器认为这不是一个url,唤起查询引擎,safari会认为这是一个错误。

url解析3.gif

4. 连接真的只能是这样固定的格式么?

经过对浏览器对URL 解析的一个分析,我想你们都知道了,答案是:不是。

这样的

  • \/www.baidu.com
  • \@www.baidu.com
  • \/@www.baidu.com
  • \\\\www.baidu.com
  • ///////www.baidu.com
    这些连接都能正常的访问到百度。

    这样的

  • ⅅʳºℙˢ.ʷººʸⓊⁿ.ºʳℊ
    再看看这个连接也是能正常解析的(虽然这个网站不存在的,可是解析是没有问题的),可是你会发现若是把上面这个连接插入到语雀、掘金、有道云笔记插入连接会出现不同的状况。有兴趣能够尝试一下

    仍是这样的

  • http://ⅅʳºℙˢ.ʷººʸⓊⁿ.ºʳℊ
    上面这些奇奇怪怪的连接都能正常访问,为何了?

    为何?

    这里须要提到的是针对域名的编码:Punycode。通过Punycode编码后的域名是会被DNS服务器所识别的!
    举个🌰拿中文域名来讲,由于操做系统的核心都是英文组成,DNS服务器的解析也是由英文代码交换,因此DNS服务器上并不支持直接的中文域名解析。 全部中文域名的解析都须要转成punycode码,而后由DNS解析punycode码。最后咱们成功的访问到了咱们要去网站!只不过今天咱们这里 punycode编码的解析过程并非由dns服务器来解析的 而是在浏览器访问时就给解码回来!

5. 连接真的是你看到的那样么?

先看一个例子:http://www.baidu.com@qq.com, 你们认为这个连接为跳转到哪里去,安装第二小节的解析规则很简单,跳转到qq.com。由于@前面的信息被解析成了受权信息。 因此咱们这段连接为何去qq.com 而不是去baidu.com 算由于一个@符 让浏览器认为www.baidu.com 算一段用户信息 然后面的才算主机名 他要去访问的地址。因此咱们有时候若是你想假装找不到跳转漏洞也能够如此实现!而且在谷歌、firefox你还能够这样写http:www.baidu.com@qq.com。

url地址是能够用进制来代替

在《web之困》中讲了其实url地址是能够用进制来代替的!只不过算把ip地址给转换成进制来访问!
十进制 —||||||> 十六进制 —||||||> 八进制 而后在访问时 指定协议而后加个0
http://0[八进制] 好比 115.239.210.26, 首先用.分割数字 115 239 210 26 ,而后选择10进制转换16进制!(要用0来表示前缀,能够是一个0也能够是多个0 跟XSS中多加几个0来绕过过滤同样!)。首先把这四段数字给 转成 16 进制!结果:73 ef d2 1a 而后把 73efd21a 这十六进制一块儿转换成8进制!,结果就是16373751032,而后指定协议 http:// 用0表示前缀 加上结果 连接:http://0016373751032。

以百度为例

image.png
百度首页 IP 14.215.177.38

  1. 先用 . 分割 14 215 177 38
  2. 将数字转换为16进制,结果是e d7 b1 26
  3. 将四个转换后的进制数()连接起来,转换为8进制,结果是1665730446
  4. 而后指定协议 http:// 用0表示前缀 加上结果,http://01665730446
  5. 是否是成功了?

url解析4.gif

结束语

若是文章中什么不对或者写的很差的地方,请你们多多指正,谢谢!码字不易,点个赞加个关注吧!

靓仔.gif

参考

相关文章
相关标签/搜索