WEB2
文件包含
将任何的php文件或者非php文件利用函数包含进php文件之后会被当作php代码解析
PHP提供一些函数来进行各个文件之间的相互引用,并提供了一些协议用于读取或者写入文件
-
特殊文件包含
最常见的使用
include('flag.php')包含flag.php文件(不仅包含也会执行)
-
分类
-
本地文件包含(可以读取与打开本地文件):通过浏览器包含web服务器上的文件,这种漏洞是因为浏览器包含文件时没有进行严格的过滤允许遍历目录的字符注入浏览器并执行。
-
远程文件包含(可以远程加载文件):就是允许攻击者包含一个远程的文件,一般是在远程服务器上预先设置好的脚本。此漏洞是因为浏览器对用户的输入没有检查,导致不同程度的信息泄露、拒绝服务攻击甚至是在目标服务器上执行代码。
-
-
包含一句话木马
将一句话写在一个文件中上传以后,就可以包含文件的php页面包含该文件,直接利用一句话
常见的一句话:eval,用来执行任意 php代码
-
最常见木马
<?php
eval($_POST[1]);
?> -
防爆破木马
-
过狗一句话
-
不用?的一句话
<script language="php">eval ($_POST[hihack]);</script>
-
不用eval的一句话
<?php
assert($_POST[1]);
?> -
变形一句话后门
-
灭杀一句话
<!--?php $x="as"."se"."rt";$x($_POST["pass"]);?-->
-
-
直接包含敏感文件
鉴别题目所用服务器
-
404页面
随便找一个不存在的页面显示出404后,就可以看到服务器类型
-
右键检查抓包
-
包含日志文件
nginx服务器下日志文件的路径
/var/log/nginx/access.log
/var/log/nginx/error.log2nginx 日志文件在用户安装目录的logs目录下如安装目录为/usr/local/nginx,则日志目录就是在/usr/local/nginx/logs里
apache服务器下的日志文件路径
/etc/httpd/logs/access_log1
或者
/var/log/httpd/access_log
/var/log/apache2/error.log //错日志存放
自定义文件路径:/etc/apache2/apache2.conf //查找以 ErrorLog 开头的行如果参数是一句话会发生什么
-
如果直接在url中进行文件包含可能会造成url编码导致不能被识别成php代码,因此可以借用curl,或者burpsuite
-
curl请求的地址进行双引号包含
-
转义特殊字符
-
-
包含session文件(无后缀文件)
session工作原理
-
首先使用session_start()函数进行初始化
-
当执行PHP脚本时,通过使用$_SESSION超全局变量注册session变量
-
当PHP脚本执行结束时,未被销毁的session变量被会自动保存在本地一定路径下的session库中,这个路径可以通过php.ini文件中的session.savapath指定,下次浏览网页时可以加载使用。
session_start()所作的初始工作
-
读取名为PHPSESSID的cookie值,假定为abc123
-
若读取到PHPSESSID这个COOKIE,创建SESSION变量,并从相应的目录中读取SESS_abc123文件,将字符装在SESSION变量中;若没有读取到PHPSESSID这个COOKIE,也会创建$_SESSION超全局变量注册session变量。
-
-
-
任意目录遍历
防御
php.ini当中的配置open_basedir,将可以设置用户需要执行的文件目录,如果设置目录的话,PHP仅仅在该目录内搜索文件。而没有设置时,文件包含漏洞可以访问任意文件。
伪协议读取与包含
结合文件包含函数,伪协议可以读取或者写入文件
-
filter协议:
-
条件:
-
allow_url_fopen:off/on
-
allow_url_include:仅php://input php://stdin php://memory php://temp需要 on
-
-
过滤:是对数据的修改、重整而不是删除
-
recourse参数提供需要修改的数据流
-
read/write参数提供过滤的方法
-
-
-
data协议:
受限于allow_url_include
可以读取数据流,也可以用来执行php代码,可以把data语句认为是一个文件
-
php://input
用于执行POST数据,也可以认为是一个文件。POST数据是内容,常用于rce中
enctype="multipart/form-data" 的时候 php://input 是无效的
说明:
-
需要开启allow_url_include
-
php://input读入请求的POST数据并执行
-
表单确定类别multipart/form-data无法读取无法执行
-
-
zip://&bzip2://&zlib://
-
allow_url_fopen:off/on
-
allow_url_include:off/on
压缩流
-
compress.zlib://file.gz
-
compress.bzip2://file.bz2
-
zip://archive.zip#dir/file.tx
作用:zip:// & bzip2:// & zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名,可修改为任意后缀:jpg png gif xxx 等等。主要用文件包含中上传本地一句话文件,利用include执行
-
-
-
file://
用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响
-
http:// https://
条件:
-
allow_url_fopen:on
-
allow_url_include:on
作用:常规 URL 形式,允许通过 HTTP 1.0 的 GET方法,以只读访问文件或资源。CTF中通常用于远程包含。
-
-
phar://
有些waf不会防php后缀的文件,但是他会检测里面的内容,我们可以通过包含的方式,包含rar后缀或者phar后缀里面的txt文件或者jpg文件达到绕过防护的目的
-
-
-
文件上传
-
没有丝毫过滤
上传php文件,之后访问执行一句话
-
有前端js检验
先上传规定的后缀文件,之后bp抓包,改后缀文件名
-
文件后缀绕过
再服务器限制某些后缀文件不允许上传,但是有些apache是允许歇息其他文件后缀的
可尝试:
.php .php2 .php3 .php5 .phtml
.asp .aspx .ascx .ashx .asa .cer
.jsp .jspx结合apache文件解析机制,从右向左开始解析文件后缀,若后缀名不可识别,则继续判断直到遇到可解析的后缀为止。
-
文件类型检测
-
MIME绕过:Content-Type 字段
判断$_Files["file"]["type"]是不是图片格式(image/gif、imge/jpeg、image\pjpeg),不是则不允许上传。$_Files["file"]["type"]的值是从请求数据包中Content-Type中获取。
-
bp抓包,修改Content-Type: image/png
-
-
文件幻数检测
利用getimagesize()函数获取图片的宽高等信息,如果上传的不是图片,则获取不到信息。
-
绕过方法一:文件头添加
在脚本文件开头补充图片对应的头部值,火灾图片后写入脚本代码
-
绕过方法二:上传图片木马
-
法一:
GIF89a
<?php
phpinfo();
?> -
法二:
图片合并:
命令:
copy 1.jpg/b+phpinfo.php/a hack.jpg
以二进制的方式打开,写入文件 -
法三:
写入到版权当中
-
法四:
直接使用010Editor写入,相当于法三
-
-
-
文件内容特殊字符过滤
常见的过滤
文件内容:
<?php
eval($_POST[1]);
?>过滤了[]用{}替换
<?php
eval($_POST{1});
?>
-
-
零零截断绕过
截断原理:
系统在读取文件名时,如果遇到ascii码为零的位置就停止,而这个ascii码为零的位置在16进制中是00,用0x开头表示0x00,就会认为读取已结束,也就是所说的0x00截断。
截断条件:
php版本小于5.3.4,PHP的magic_quote_gpc为0ff状态
这函数是魔术引号,会对敏感的字符转义,空就会被转义加个反斜杠
注:URL 中的%00系统是按16进制读取文件,URL中的 %00 是被服务器解码为 0x00 而发挥了截断作用。
-
绕过方法
用burp抓包,然后修改
-
GET 方式提交--会自动将 %00 解析为 0x00 ,发挥截断作用
-
POST 方式提交--需要手动将其解码为 十六进制的 00 ,发挥截断作用
-
-
-
.htaccess攻击
上传.htaccess文件
httpd-conf 是APache 系统的配置文件(全局的);.htaccess 文件是 Apache 服务器的分布式配置文件(局部的),该配置文件会覆盖Apache服务器的全局配置,只对 该文件所在目录下的文件起作用。如果一个Web应用程序允许上传.htaccess文件,则说明攻击者可以更改Apache的配置。
缺点:只在apache服务器下起作用
使用条件:Apache目录下:/conf/httpd.conf 中 AllowOverride 为 All 则意味着.htaccess 文件可更改 Apache 配置
-
利用一:将指定后缀文件当作php文件处理
AddType application/x-httpd-php .jpg //会将 jpg 文件当作 php 解析会将 jpg 文件当作 php 解析
或者
2SetHandler application/x-httpd-php //所有文件都会当作php文件解析 -
利用二:文件当中包含php关键字
文件名中只要包含 .php 关键字就当作php处理:phpinfo.php.png
在 .htaccess 文件中写入:
AddHandler php5-script php -
利用三:匹配文件名
匹配文件名:文件名
<FilesMatch "文件名">
SetHandler application/x-httpd-php
</FilesMatch>
-
-
.user .ini攻击
php.ini 是 PHP 的一个 全局配置文件(全局的);
.user.ini 是 PHP的目录配置文件(局部的),相当于用户自己定义的一个 php.ini 文件。
PHP中的每个配置都有其所处的模式。其中允许使用 .user.ini 能够更改的模式有 PHP_INI_PERDIR 和 PHP_INI_USER等等。而 PHP_INI_PERDIR 这个模式当中的 auto_append_file 和 auto_prepend_file 这两个配置对我们有很大帮助。
-
原理:我们可以使用 auto_prepend_file 这个选项,将我们所要上传的图片⻢在该目录下的其它PHP文件执行之前首先 包含 我们所上传的图片⻢。相当于在原有的 PHP文件的代码开头加上了 require('a.jpg') ,从而进行了 文件包含,这样我们的图片⻢就得到了利用。
-
不仅可用于 Apache 服务器,还可以用于 Nginx , IIS 等服务器。
-
使用条件:
-
上传的 .user.ini 目录下必须含有 .php 文件
-
服务器使用CGI/FastCGI模式
-
-
上传.user.ini文件
-
特殊用法一:日志文件包含
auto_prepend_file =/var/log/nginx/access.l
-
特殊用法二:session文件包含
auto_prepend_file=/tmp/sess_test //test要记住
-
-
-
文件上传和文件包含结合
上传文件之后可能访问的时候是通过某一个参数访问,这时就应该想到这个参数适用做文件包含将我们请求的文件包含在当前⻚面,如果当前⻚面是PHP文件那么,我们请求的文件就会当作php文件解析
-
二次渲染
-
png图片二次渲染
直接在png图片的IDTA数据块写入一句话,避免了被修改
生成一张在IDTA数据块写有$GET[0]($POST[1])的一句话木⻢的png图片,上传之后再执行具体原理是IDAT数据块放着png图片的重要信息,一般不会被重新渲染
-
gif图片二次渲染
使用 010将gif图片的最后加上一句话,上传之后,将上传之后的图片下载下来,再次打开010查看,发现原本我们写入的一句话已经消失了。但与之前的图片进行对照,仍有未经渲染(改变)的部分,我们可以讲一句话写入不会被渲染的部分进行上传即可。
-
jpg图片二次渲染
先找一张jpg上传,将上传的图片进行下载,kali运行脚本
010打开查看
写入成功
-
-
条件竞争
一些网站的逻辑是先允许上传任意文件,然后检查上传的文件是否包含WebShell脚本,若果包含就会删除文件。这里存在的问题是文件上传成功之后和删除文件之间存在一个短的时间差(因为要执行检查文件和删除文件的操作),攻击者就可以利用足额个时间差完成竞争条件的上传漏洞攻击
攻击者写上传WebShell脚本 10.pho,10.php的内容是生成一个新的WebShell脚本shell.php
当10.php上传成功之后,客户端立即访问10.php,则会在上级目录下自动生成shell.php
-
upload-lab相关知识
-
黑名单没有完全过滤所有后缀
-
构造php::$DATA绕过 windows中会被认为是php文件解析
-
windows系统中.php.会自动认为是.
-
文件头
JPEG(jpg),文件头:FFD8FF
PNG(png),文件头:89504E47
GIF(gif),文件头:47494638
-
构造图片马命令:
cat 1.png 1.php > 2.php
或者
copy 1.jpg /b + 1.php 14.jpg/b是以二进制的形式复制,合并文件,用于图像类声音类文件
-
move_upload_file问题(upload-19)
move_uploaded_file() 00截断,上传webshell,同时自定义保存名称,直接保存为php是不行的
发现move_uploaded_file()函数中的img_path是由post参数save_name控制的,因此可以在save_name利用00截断绕过
-
-
CTF常见思路
-
找到允许上传的文件类型,抓包
-
在 Content-Type 正确的情况下,首先尝试直接更改 后缀为 .php ,写入一句话木⻢
-
上述不允许的情况下,观察服务器类型,nginx 尝试 .user.ini ,Apache 尝试.htaccess
-
.user.ini 注意该目录下是否已经含有 .php 文件
-
过滤php
-
过滤[]
-
过滤分号
-
日志包含
-
.user.ini 上传不了?尝试文件头写入
GIF89a
-
-
二次渲染
-
后缀类型不可猜测时,.zip 文件上传
-
免杀
-
-
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现