记得在你的靶场下面新建一个upload文件夹用来存放你上传的文件,否则会报错。
1.pass01
直接查看页面的源代码,发现这一关只是在前端进行了限制,可以说毫无用处。
<script type="text/javascript">
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;
}
}
</script>
这里的绕过方式有三种:
(1)直接将页面的js代码禁用掉(之前见某位大佬带复制百度文本跳出了付费页面时用了这招,惊呆我了)
右键—检查—调试器—设置—禁用JavaScript,就可以了。
这种方式有个缺陷就是,禁用了网页的js代码导致一些网页的正常功能无法显示,当然这里用来打靶场还是很便捷的。
上传了webshell之后将返回的东西拖出来查看上传的路径,然后就可以用菜刀连接了。
(2)利用burp进行绕过
先利用burp进行代理浏览器(记得打开发送数据包的拦截,一会儿便于寻找),将我们的wenshell的后缀改为页面允许提交的形式,点击提交,发现burp拦截到了我们提交的请求数据包,找到我们提交的文件名,然后修改后缀为原来的,接下来找到上传地址,连接菜刀。。。
(3)直接删除js代码
将页面的源码直接复制到本地(记事本就可),然后删除掉前端限制我们上传的js语句。由于我们复制出来的这些代码是不知道要上传给谁的,所以我们要找到关于上传的代码块,然后添加action属性,告诉代码这个上传的文件要提交给谁。那怎么才能知道文件上传给谁呢,可以通过网络监控得到上传地址(右键—检查—网络—然后上传一个正常的图片。这样我们就可以看到这个文件传给谁了)
<h3>上传区</h3>
<form action="http://127.0.0.1/upload-labs/Pass-01/index.php" enctype="multipart/form-data" method="post" onsubmit="return checkFile()">
<p>请选择要上传的图片:<p>
<input class="input_file" type="file" name="upload_file"/>
<input class="button" type="submit" name="submit" value="上传"/>
</form>
像这样就可以了,然后就是打开我们修改好的HTML文档,上传webshell,接下去就和上面的一样了。建议好好理解这种方法,在实际的上传中会有很多限制,这种方法是相对完美的。
2.pass02
根据源代码我们可以发现,这一关是常见验证中的文件类型验证(在后端进行验证),也就是验证MIME信息。
这里我们利用burp进行抓包,将抓到包的Content-Type修改为允许上传的类型(image/jpeg、image/png、image/gif)三选一。然后发送
查看返回的数据包,发现已经上传成功。然后访问该文件成功!!!
3.pass03
直接查看后端源码,发现这是一个黑名单验证(就是不能够上传的文件),但是如果黑名单定义不完整的话是可以实现绕过的,用.phtml .phps .php5 .pht进行绕过。
php语言除了可以解析以php为后缀的文件,还可以解析php2,php3、php4、php5这些后缀的文件。
在这里我们可以上传一个后缀为.php5的文件,burp查看发现上传成功。
我们还可以试着去访问该文件,成功(这里必须)
4.pass04
这一关我们可以看到,禁止的文件后缀名可太多了。
这种情况,我们可以尝试上传一个.htaccess配置文件,将4.png图片当作php代码进行解析,首先创建一个.htaccess文件(这个文件如果上传到网站的目录里,Apache会读取这个文件,加载到配置文件里),里面写上代码。
<FilesMatch "4.png">
SetHandler application/x-httpd-php
这串代码的意思是如果文件中有一个4.png的文件,他就会被解析为.php,把这个文件上传上去。
接下来我们就可以上传一句话或者图片马来达到目的。
5.pass05
还是先查看源码,发现后台将.hatccess
给过滤了,然后试一下.Php
后缀(在这里说一下,windows对这个后缀的大小写是不敏感的,而Linux是敏感的),结果成功上传。看来这一关是考虑对大小写的绕过。
然后用菜刀连接。
6.pass06
还是查看后端源码,发现和前面几关一样,但是没有对后缀名末尾进行除空格处理。
利用burp进行抓包,然后找到我们上传的文件,在文件末尾加一个空格,然后提交,发现成功。
7.pass07
这一题比前面三题来说,将所有改过滤的都过滤了,这下要想想其他的绕过方法了
没有对后缀名末尾的点进行处理,利用windows特性,会自动去掉后缀名中最后的”.”,可在后缀名中加”.”绕过,这题的考点是.
绕过
8.pass08
windows的特性:
在window的时候如果文件名+"::$DATA"
会把::$DATA
之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA
之前的文件名,他的目的就是不检查后缀名
例如:"phpinfo.php::$DATA"
Windows会自动去掉末尾的::$DATA
变成"phpinfo.php"
查看本关的后台源码,发现并没有删除::$DATA
,直接在文件名后面加上就可以绕过了。