linux - xargs 找不到输入文件提供的文件路径

标签 linux xargs

首先,我不确定它属于这里而不是 ServerFault 或其他地方。如果它属于那里,我很抱歉。

无论如何,这是关于我的问题的一些背景知识。我在一家管理各种客户网站的公司工作,我们接待的一个客户的网站上有很多需要删除的恶意软件。现在,在过去的几周里,我学到了很多关于使用 grep、find、xargs 等来查找具有特定文件名、文件大小以及包含特定字符串或文本模式的文件并对其执行操作的知识。

我们发现的一个问题是一些图像被注入(inject)了恶意的 exif 数据(基本上,Make 属性是 /.*/e 而 Model 属性是 的效果) eval(base64_decode(...)); 其中编码字符串是一个 PHP 脚本,它允许攻击者发送具有特定属性的 POST 请求,然后通过 eval() 运行来自该属性的输入。然后, 他们将以下代码注入(inject)到另一个 PHP 脚本中。

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

因此,他们将匹配任何内容(包括空主题)的正则表达式 .* 替换为接受 POST 请求并执行给定代码的 PHP 代码。从本质上讲,这允许攻击者在客户端的网站上执行他们想要的任何 PHP 代码。所有这些都很有趣,但修复起来很烦人。

PHP 有读取 exif 数据的工具(即 exif_read_data()),我用它扫描了客户网站上的所有图像文件,并编译了一个包含注入(inject)了恶意 exif 数据的图像列表。但是,PHP 没有配备修改该数据的方法。因此,我做了一些研究,发现有一个名为“ExifTools”的 Linux 程序可以让您更改 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 数据中的那两项已被清除。

但是被感染的文件数量相当多,我不想逐个文件地对每个文件运行命令。

我尝试使用绝对路径并从文件名中删除“./”。我正在从正确的目录运行,以使相对路径起作用(第二个命令确实使用相对路径这一事实证明了这一点),但它仍然找不到任何文件。

有什么事情我忘了做或做的不对吗?

最佳答案

如果您打算使用 xargs,那么我们可以尝试通过诊断来解决问题,如果您的目标是简单地完成工作,下面的小循环将起作用;如果您确实有包含特殊字符的文件名,则只需将 $fixfile 更改为“$fixfile”。

cat files_with_malicious_exif.txt | while read fixfile; do exiftool -make="" -model="" $fixfile; done

关于linux - xargs 找不到输入文件提供的文件路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18131946/

相关文章:

linux - Linux 上 scp 的协议(protocol)不可用错误

bash - 获取 xargs 到分词占位符 {}

linux - 如何在多个主机上使用 ssh 和 xargs 运行 bash 脚本而不将脚本复制到每个主机?

bash - 手动指定输入时,如何对 xargs 使用 -0 选项?

linux - 删除多个子目录中的部分文件名

linux - 带 Buildroot 的文件系统 - 网络和键盘问题

unix - 如何使用 xargs 将特定文件从一个目录移动到另一个目录?

linux - 我如何使用 xargs 从我的 html 文件创建软链接(soft link)?

linux - Electron :linux start at boot up system

linux - 在 shell 脚本中获取逗号分隔值