【发布时间】:2020-03-02 07:30:05
【问题描述】:
我目前正在审查某人的代码,我遇到了以下 Python 行:
db.query('''SELECT foo FROM bar WHERE id = %r''' % id)
这违背了我的常识,因为我通常会选择使用准备好的语句,或者至少使用数据库系统的原生字符串转义函数。
但是,我仍然很好奇如何利用它,因为:
- “id”值是最终用户/渗透测试者提供的字符串或数字
- 这是 MySQL
- 连接已明确设置为使用 UTF8。
【问题讨论】:
-
1. “id”由用户提供。 2)不同的SQL服务器有不同的转义机制。 3) MySQL 根据字符集的不同转义。
-
您可以为
id做的最好的事情就是检查它是否是一个整数。这里最易受攻击的方法甚至都懒得这样做,所以它们是开放的 -
@roganjosh,很抱歉说得太清楚了。我不打算改进此代码。我会使用准备好的陈述。我正在寻找证明这是可利用的证据。
-
当然,我明白你在问什么。甚至Bobby Tables 也足以在这里演示:)
-
不会,因为
%r实际上会转义引号。
标签: python mysql sql-injection