前言:
我们还是学习Upload-labs靶场。
正文:
第十一关(双写绕过黑名单)
查看一下源代码:
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
//黑名单
$deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess","ini");
//读取上传的文件的名字
$file_name = trim($_FILES['upload_file']['name']);
//如果上传文件的名字有黑名单的内容,就使用空格代替黑名单里面的内容
$file_name = str_ireplace($deny_ext,"", $file_name);
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.$file_name;
这个适合,我们可以尝试一下双写绕过

上传成功

文件名也对。

第十二关(白名单 %00截断)
这个属于白名单绕过,这是php语言自身的问题,php低版本存在的漏洞。查看一下源代码。
if(isset($_POST['submit'])){
//设置一下白名单
$ext_arr = array('jpg','png','gif');
//取出的上传文件的后缀
$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
//如果后缀在白名单中,就开始重新命名
if(in_array($file_ext,$ext_arr)){
//分析代码,这是以时间戳的方式对上传文件进行命名,
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
if(move_uploaded_file($temp_file,$img_path)){
$is_upload = true;
} else {
$msg = '上传出错!';
}
}
//如果后缀不在白名单中,就报错
else{
$msg = "只允许上传.jpg|.png|.gif类型文件!";
}
}
使用上传路径名%00截断绕过,不过这需要对文件有足够的权限,比如说创建文件夹,上传的文件名写成1.jpg(这个随便写,后面的路径相当于对文件进行重命名), save_path改成…/upload/kun12343.php%00 (kun12343.php%00.jpg经过url转码后会变为kun12343.php\000.jpg),最后保存下来的文件就是kun12343.php
前提:
%00截断的限制条件是PHP<5.3.29,且GPC关闭
因为当 magic_quotes_gpc 打开时,所有的 ’(单引号), "(双引号),(反斜线) and 空字符会自动转为含有反斜线的转义字符。
magic_quotes_gpc 着重偏向数据库方面,是为了防止sql注入,
但magic_quotes_gpc开启还会对 $_REQUEST,GET ,_GET,GET,POST,$COOKIE 输入的内容进行过滤
上传一个一句话木马,

上传成功

第十三关(白名单 0x00截断)
这个代码和上一关代码类似
if(isset($_POST['submit'])){
$ext_arr = array('jpg','png','gif');
$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
if(in_array($file_ext,$ext_arr)){
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
if(move_uploaded_file($temp_file,$img_path)){
$is_upload = true;
} else {
$msg = "上传失败";
}
} else {
$msg = "只允许上传.jpg|.png|.gif类型文件!";
}
}
我们试一下

我们看到 ,路径不在url中了,我们使用0x00

将upload后面加上kun12343.php加空格,名字改成jpg格式。点击十六进制,找到我们留的一个空格,将空格改成00

如下:

点击发送

成功上传
第十四关(绕过文件头检查)
将文件头改成GIF的文件头

成功绕过

第十五关(getimagesize())
我们上传kun12343.php,抓包,将Content-Type修改为:image/jpeg。在请求内容开头加上GIF89A点击发送

上传成功。
965

被折叠的 条评论
为什么被折叠?



