xargs ไม่สามารถค้นหาเส้นทางของไฟล์ที่มาจากไฟล์อินพุต

ก่อนอื่น ฉันไม่แน่ใจว่าสิ่งนี้เป็นของที่นี่ซึ่งตรงข้ามกับ ServerFault หรือที่อื่น หากมันอยู่ที่นั่นแทนฉันขอโทษ

อย่างไรก็ตาม ต่อไปนี้เป็นข้อมูลเบื้องต้นเกี่ยวกับปัญหาของฉัน ฉันทำงานให้กับบริษัทที่จัดการเว็บไซต์ของลูกค้าหลายราย และลูกค้ารายหนึ่งที่เราดำเนินการนั้นมีเว็บไซต์ที่มีมัลแวร์จำนวนมากซึ่งจำเป็นต้องกำจัดออก ตอนนี้ ฉันได้เรียนรู้มากมายในช่วงไม่กี่สัปดาห์ที่ผ่านมาเกี่ยวกับการใช้ grep, find, xargs ฯลฯ เพื่อค้นหาและดำเนินการกับไฟล์ที่มีชื่อไฟล์ ขนาดไฟล์ และมีสตริงหรือรูปแบบข้อความที่แน่นอน

ปัญหาหนึ่งที่เราพบคือรูปภาพบางรูปถูกแทรกด้วยข้อมูล exif ที่เป็นอันตราย (โดยพื้นฐานแล้ว แอตทริบิวต์ Make คือ /.*/e และแอตทริบิวต์ Model เป็นสิ่งที่ทำให้เกิดเอฟเฟกต์ eval(base64_decode(...)); โดยที่สตริงที่เข้ารหัสเป็นสคริปต์ PHP ที่อนุญาตให้ผู้โจมตีส่ง POST ร้องขอด้วยแอตทริบิวต์บางตัวแล้วเรียกใช้อินพุตจากแอตทริบิวต์นั้นผ่าน eval() จากนั้นพวกเขาก็ได้แทรกโค้ดต่อไปนี้ลงในสคริปต์ PHP อื่น

<?php
$exif = exif_read_data('/path/to/image.jpg');
preg_replace($exif['Make'],$exif['Model'],'');
?>

ดังนั้นพวกเขาจึงแทนที่นิพจน์ทั่วไป .* ซึ่งจับคู่อะไรก็ได้ (รวมถึงหัวเรื่องที่ว่างเปล่า) ด้วยโค้ด PHP ที่ยอมรับคำขอ POST และดำเนินการโค้ดที่กำหนด โดยพื้นฐานแล้ว สิ่งนี้ทำให้ผู้โจมตีสามารถรันโค้ด PHP ใด ๆ ที่พวกเขาต้องการบนเว็บไซต์ของลูกค้าได้ ทั้งหมดนี้น่าสนใจมากที่จะคิดออก แต่น่ารำคาญที่จะแก้ไข

PHP มีเครื่องมือในการอ่านข้อมูล exif (ได้แก่ exif_read_data()) และฉันใช้เครื่องมือนั้นเพื่อสแกนไฟล์รูปภาพทั้งหมดบนเว็บไซต์ของลูกค้า และรวบรวมรายการรูปภาพที่มีข้อมูล exif ที่เป็นอันตรายแทรกอยู่ อย่างไรก็ตาม PHP ไม่มีวิธีแก้ไขข้อมูลดังกล่าว ดังนั้นฉันจึงค้นคว้าเล็กน้อยและพบว่ามีโปรแกรม linux ชื่อ "ExifTools" ที่ให้คุณแก้ไขข้อมูล exif ได้ ฉันติดตั้งแล้วและรันคำสั่งต่อไปนี้:

xargs -a files_with_malicious_exif.txt exiftool -make="" -model=""

ไฟล์ข้อความจะมีรายการเส้นทางของไฟล์ โดยแต่ละไฟล์อยู่ในบรรทัดของตัวเอง สคริปต์อ่านชื่อไฟล์อย่างถูกต้อง เนื่องจากมีข้อความ "ข้อผิดพลาด: ไม่พบไฟล์ - ./path" จำนวนมาก (หนึ่งข้อความสำหรับแต่ละเส้นทาง)

ปัญหาคือ เส้นทางนั้นมีอยู่จริง และถ้าฉันรันคำสั่งต่อไปนี้:

exiftool -make="" -model="" ./path/that/does/exist/and/is/in/the/file/like/this.jpg

มันได้ผล. ฉันตรวจสอบไฟล์แล้วและทั้งสองรายการในข้อมูล exif ได้รับการล้างแล้ว

แต่จำนวนไฟล์ที่ติดไวรัสค่อนข้างสูง และฉันไม่อยากแยกไฟล์ทีละไฟล์เพื่อรันคำสั่งในแต่ละไฟล์

ฉันได้ลองใช้เส้นทางที่แน่นอนรวมทั้งลบ "./" ออกจากชื่อไฟล์ ฉันกำลังเรียกใช้จากไดเร็กทอรีที่ถูกต้องเพื่อให้พาธสัมพัทธ์ทำงานได้ (ดังที่เห็นได้จากข้อเท็จจริงที่ว่าคำสั่งที่สองทำงานกับพาธสัมพัทธ์) แต่ก็ยังไม่พบไฟล์ใด ๆ

มีอะไรที่ฉันลืมทำหรือทำไม่ถูกต้องหรือไม่?


person imkingdavid    schedule 08.08.2013    source แหล่งที่มา
comment
คำสั่ง xargs ของคุณค้นหาไฟล์และควรใช้งานได้โดยถือว่าไฟล์อินพุตนั้นใช้ได้ ข้อแม้ประการหนึ่ง: ทุกอย่างใช้ได้หากไม่มีช่องว่างในชื่อไฟล์ใด ๆ   -  person Ciclamino    schedule 08.08.2013
comment
ฉันคิดว่าคุณต้องให้ข้อมูลเพิ่มเติม ผลลัพธ์ของ head -3 files_with_malicious_exif.txt | xargs ls -1 คืออะไร?   -  person nosid    schedule 08.08.2013
comment
ฉันไม่เห็นช่องว่างในชื่อไฟล์ใดๆ (และการค้นหาอักขระเว้นวรรคในโปรแกรมแก้ไขข้อความของฉันว่างเปล่า) @nosid ผลลัพธ์ของคำสั่งนั้น : No such file or directory***.org/**.***.org/web/content/images/****.jpg : No such file or directory***.org/**.***.org/web/content/images/multimedia/***.jpg : No such file or directory***.org/**.***.org/web/content/images/***.jpg ฉันเซ็นเซอร์ส่วนหนึ่งของเส้นทางด้วยเครื่องหมายดอกจันเพราะมันจะระบุไคลเอนต์ของฉัน โปรดทราบว่าส่วนที่อยู่หลังไดเร็กทอรีดูเหมือนจะถูกตัดออกเมื่อเริ่มต้น (ไม่ใช่จุดเริ่มต้นแบบเต็มของเส้นทาง)   -  person imkingdavid    schedule 08.08.2013


คำตอบ (1)


หากคุณตั้งค่าให้ใช้ xargs เราก็สามารถพยายามแก้ไขปัญหาผ่านการวินิจฉัยได้ หากเป้าหมายของคุณคือเพียงทำงานให้สำเร็จ การวนซ้ำเล็กๆ ด้านล่างก็จะได้ผล หากคุณมีชื่อไฟล์ที่มีอักขระพิเศษ คุณเพียงแค่ต้องเปลี่ยน $fixfile เป็น "$fixfile"

cat files_with_malicious_exif.txt | while read fixfile; do exiftool -make="" -model="" $fixfile; done
person user2662831    schedule 08.08.2013
comment
ไม่ได้ตั้งค่าให้ใช้ xargs อย่างแน่นอน นั่นเป็นเพียงสิ่งเดียวที่ฉันสามารถค้นพบที่จะอนุญาตให้ฉันรันคำสั่งได้ - person imkingdavid; 08.08.2013
comment
ดังนั้นฉันจึงลองเรียกใช้คำสั่งนั้น แต่ก็ยังหาไฟล์ไม่พบ ฉันได้ลองแล้วโดยมีและไม่มีผู้นำ ./ รวมถึงใช้เส้นทางที่แน่นอน ฉันไม่รู้ว่าปัญหาคืออะไร - person imkingdavid; 08.08.2013
comment
ลองใช้ $fixfile แทนที่จะเป็น $fixfile และแจ้งให้เราทราบหากมันสร้างความแตกต่างเลย - person user2662831; 09.08.2013
comment
โชคไม่ดีที่ไม่ได้สร้างความแตกต่าง :/ ฉันได้ลองใช้สคริปต์ PHP กับ exec() เพื่อรันคำสั่ง แต่ก็ยังไม่ได้ผล ไฟล์รูปภาพมีสิทธิ์ 0644 และเป็นของผู้ใช้ที่ฉันพยายามรันสคริปต์ด้วย (ฉันได้ลองใช้รูทแล้ว) ถ้าฉันใช้คำสั่ง file กับเส้นทาง มันจะแสดงเส้นทางและข้อมูลภาพ JPEG มาตรฐาน JFIF 1.01 ดังนั้นไฟล์จึงมีอยู่จริง ฉันอาจจะดาวน์โหลดภาพที่เป็นปัญหาและทำการเปลี่ยนแปลงด้วยตนเอง ปัญหานี้ใช้เวลานานเกินไป ไม่ว่าในกรณีใด ขอขอบคุณสำหรับความช่วยเหลือจนถึงตอนนี้! - person imkingdavid; 09.08.2013