所以我网站上的一个页面(它是一个显示时事通讯文章的 PHP 页面)很容易受到 SQL 注入的攻击并受到攻击。我发现它是因为它执行了足够多的数据库查询,导致数据库服务器上的 CPU 负载达到峰值。我至少从我的 Apache 日志中找到了一些正在执行此操作的 IP 地址,并将它们阻止在防火墙中,并且我至少对页面进行了加固。我要确定的正是他们正在运行的查询,它们很好地隐藏/转义了东西。这是我在 Apache 日志中找到的查询字符串:
?id=742%2F--%2F%2F!30000and(select%2F--%2F1%2F--%2Ffrom(select%2F--%2Fcount()%2Cconcat((select%2F--%2F( select%2F--%2F(select%2F--%2Fconcat(0x27%2C0x7e%2Cunhex(Hex(cast(sbamail.email%2F--%2Fas%2F--%2Fchar)))%2C0x27%2C0x7e)% 2F--%2Ffrom%2F--%2Femail.sbamail%2F--%2Flimit%2F--%2F284079%2C1)%2F--%2F)%2F--%2Ffrom%2F--%2Finformation_schema.tables% 2F--%2Flimit%2F--%2F0%2C1)%2Cfloor(rand(0)2))x%2F--%2Ffrom%2F--%2Finformation_schema.tables%2F--%2Fgroup%2F--% 2Fby%2F--%2Fx)a)%2F--%2Fand%2F--%2F1%3D1%2F
这是数据库为运行查询显示的内容:
从 newsletter_articles 中选择标题 where article_id = 2010/--//!30000and(select/--/1/--/from(select/--/count(),concat((select/--/(select/-- /(select/--/concat(0x27,0x7e,unhex(十六进制(cast(sbamail.email/--/as/--/char))),0x27,0x7e)/--/from/--/email .sbamail/--/limit/--/119488,1)/--/)/--/from/--/information_schema.tables/--/limit/--/0,1),floor(rand( 0)2))x/--/from/--/information_schema.tables/--/group/--/by/--/x)a)/--/and/--/1=1/
(这两个重复的广告令人作呕,参数更改很小)当我尝试将该查询粘贴回 MySQL 时,我得到一个语法错误。
当我实际将该查询字符串粘贴到受影响的页面上时(在我修补它之前),它只会显示以下内容:
键 'group_key' 的重复条目 ''~redacted@redacted.com'~1'
“重复条目”位是我真正担心的。我最初以为它们只是在电子邮件地址之后(幸运的是,这个数据库中没有存储密码);它以前在其他页面上发生过,我只能看到“选择”语句,但如果他们能够插入/更新/删除,那就更糟了。我怎样才能解除/解码他们在做什么?我应该恐慌并考虑从备份中恢复数据库吗?
有问题的页面位于一个非常基本的 LAMP 堆栈上,如果这完全相关的话。没有框架或任何东西。