媒介
PHP文件包含马脚的产生原因是在经由过程PHP的函数惹人文件时,因为传入的文件名没有经由合理的校验,大年夜而操作了预想之外的文件,就可能导致不测的文件泄漏甚至恶意的代码注入。最常见的就属于本地文件包含(Local File Inclusion)马脚了。
常见马脚代码
if ($_GET['method']) { include $_GET['method'];} else { include 'index.php';}
一般情况下,法度榜样的履行过程是当用户提交url为 https://xianzhi.aliyun.com/sth.php?method=search.php 时,调用search.php琅绫擎的样式内容和功能。直接拜访 https://xianzhi.aliyun.com/search.php 则会包含默认的index.php琅绫擎的样式内容和功能。那么问题来了,如不雅我们提交),且1.jpg是由黑客上传到办事器上的一个图片,并在图片的末尾添加了恶意的php代码,那么恶意的代码就会被当前文件履行,以此触发本地文件包含马脚。
有趣的发明
我和我的好同伙Mike Brooks一向致力于对一些开源的Web框架进行代码审计工作,在对这些Web开源框架代码审计的过程中,我们找到了一种将本地文件包含马脚(LFI)转换为长途文件包含马脚(RFI)的办法。并且依附于我们驻留在Web办事器上的JAR包文件,我们发清楚明了一个可以或许履行随便率性代码的办法。平日情况下,当以特定方法设备Web应用法度榜样时,它将可以或许加载Web办事器上的JAR包文件并在文件中搜刮实现的java类。有意思的是,在Java类中,我们可以在正在被履行的java类上定义一个静态代码块,具体如下所示:
public class LoadRunner { static { System.out.println("Load runner'ed"); } public static void main(String[] args) { }}
如今,我们已经有了两个有趣的发明:一个是可以在加载的JAR文件中插入履行代码,另一个是在Web办事器上找到一个合适的文件路径来加载JAR包文件。是以,我们如今必须找到的一种方法来让应用法度榜样以某种方法引用我们驻留在办事器上的JAR包文件。在这个摸索的过程中,我们测验测验了很多的办法,包含去查看竽暌功用法度榜样中的所有请求处理法度榜样以肯定可否进行文件上传;甚至测验测验寻找可以在办事器上毒化文件的办法,以便将其转化为JAR包文件,然则这些办法却都没有可以或许奏效。尽管如许,我们仍然没有放弃去研究和摸索,最终Mike Brooks想出了一个好主意。
PID并不料味着随机化。无论我们的目标是什么(Ubuntu上的Apache,Fedora上的Nginx等),如不雅我们欲望将其转化为马脚,那么我们可以创建一个本地设置,并查看竽暌闺Web办事器和请求处理法度榜样相接洽关系的PID。一般来说,当我们将办事安装到*nix时,它们将在机械从新启动时以类似的次序启动。因为PID也按次序分派,这意味着我们可以大年夜大年夜削减PID搜刮空间。
文件描述符
一般情况下,大年夜多半Web开源框架都邑将上传的文件落地到办事器的某个磁盘上,但文件的路径是弗成猜测的(平日应用GUID或其他随机标识符来表示),如不雅我们不知道文件路径,那又该若何去拜访上传的文件呢?在Linux中,当一个过程有一个文件被打开时,它将在其 /proc/ 目次中打开一个指向该文件的文件描述符。是以,如不雅我们有一个PID为1234的过程,并且该过程打开了磁盘上的某个文件,那么我们可以经由过程**/proc/1234/fd/***文件描述符来拜访该文件。这意味着,我们不须要猜测GUID或其他随机值,我们只须要猜测HTTP请求处理法度榜样的PID和上传文件的文件描述符即可。因而用于拜访上传文件的搜刮空间就会大年夜幅削减。不仅如斯,如不雅我们已经有了LFI,加上磁盘上那些经常出现的、可以猜测的PID(Web办事器上HTTP请求处理法度榜样的PID)文件,是以获取PID和文件描述符编号要比想象中简单得多。
加载文件描述符
# -*- coding: utf-8 -*-import osfrom flask import Flask, requestUPLOAD_FOLDER = "/tmp"app = Flask(__name__)app.config["UPLOAD_FOLDER"] = UPLOAD_FOLDER@app.route("/", methods=["GET"])def show_me_the_money(): x = request import code code.interact(local=locals())if __name__ == "__main__": app.run()
在这个应用法度榜样中,我们有一个单一的处理法度榜样,该处理法度榜样许可在URL上挂载HTTP GET请求。然后我们在Ubuntu VM中运行这个法度榜样,并经由过程HTTP GET请求将文件上传到该办事器上。对于以前没有应用过 import code 技能的仁攀来说,这是一个很好的办法来调试Python代码和库,因为在 code.interact 被调用时你将进入到python的REPL情况中去。
以下是经由过程HTTP GET请求上传文件的简单脚本:
# -*- coding: utf-8 -*-import requestsresponse = requests.get( "http://127.0.0.1:5000/", files={ "upload_file": open("/tmp/hullo", "rb"), },)
而在 /tmp/hullo 的文件中,我们可以看到很多的“Hello World”:
然后,我们起首运行办事器,之后上传文件,并进入Flask请求处理法度榜样高低文中的python REPL情况,具体如下图所示:
推荐阅读
Wi-Fi 对移动计算的应用产生了巨大年夜的影响,使员工可以在任何处所拜访公司收集,咖啡店也能成为自力工作人>>>详细阅读
本文标题:应对安全漏洞:如何将LFI变为RFI
地址:http://www.17bianji.com/lsqh/37175.html
1/2 1