代码与数据
大多数安全问题来自于攻击者能够将代码放在应用程序需要数据的地方。大多数Web安全问题(如XSS或SQL注入)都来自此; 应用程序接收数据,但将此数据用作代码。
URL网址编码
正如我们所看到的,HTTP中使用了一些字符来区分:
- 每个请求的行:\r\n。
- HTTP请求的每个部分(如方法和URI之间):空格。
- 路径和参数:?。
- 每个参数:&;
- 参数名称和相应的值:=。
但是,对于大多数攻击来说,需要这些字符,以确保字符被理解为一个值,而不是作为请求分隔符的一部分; 它需要被编码。最简单的编码由使用%后跟字符的十六进制值组成。同样,由于%用于编码值,所以它应该被编码…
为了检索给定字符的十六进制值,可以使用ascii表。下表显示了用作HTTP协议一部分的字符及其URL编码值:
字符 | 网址编码 |
---|---|
\r | %0d |
\n | %0a |
空格 | %20 或者 `+` |
? | %3f |
& | %26 |
= | %3d |
; | %3b |
# | %23 |
% | %25 |
您可以使用ASCII表格来获取完整列表。它可以通过man ascii在大多数Linux系统上运行,或通过搜索“ascii表” 来检索。
如果您正在进行大量Web应用程序渗透测试,那么打印ascii表并将其保存在桌面上可能是个好主意。
双重编码
有时,被测试的系统也可以解码提供的值两次。例如,Web服务器可以进行第一次解码,而应用程序则可以进行第二次解码。在这种情况下,您需要对要发送的特殊字符进行双重编码。
为此,您只需重新编码编码值。例如,如果您想对一个等号进行双重编码=,您需要将其编码为%3d,然后重新编码它:%253d。
一旦收到%253d,Web服务器可以将其解码为%3d,并且Web应用程序可以%3d再次解码=。
在某些情况下,双重编码也可用于绕过某些过滤机制。这种行为显然取决于处理HTTP请求期间所涉及链中每个组件的行为。
HTML编码
与URL编码一样,HTML中的某些字符具有特定的语义,因此如果需要在没有其语义暗示的情况下使用它们,则应对其进行编码。
字符 | 网址编码 |
---|---|
> | > |
< | < |
& | & |
“ | "e; |
‘ | ' |
任何字符也可以使用它们进行编码
- 例如,十进制值=可以编码为=。
- 例如,十六进制值=可以编码为=。