什么是URL/URL编码绕过

什么是URL/URL编码绕过

什么是URL?

URL 是“统一资源定位符”(Uniform Resource Locator)的首字母缩写,中文译为“网址”,表示各种资源的互联网地址。下面就是一个典型的 URL。

https://www.example.com/path/index.html?key1=value1&key2=value2

所谓资源,可以简单理解成各种可以通过互联网访问的文件,比如网页、图像、音频、视频、JavaScript 脚本等等。只有知道了它们的 URL,才能在互联网上获取它们。

只要资源可以通过互联网访问,它就必然有对应的 URL。一个 URL 对应一个资源,但是同一个资源可能对应多个 URL。

URL 是互联网的基础。互联网之所以“互联”,就是因为网页可以通过“链接”(link),包含其他 URL。用户只要点击,就可以从一个 URL 跳转到另一个 URL,前往不同的网站。

URL的组成

其大体框架如下

<协议>://<主机地址或主机名>[:port]/<目录资源,路径>

协议类型

协议(scheme)是浏览器请求服务器资源的方法,上例是https://的部分,表示使用 HTTPS 协议。

互联网支持多种协议,必须指明网址使用哪一种协议,默认是 HTTP 协议。也就是说,如果省略协议,直接在浏览器地址栏输入www.example.com,那么浏览器默认会访问http://www.example.com。HTTPS 是 HTTP 的加密版本,出于安全考虑,越来越多的网站使用这个协议。

