简介
虽然知道什么是 URL编码 ,之前也学习过 SSRF漏洞 ,但是对 SSRF漏洞 中要进行一次URL编码或者两次URL编码甚是疑惑。
相信很多如我一般初学的小伙伴也有此疑惑。因此,特意学习探讨,于此总结。
详解
URL编码
首先认认真真的了解URL编码。
URL编码是一种将URL中的特殊字符转换为可安全传输和处理的字符序列的过程。它的主要目的是确保 URL 中的特殊字符不会与 URL 本身的语义产生冲突,同时还可以避免在网络传输和处理过程中引发错误。
为什么使用url编码
- 特殊字符转义:URL中包含许多特殊字符,例如空格、问号、#、&等,这些字符在URL中具有特殊含义,用于表示参数、查询字符串、路径等。通过URL编码,这些特殊字符将被转义成%后跟两位十六进制数,以确保它们不会与URL语义冲突。
- 安全性:URL编码可以保证在传输过程中,特殊字符不会被误解、篡改或造成安全漏洞。在某些情况下,特殊字符可能会被解释为命令或注入攻击的一部分,因此对它们进行编码可以增加网站和应用程序的安全性。
- 兼容性:不同的浏览器和服务器对URL的处理方式可能略有不同。使用URL编码可以确保各种浏览器和服务器都能正确地处理和解析URL,避免因不同平台之间的差异而导致错误。
什么内容url编码
- 空格:空格在URL中会被编码为"%20"或加号"+",以避免与URL中的参数和路径混淆。
- 非字母数字字符:除了字母和数字之外的字符,如符号、标点符号等都需要进行URL编码。例如,
#
会被编码为%23
,&
会被编码为%26
。 - 保留字符:某些字符在URL中有特殊含义,被称为保留字符。为了在URL中表示保留字符本身,它们需要被编码。例如,
/
会被编码为%2F
,?
会被编码为%3F
。 - 非ASCII字符:URL通常只支持ASCII字符集,因此对于非ASCII字符(如汉字、日语假名、西里尔字母等),需要使用特定的编码方式进行转换。常用的编码方式有UTF-8、GBK等。例如,汉字
中国
会被编码为%E4%B8%AD%E5%9B%BD
(UTF-8编码)。
url编码格式
url编码由%
+字符十六进制编码构成。例如:
字符 | 十六进制 | url编码 |
---|---|---|
a | 61 | %61 |
# | 23 | %23 |
/ | 2f | %2f |
% | 25 | %25 |
SSRF
SSRF(Server-Side Request Forgery,服务器端请求伪造)是一种由攻击者通过欺骗服务器发起伪造的请求的网络安全漏洞。
原理
SSRF的原理基于服务器未对用户输入进行充分验证和过滤。攻击者通过向服务器发送特制的请求,来引导服务器访问攻击者指定的目标地址,从而实现攻击的目的。
下面是SSRF攻击的一般原理:
- 攻击者通过应用程序或接口中的输入字段,提交包含恶意URL的请求。这些输入字段可以是URL参数、文件上传功能、用户提交的数据等。
- 服务器接收到请求并解析其中的URL参数。由于未经充分验证和过滤,服务器将信任这些URL参数。
- 攻击者在URL参数中使用特殊的协议,如file://、dict://、gopher://等,或者使用带有内部IP地址或本地服务的URL。
- 服务器根据攻击者提供的URL参数发起请求,以获取资源或执行某些操作。服务器会将请求发送到攻击者指定的目标地址,而不是预期的目标。
- 攻击者可以利用此漏洞来绕过防火墙保护,访问受限的资源,包括内部网络、本地服务、敏感文件,或者通过攻击其他外部系统来进一步扩大攻击面。
ssrf的url编码问题
有四点需要注意:
- 浏览器在发送http请求之前,会对请求信息进行一次url编码
- 在前端程序中,代码可能会进行相关的url编码,再交给浏览器发送
- 在多数的web容器中,在收到请求信息时会进行解码
- 在应用程序中可能会进行单独的url解码
有几次编码就要有几次解码,这样才能获得正确的信息。
所以在解决url编码问题时,需要思考的问题就是一共进行了几次编码。
所以当使用工具构造payload时需要进行一次url编码,而使用浏览器就不需要,因为浏览器会默认编码一次。
在浏览器直接搜索%
,会将其编码成%25
。
当然,不对%
编码也可以搜索的,但是在以下情况就会出错:
实际想搜索的是%25
,url编码后是%2525
,如果使用hackbar工具发送请求且不对%
编码(即删掉一个25),就会变成搜索%
,而不是%25
。
再比如搜索#
号,不对其url编码就会跳到百度首页,这是因为#
在url中是锚点。所以相当于搜索空字符,就会跳到百度首页。
总结
在多数的SSRF中,是要对payload进行多次编码的。(不考虑应用程序单独的url解码)
- 在服务器端会进行一次url解码
- 服务器端向另一台服务器转发后,另一台服务器也会进行一次url解码
因此,需要编码两次。手动编码一次,浏览器编码一次。如果使用工具,则需要进行两次手动编码。
实例
这是一个简单的SSRF漏洞靶场,会向内网其他服务器进行sql注入。
直接看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
结语
如有错误,欢迎大佬指正!!!