在 SQL 查询中排序后的 SQL 注入有效负载

SQL injection payload after order by in SQL query

提问人:Fuyda 提问时间:11/27/2022 最后编辑:Fuyda 更新时间:11/28/2022 访问量:1004

问:

试图利用 SQL 注入来完成我的任务。是否可以在 Postgresql 中不使用分号的情况下在选择查询中执行排序后的删除或删除查询?

这是我的示例查询:

Select * 
from table 
order by {sql injection payload}

如果不在有效负载中使用分号,我们可以删除数据或删除表吗?

https://stackoverflow.com/a/6800585

我们有类似的Postgrsql吗?

我试过了

select * from (delete from table_name return *) a

但是将 sql 错误作为“语法错误在或接近 from”

postgresql sql 注入

评论

0赞 11/27/2022
如果不以分号 () 结束语句,则始终会导致语法错误。;
0赞 Fuyda 11/28/2022
@a_horse_with_no_name 有没有办法像在 case 语句中将查询作为表达式传递,或者通过返回内容的删除查询或任何其他方式来结束查询而不使用分号。

答:

0赞 Hirxe 11/28/2022 #1

检查此文档,它说我们可以通过 CHR() 绕过禁止的字符

https://book.hacktricks.xyz/pentesting-web/sql-injection/postgresql-injection

评论

0赞 Fuyda 11/28/2022
试过了,但不能像 select * from table_name order by (select 1||CHR(59) ||(从表中删除 other_table_name))出现 SQL 错误,提示“语法错误位于或附近”
0赞 Bill Karwin 11/28/2022 #2

不能将 DELETE 放在子查询中。DELETE 也不能是 UNION 的一部分。

因此,除了运行第二个查询(即用分号分隔)之外,您几乎无法执行所描述的操作。

如果您知道执行 DELETE 的现有函数,则可以调用存储过程或函数。例:

Select * 
from table 
order by {sql injection payload}

有效负载修改此查询后:

Select * 
from table 
order by SomeFunctionThatDeletes()

另一种类型有效,因为您可以从 PostgreSQL 中的过程中进行选择:

Select * 
from table 
order by id
UNION
Select * 
from SomeProcedureThatDeletes()

您不能使用 SQL 注入创建函数或过程,因此该例程必须已经存在,并且您需要知道其名称以及如何调用它。

DELETE 或 DROP TABLE 并不是 SQL 注入可能发生的唯一坏事。如果查询返回当前用户无权查看的数据,则可能是一个问题。例如,有关其他用户的购买记录或病史。

SQL注入也可能是偶然的,而不是恶意的。我什至会说,大多数SQL注入实例都会导致简单的错误,而不是数据泄露。这些并不是真正的攻击,但它们会给用户带来不满意的体验。

评论

0赞 Fuyda 11/28/2022
下单后工会不工作。我创建了查询,因为 select * from table_name order by id union select * from table_name。它给出 sql 错误,说“语法错误在联合或接近联合
0赞 Bill Karwin 11/28/2022
啊,我忘了如果你用UNION,你只能在最后ORDER BY。对中间查询进行排序是没有意义的。好吧,那你就不能那样做。
0赞 Laurenz Albe 11/28/2022
好答案。不要忘记,如果您拥有数据库的权限,则可以在中创建临时函数。pg_temp
0赞 Bill Karwin 11/28/2022
@LaurenzAlbe 攻击者是否可以使用 SQL 注入创建临时函数作为表达式或子查询的一部分?我不知道有什么方法可以做到这一点。
0赞 Laurenz Albe 11/28/2022
@BillKarwin嗯,没错,这是不可能的;当然不是没有注入分号。