源码分析
抓包
把Content-Type改为image/jpeg
分析源码,在黑名单列表的后缀为asp,aspx,php,jsp
抓包修改特殊后缀phtml
成功上传
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".ini");
$file_name = trim($_FILES['upload_file']['name']);
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.');
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //收尾去空
if (!in_array($file_ext, $deny_ext)) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.$file_name;
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = '此文件不允许上传!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
查看源码,可以看到,黑名单里php、php5等这种后缀全部不允许上传,但并没有限制.htaccsess文件。故可以上传.htaccsess文件绕过
SetHandler application/x-httpd-php
设置当前目录所有文件都使用PHP解析,那么无论上传任何文件,只要文件内容符合PHP语言代码规范,就会被当作PHP执行。不符合则报错。
然后上传
接下来再上传图片马,就可以进行解析。
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
$file_name = trim($_FILES['upload_file']['name']);
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.');
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //首尾去空
if (!in_array($file_ext, $deny_ext)) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.$file_name;
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = '此文件类型不允许上传!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
这里再过滤了.htaccess,但是还有个ini配置文件可以利用。
可以理解为在运行php文件时都会先运行的一个配置文件,他可以修改一些配置信息,而不用修改php.ini
auto_prepend_file=1.gif
所有的php文件都自动包含1.gif文件。.user.ini相当于一个用户自定义的php.ini。
然后上传
接下来再上传1.gif图片马,就可以进行解析
发现没有将后缀进行大小写统一,于是可以通过大小写绕过。
用burp将后缀改为大写PHP即可。
Windows系统下,对于文件名中空格会被作为空处理,程序中的检测代码却不能自动删除空格。从而绕过黑名单。
针对这样的情况需要使用Burpsuite截断HTTP请求之后,修改对应的文件名 添加空格,即可成功绕过。
查看源码,发现没有删除文件名末尾的点。
针对这样的情况需要使用Burpsuite截断HTTP请求之后,在对应的文件名后面添加. 即可成功绕过。
查看源码,发现没有过滤掉 :: D A T A 。 使 用 B u r p s u i t e 截 断 H T T P 请 求 之 后 , 在 对 应 的 文 件 名 后 面 增 加 : : DATA。 使用Burpsuite截断HTTP请求之后,在对应的文件名后面增加:: DATA。使用Burpsuite截断HTTP请求之后,在对应的文件名后面增加::DATA,上传成功。
分析源码,可以看出上传后的文件没有经过随机化重命名,而是直接拼接,然后保存在服务器上,这就给了我们机会绕过黑名单。
选择10.php文件进行上传,抓包后构造文件后缀为php. .(去点号再去空格,windows再去一个点号),成功绕过。
查看源码后,发现其对存在黑名单中的字符进行替换,但str_ireplace()函数只替换一次,因此修改文件名为11.pphphp后成功绕过。
0x00是十六进制表示方法,是ascii码为0的字符,在有些函数处理时,会把这个字符当做结束符。
系统在对文件名的读取时,如果遇到0x00,就会认为读取已结束。
在PHP5.3之后的版本中完全修复了00截断。并且00截断受限与GPC,addslashes函数。
查看源码和提示,上传路径可控,并且是最终文件的存放位置是以拼接的方式,可以使用%00截断。
将1.jpg上传,抓包后修改URL,成功上传。
post型的00截断
在post请求中,%00不会被自动解码,需要在16进制中修改00
上传webshell.jpg
在服务端的PHP代码中,对于用户上传的文件做文件类型检查,查看文件格式是否符合上传规范。可以检查文件二进制格式的前几个字节,从而判断文件类型是否正确。
GIF98A
phpinfo();
?>
接下来结合文件包含漏洞进行测试
upload-labs中提供了一个include.php文件
利用include.php再文件包含pass14.gif
成功绕过
分析源码,这里对文件先进行上传,后进行判断与删除。
利用时间差在它删除之前进行webshell上传。
为了使实验效果更加明显,在源码加入sleep(2),让它等待2秒
用python提前不断访问代码文件
上传文件代码,把一句话木马写进一个shell.php的新文件里
成功上传
同样是上传路径可控,可以使用和Pass-13同样的方式绕过。不同的是这里的黑名单,可以文件名称保存的时候,加上.,最末的.号使得pathinfo()获取到的PATHINFO_EXTENSION为空,从而绕过黑名单.
参考添加链接描述
1.Apache解析漏洞介绍
因为Apache认为一个文件可以拥有多个扩展名,哪怕没有文件名,也可以拥有多个扩展名。Apache认为应该从右到左开始判断解析方法的。如果最右侧的扩展名为不可识别的,就继续往左判断,直到判断到文件名为止。
2.还有IIS6.0这个历史坑的漏洞
1.黑白名单;
2.对上传的文件重命名,不易被猜测;
3.对上传的内容进行读取检查;
4.不要暴露上传文件的位置;
5.禁用上传文件的执行权限;