一个简单的具有登录功能的网页应用。仅管理员可以登录。
该应用使用 PostgreSQL 和 pgx v5.5.3(存在漏洞的版本)。
攻击者试图通过恶意插入记录到 users 表中进行登录。然而,由于使用了占位符,传统的 SQL 注入无效。
PostgreSQL 消息格式:https://www.postgresql.org/docs/17/protocol-message-formats.html
该利用依赖于 pgx 在执行 SQL 时发送给数据库服务器的消息格式。
默认情况下,pgx 使用 P(Parse) 发送预处理语句,然后使用 B(Bind) 发送参数。
如果设置了以下配置,pgx 将使用 Q(Query) 发送插值查询:
cfg.ConnConfig.DefaultQueryExecMode = pgx.QueryExecModeSimpleProtocol
你可以使用 tcpdump 的 -X 选项查看实际消息。
Q_simple.py:通过 Q(Query) 造成溢出。假设攻击者完全了解正在执行的查询(如果是黑盒,则需要暴力破解)。Q_nop_sled.py:通过 Q(Query) 造成溢出。可在 5 次尝试内成功利用。B_simple.py:通过 B(Bind) 造成溢出。假设攻击者完全了解正在执行的查询(依我之见,在黑盒场景下利用 B(Bind) 比较困难)。