HTTP 和 HTTPS 的协议名称后面,紧跟着一个冒号和两个斜杠(://)。其他协议不一定如此,邮件地址协议mailto:的协议名后面只有一个冒号,比如mailto:foo@example.com。

主机

主机(host)是资源所在的网站名或服务器的名字,又称为域名。上例的主机是www.example.com。

有些主机没有域名,只有 IP 地址,比如192.168.2.15。这种情况常常出现在局域网。

经典问题:

Q:访问某一个网址(点击一个网站)的具体过程? A:分为以下几个过程 1.DNS域名解析 主机首先查询本地的DNS缓存,查看是否有对应的IP。如若没有,则访问本地HOST文件。如果还是没有对应ip则需要发送信息给本地DNS服务器,由服务器进行迭代查询,询问其他的域名服务器以获得准确的IP地址。此过程中,在本地进行的查询称之为递归查询,而通过本地DNS服务器进行的查询则是迭代查询。 2.基于IP与对方进行TCP通信建立三次握手连接。 3.如果协议类型为HTTPS还需要进行安全参数的协商建立安全的通信通道。 4.客户端和服务器发送request/response进行交互

端口号

端口号是用来区分服务类型的表示符,用于标识同一主机上的不同进程所在位置。所以对于不同的端口我们需要掌握其常见的对应关系: 1-1024:指定端口常常于特定的服务对应 1024-65535:非指定端口

port作用22ssh 远程连接23telnet 远程连接20/21frp文件传输协议25smtp 邮件协议67/68dhcp动态地址获取协议80http超文本传输协议110pop3445ms7-010 永恒之蓝病毒入侵端口389ldap 域控制器 active director3306mysql 连接端口6379redis 连接端口

路径

路径(path)是资源在网站的位置。比如,/path/index.html这个路径,指向网站的/path子目录下面的网页文件index.html。

互联网的早期,路径是真实存在的物理位置。现在由于服务器可以模拟这些位置,所以路径只是虚拟位置。

路径可能只包含目录,不包含文件名,比如/foo/,甚至结尾的斜杠都可以省略。这时,服务器通常会默认跳转到该目录里面的index.html文件(即等同于请求/foo/index.html),但也可能有其他的处理(比如列出目录里面的所有文件),这取决于服务器的设置。一般来说,访问www.example.com这个网址,很可能返回的是网页文件www.example.com/index.html。

查询参数

查询参数(parameter)是提供给服务器的额外信息。参数的位置是在路径后面,两者之间使用?分隔,上例是?key1=value1&key2=value2。

查询参数可以有一组或多组。每组参数都是键值对(key-value pair)的形式,同时具有键名(key)和键值(value),它们之间使用等号(=)连接。比如,key1=value就是一个键值对,key1是键名,value1是键值。

多组参数之间使用&连接,比如key1=value1&key2=value2。

URL字符

URL的各个组成部分,只能使用如下这些字符:

26个英语字母(包括大写和小写)10个阿拉伯数字连词号(-)句点(.)下划线(_) 此外,还有18个字符属于 URL 的保留字符,只能在给定的位置出现。比如,查询参数的开头是问号(?),也就是说,问号只能出现查询参数的开头,出现在其他位置就是非法的,会导致网址解析错误。网址的其他部分如果要使用这些保留字符,必须使用它们的转义形式。

URL 字符转义的方法是:在这些字符的十六进制 ASCII 码前面加上百分号(%) 下面是这18个字符及其转义形式。

!%21#%23$%24&%26’%27(%28)%29*%2A+%2B,%2C/%2F:%3A;%3B=%3D?%3F@%40[%5B]%5D

注:这里可以使用python环境快速找到字符对应的URL编码

#返回字符的ASCLL码

>>> ord('#')

35

#进行进制转换

>>> hex(35)

'0x23'

#人为添加一个%

%23就对应#的URL编码

绝对URL和相对URL

URL 分成两种:绝对 URL 和相对 URL。

绝对 URL 指的是,只靠 URL 本身就能确定资源的位置。这意味着,URL 必须带有资源的完整信息,包含协议、主机、路径等部分。前面的例子都是绝对 URL。

相对 URL 指的是,URL 不包含资源位置的全部信息,必须结合当前网页的位置,才能定位资源。比如,当前网页的 URL 是https://www.example.com/path/index.html,该网页上面有一个资源,URL 指向a.html,这个就是相对 URL。因为只知道a.html,并不能定位资源。浏览器假定,a.html与当前网址在同一个子目录下面,从而得到绝对 URL https://www.example.com/path/a.html。

相对 URL 如果以斜杠(/)开头,就表示网站的根目录。否则,必须以当前目录为起点,推算资源的位置。比如,相对 URL /foo/bar.html表示网站根目录的子目录foo,foo/bar.html表示在当前目录的foo子目录。

URL 还可以使用两个特殊简写,表示特定位置。

.:表示当前目录,比如./a.html(当前目录下的a.html文件)..:表示上级目录,比如../a.html(上级目录下的a.html文件)

这两种简写可以多个连用,比如../../表示上两级目录。

绝对 URL 也可以使用这两个简写,比如www.example.com/./index.html等同于www.example.com/index.html,这时.相当于根目录的当前目录,即根目录本身。

URL绕过

环境:phpstuday+windows10 启用apache搭建环境 核心目标:在页面内通过js进行弹窗(反射型xss漏洞的特征)

示例1

header('X-XSS-Protection: 0');

$xss = isset($_GET['xss'])? $_GET['xss'] : '';

$xss = str_replace(array("(",")","&","\\","<",">","'"), '', $xss);

echo "";

?>

测试访问情况: 可以看到,此处的xss参数通过get的方式传递给后端程序处理后又返回来继续显示作用于当前页面。即就是说如果我们输入特殊的参数就会达到这个效果

处理流程上看,我们的URL会先进行一次URL编码在交给后端程序处理,即就是说在此处逃逸出来的方法就是进行双编码例如输入参数

xss=1%22%20οnerrοr=%22alert%25281%2529

很奇怪,绕过了但是浏览器并未将%29和%28编译为括号,没有弹窗出来。 这里需要注意,因为onerror函数为一个JS函数,在JS中是不允许编码符号的,即就是在onerror内部不允许进行符号的编码。故无法进行括号的编码。 我们可以使用location函数来解决此问题,其可以将右侧的值转换为变量,而在JS中变量是可以进行编码的,在里边写一个js的伪协议如下:

#目标:

xss=1" οnerrοr=location="javascript:alert%25281%2529

示例2

header('X-XSS-Protection: 0');

$xss = isset($_GET['xss'])?$_GET['xss']:'';

$xss = str_replace(array("(",")","&","\\","<",">","'"), '', $xss);

if (preg_match('/(script|document|cookie|eval|setTimeout|alert)/', $xss)) {

exit('bad');

}

echo "";

?>

可以看到这里有了一定的升级对于敏感的字符进行了过滤,之前的srcipt被过滤掉了,乍一看十分唬人,实际上我们只需要通过拼接字符串的方式即可完成这个绕过

xss=1" οnerrοr=location="javascri"+"pt:al"+"ert%25281%2529

不行嘛?这里肯定不行,因为+号无法被URL识别,需要进行URL编码

xss=1" οnerrοr=location="javascr"%2b"ipt:al"%2b"ert%25281%2529

相关推荐

【踩坑笔记】animate.css无效【非版本问题】
365bet足球比分直播

【踩坑笔记】animate.css无效【非版本问题】

📅 08-02 👁️ 5874
淘宝图片空间的图片怎么导出?图片空间导出指南
365bet网址是多少

淘宝图片空间的图片怎么导出?图片空间导出指南

📅 09-06 👁️ 474
iPhone修理本舗 池袋店 | 修理、回收、贩卖广告号:8723209浏览量: