在后续的关卡中,我们致力于绕过文件上传的白名单黑名单限制,成功提交一个一句话木马文件info.php,文件内容:
<?php
phpinfo();
?>
该代码的主要目的是查看目标服务器的php的信息。
点击第一关,并点击查看源码:
分析代码我们知,允许上传的文件类型只有jpg、png、gif三种(均为图片),然后发现使用了lastIndexOf和substring两个函数提取后缀名:
- lastIndexOf是从字符串末尾开始检索,检索到子字符,则返回子字符在字符串中的位置(与之相对,indexof是从字符串开头检索)
- substring函数用于返回子字符串,该子字符串始于指定索引处的字符,一直到此字符串索引末尾。
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;
}
}
在获得后缀名,我们使用Indexof函数进行检索其是否属于允许上传的文件类型。如果不在,则函数返回-1,然后报错。那么我们想到,如果令下面的if语句恒不成立,那么就不会执行后面的报错代码了
按住F12查看页面源码,在源代码中发现页面判断图像类型的script代码:
如果将 allow_ext.indexOf(ext_name) 改为1,这时候if语句恒不成立,那么便可以想穿什么类型就传什么类型:
发现不能在浏览器上直接修改,那么此时ctrl+s直接下载页面,保存到本地:
修改html源码:
将if判断改为 1=-1,恒不成立
然后打开寻改后的html文件:
点击文件上传发现没有反应
我们查看代码,发现两段代码。并发现第二段代码中,sumbit没有定义action,此时我们尝试对其进行修改:
为表单添加submit点击行为,受到第一段代码的启发:
使用" http://192.168.159.145/Pass-01/index.php"作为action的值,保存并打开html进行测试
选择一个php文件,发现能够成功上传,在www/upload文件夹中在也发现了我们上传的文件:
这时,我们右键单击想着复制图片链接(实际是一个php文件):
打开浏览器,复制链接并访问,发现一句话木马运行成功: