文件上传
前言
二刷文件上传,第一次是基于upload-labs,这次是CTFshow上的题,对旧的东西进行整理,同时get 一些新的知识。
前端绕过
前端JS代码对上传文件名进行了检查,这个时候两种方式
- 禁用JS
- 先改成支持的后缀,然后bp抓包修改
注意: 前端检查是不存在客户端到服务器请求的,抓包抓不到。
后端绕过
文件类型
最常见的就是 bp 抓包 改 content-type 请求头 ,改为 image/png 或 image/jpeg 一般后台可能会对这个进行检测
文件内容
有时候会对文件内容进行检测,有一些方式绕:
加文件头,比如GIF89a
使用PHP短标签,前提是开启了这个配置 <? echo '123';?> 这里是当php被限制时
<?=表达式?> 等效于 <?php echo 表达式?>
<script language="php">echo '123'; </script> 利用 script标签,这里不需要进行参数限制,但是仅限于7.0以下
<% echo '123';%> 需要 前提是开启配置参数asp_tags=on,7.0以下可用。
免杀,网上也有很多:
1 |
|
黑名单
黑名单,顾名思义,就是不允许你上传的后缀名,绕过方法
- 大小写绕过 .Php
- 空格绕过 .php%20
- 双写绕过 .phphpp
- 截断绕过 .php%00
针对于windows服务器的一些方式:
- 点绕过 .php.
- ::$DATA 绕过 .php::$DATA
- 点空格点绕过 .php.%20.
以上这些都是基于后端检查代码不够完善,搞个正则匹配就没这么多事,一般这些方法可能都用不上去。
当然,对于黑名单,还有其他下手的方式,不针对后缀名的绕过,而是直接找另一个后缀名
- 上传htaccess文件 (Apache服务器下)
- 上传 .user.ini文件 (linux和Apache都行)
- 上传其他可以支持解析的后缀 (如 php2 ,php3,php5,phtml)
利用htaccess文件
利用 htaccess文件来实现解析效果:
AddType application/x-httpd-php .png 可以把 .png 格式转换为php格式
或者:
1 | <FilesMatch "png"> |
当然这里的后缀名是可以自己定义的。
利用htaccess文件来实现自动包含:
php_value auto_prepend_file D:\phpStudy\PHPTutorial\WWW\flag.php 这里包含的文件路径可以改。
利用.user.ini文件
利用.user.ini来实现自动包含:
auto_append_file='/var/www/html/upload/2.jpg' 当然这里包含的路径可以改。 不过 .user.ini 有个局限,只对和它在一个目录下的文件有效,所以想利用它,必须得同一目录下 还得有个 php文件。
httpd.conf解析
httpd.conf文件里面有一项是记录可以解析为php的,有些时候支持比如说 php5, phtml等。
白名单
白名单过滤很死,要么配合解析漏洞,要么配合图片马
- 图片马
- 解析漏洞
图片马
这个需要配合包含,否则利用不了,传上去就是个废马。 windows下可以用 copy命令生成图片马
延伸~~~~ 二次渲染图片马
很多时候我们图片马可以上传成功,并且也有包含的地方,but 后台对你的图片马进行了改写,这个时候你精心构造的一句话就无了。
这里有具体的应对方式,核心思想就是利用 二次渲染时 未被改写的地方就是我们考虑写入马的地方。
如果是 gif 形式的图片马,直接download下来 然后和原图对比,找到没被修改的地方,在那个地方构造图片马,然后上传。
png和jpg的话就麻烦的多,参考网上大神的exp :
png的:
1 |
|
关于JPG的:
1 |
|
解析漏洞
根据具体的版本来找到解析漏洞,比如apache、nginx、iis等。有些版本没有。
绕过WAF
之前西湖论剑有一道的第一步上传就是需要绕过WAF。
- 回车换行
- f+orm
- 文件名去掉引号
- 文件名前面加[0x09] 绕过
- ……..
网上搜索可以搜索到很多
小结
文件上传很容易getshell,危害很大。找到上传点,多尝试方法,善用搜索引擎。