xargs 找不到输入文件提供的文件路径
Posted
技术标签:
【中文标题】xargs 找不到输入文件提供的文件路径【英文标题】:xargs cannot find file paths supplied by input file 【发布时间】:2013-08-10 12:22:12 【问题描述】:首先,我不肯定它属于这里而不是 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'],'');
?>
因此,他们将匹配任何内容(包括空主题)的正则表达式 .* 替换为接受 POST 请求并执行给定代码的 PHP 代码。从本质上讲,这允许攻击者在客户端网站上执行他们想要的任何 PHP 代码。所有这些都很有趣,但修复起来很烦人。
PHP 有读取 exif 数据的工具(即 exif_read_data()),我用它来扫描客户端网站上的所有图像文件,并编译一个包含注入恶意 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 命令看起来是文件,并且应该可以在输入文件正常的情况下工作。一个警告:假设任何文件名中没有空格,一切都很好。 我认为您必须提供更多信息。head -3 files_with_malicious_exif.txt | xargs ls -1
的输出是什么?
我在任何文件名中都看不到任何空格(并且在我的文本编辑器中搜索空格字符是空的)。 @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
我用星号审查了部分路径,因为它可以识别我的客户。请注意,“目录”之后的部分似乎在开头被切断(它不是路径的完整开头)。
【参考方案1】:
如果您打算使用 xargs,那么我们可以尝试通过诊断来解决问题,如果您的目标是简单地完成工作,那么下面的小循环将起作用;如果您确实有包含特殊字符的文件名,则只需将 $fixfile 更改为“$fixfile”。
cat files_with_malicious_exif.txt | while read fixfile; do exiftool -make="" -model="" $fixfile; done
【讨论】:
绝对没有设置使用 xargs。那是我能找到的唯一能让我运行命令的东西。 所以我尝试运行该命令,但仍然找不到文件。我已经尝试过使用和不使用前导 ./ 以及使用绝对路径。我不知道问题是什么 尝试使用“$fixfile”而不是 $fixfile 并告诉我这是否有任何不同。 不幸的是,没有什么不同。 :/ 我什至尝试使用带有 exec() 的 PHP 脚本来运行命令,但仍然没有。图像文件具有 0644 权限,属于我尝试执行脚本的用户(我也尝试使用 root)。如果我使用带有路径的file
命令,它会显示路径,然后显示“JPEG 图像数据,JFIF 标准 1.01”。所以文件肯定存在。我最终可能只是下载有问题的图像并手动进行更改。这个问题占用了太多时间。无论如何,感谢到目前为止的帮助!以上是关于xargs 找不到输入文件提供的文件路径的主要内容,如果未能解决你的问题,请参考以下文章
在配置文件“e:/HB/my-project/tsconfig.json”中找不到任何输入。指定的 “include“ 路径为“[“**/*“]”,“exclude“ 路径为“[]”。