简介

虽然知道什么是 URL编码 ,之前也学习过 SSRF漏洞 ,但是对 SSRF漏洞 中要进行一次URL编码或者两次URL编码甚是疑惑。
相信很多如我一般初学的小伙伴也有此疑惑。因此,特意学习探讨,于此总结。

详解

URL编码

首先认认真真的了解URL编码。

URL编码是一种将URL中的特殊字符转换为可安全传输和处理的字符序列的过程。它的主要目的是确保 URL 中的特殊字符不会与 URL 本身的语义产生冲突,同时还可以避免在网络传输和处理过程中引发错误。

为什么使用url编码

  1. 特殊字符转义:URL中包含许多特殊字符,例如空格、问号、#、&等,这些字符在URL中具有特殊含义,用于表示参数、查询字符串、路径等。通过URL编码,这些特殊字符将被转义成%后跟两位十六进制数,以确保它们不会与URL语义冲突。
  2. 安全性:URL编码可以保证在传输过程中,特殊字符不会被误解、篡改或造成安全漏洞。在某些情况下,特殊字符可能会被解释为命令或注入攻击的一部分,因此对它们进行编码可以增加网站和应用程序的安全性。
  3. 兼容性:不同的浏览器和服务器对URL的处理方式可能略有不同。使用URL编码可以确保各种浏览器和服务器都能正确地处理和解析URL,避免因不同平台之间的差异而导致错误。

什么内容url编码

  1. 空格:空格在URL中会被编码为"%20"或加号"+",以避免与URL中的参数和路径混淆。
  2. 非字母数字字符:除了字母和数字之外的字符,如符号、标点符号等都需要进行URL编码。例如,#会被编码为%23&会被编码为%26
  3. 保留字符:某些字符在URL中有特殊含义,被称为保留字符。为了在URL中表示保留字符本身,它们需要被编码。例如,/会被编码为%2F?会被编码为%3F
  4. 非ASCII字符:URL通常只支持ASCII字符集,因此对于非ASCII字符(如汉字、日语假名、西里尔字母等),需要使用特定的编码方式进行转换。常用的编码方式有UTF-8、GBK等。例如,汉字中国会被编码为%E4%B8%AD%E5%9B%BD(UTF-8编码)。

url编码格式

url编码由%+字符十六进制编码构成。例如:

字符十六进制url编码
a61%61
#23%23
/2f%2f
%25%25

SSRF

SSRF(Server-Side Request Forgery,服务器端请求伪造)是一种由攻击者通过欺骗服务器发起伪造的请求的网络安全漏洞。

原理

SSRF的原理基于服务器未对用户输入进行充分验证和过滤。攻击者通过向服务器发送特制的请求,来引导服务器访问攻击者指定的目标地址,从而实现攻击的目的。
下面是SSRF攻击的一般原理:

  1. 攻击者通过应用程序或接口中的输入字段,提交包含恶意URL的请求。这些输入字段可以是URL参数、文件上传功能、用户提交的数据等。
  2. 服务器接收到请求并解析其中的URL参数。由于未经充分验证和过滤,服务器将信任这些URL参数。
  3. 攻击者在URL参数中使用特殊的协议,如file://、dict://、gopher://等,或者使用带有内部IP地址或本地服务的URL。
  4. 服务器根据攻击者提供的URL参数发起请求,以获取资源或执行某些操作。服务器会将请求发送到攻击者指定的目标地址,而不是预期的目标。
  5. 攻击者可以利用此漏洞来绕过防火墙保护,访问受限的资源,包括内部网络、本地服务、敏感文件,或者通过攻击其他外部系统来进一步扩大攻击面。

ssrf的url编码问题

有四点需要注意:

  1. 浏览器在发送http请求之前,会对请求信息进行一次url编码
  2. 在前端程序中,代码可能会进行相关的url编码,再交给浏览器发送
  3. 在多数的web容器中,在收到请求信息时会进行解码
  4. 在应用程序中可能会进行单独的url解码

有几次编码就要有几次解码,这样才能获得正确的信息。
所以在解决url编码问题时,需要思考的问题就是一共进行了几次编码。
所以当使用工具构造payload时需要进行一次url编码,而使用浏览器就不需要,因为浏览器会默认编码一次。

2023-07-18T06:43:11.png
在浏览器直接搜索%,会将其编码成%25
当然,不对%编码也可以搜索的,但是在以下情况就会出错:
2023-07-18T11:04:44.png
实际想搜索的是%25,url编码后是%2525,如果使用hackbar工具发送请求且不对%编码(即删掉一个25),就会变成搜索%,而不是%25
2023-07-18T11:09:34.png
2023-07-18T11:10:13.png
再比如搜索#号,不对其url编码就会跳到百度首页,这是因为#在url中是锚点。所以相当于搜索空字符,就会跳到百度首页。

总结

在多数的SSRF中,是要对payload进行多次编码的。(不考虑应用程序单独的url解码)

  1. 在服务器端会进行一次url解码
  2. 服务器端向另一台服务器转发后,另一台服务器也会进行一次url解码

因此,需要编码两次。手动编码一次,浏览器编码一次。如果使用工具,则需要进行两次手动编码。

实例

这是一个简单的SSRF漏洞靶场,会向内网其他服务器进行sql注入。
2023-07-18T11:33:04.png
2023-07-18T11:33:57.png

直接看payload:

--浏览器
http://172.72.23.23:80?id=1'+and+1=2+union+select+1,2,3,4+%23 

--工具
http%3A%2F%2F172.72.23.23%3A80%3Fid%3D1%27%2Band%2B1%3D2%2Bunion%2Bselect%2B1%2C2%2C3%2C4%2B%2523

2023-07-18T11:47:55.png
2023-07-18T11:48:33.png

结语

如有错误,欢迎大佬指正!!!