一、CTF文件上传漏洞
CTF文件上传漏洞是指在网站文件上传功能中,未对用户上传的文件类型、大小、路径进行限制,或者对用户上传的文件没有做充分的过滤和检查,从而导致攻击者可以上传一些恶意文件(如WebShell)或进行目录遍历等攻击行为,最终达到获取系统权限、敏感信息或非法操作等目的。
攻击者可以通过上传恶意脚本实现以下攻击:
- 网站借此被攻击者利用,例如进行DDoS攻击、挖矿等
- 攻击者注入WebShell,窃取管理员密码或者直接控制服务器
- 攻击者上传病毒文件,破坏服务器稳定性
在防范CTF文件上传漏洞的过程中,需要注意以下几点:
- 在上传文件时,需要确保对文件的格式、大小、路径等进行正确的限制和过滤检查。
- 服务端需要对上传文件的后缀名、文件类型进行检查,防止上传脚本或其他恶意文件。
- 服务端需要设置上传目录,避免攻击者利用路径遍历漏洞上传文件到指定的目录。
- 开启SELinux或者AppArmor,限制文件上传的权限。
二、CTF文件上传如何找路径
攻击者可以通过文件上传功能找到路径,这就需要进行一些黑盒测试。通过对目录遍历的理解,攻击者可以在上传文件时的文件名中携带一些相对路径或者绝对路径,从而绕过服务端的限制,访问到一些敏感目录。
以下是一些路径遍历的常用技巧示例:
..\\..\\..\\..\\..\\..\\..\\windows\win.ini
../../../../../windows/win.ini
../../../../../../../etc/passwd
..%2F..%2F..%2F..%2F..%2F..%2Fetc/passwd
如果上传路径存在漏洞,攻击者可以通过这种方式逐层遍历上级目录,进而获取到更敏感的信息。
三、CTF文件上传绕过JS
很多前端在文件上传时会检查一些文件的扩展名来做一层判断,避免上传不安全的文件。比如,常见的图片文件的扩展名包括jpg、gif、png等,如果用户上传的文件不是这些类型之一,前端会提示用户上传不合法。
攻击者可以通过绕过JS进行上传防护机制:“上传”按钮可禁用,但用户可以通过其他方式上传文件。
例如:在输入框中上传文件及上传后将文件内容复制进去,在本地端编写包涵图片链接的html文件,最后将html文件上传到服务器。这样,即使前端对图片格式做了限定,攻击者也可以通过反编译html代码获取图片链接,进而获取到敏感信息。
四、CTF文件上传绕过
除了JS限制外,还有其他一些方法可以绕过文件上传检测。例如,有些服务器会忽略文件名后缀而判断MIME类型,如果攻击者修改了文件的扩展名并禁止MIME类型检测,即可进行文件上传绕过。
此外,有时候攻击者会在上传时篡改Content-Type,并携带危险的文件类型。
以下是常见的上传绕过方式:
- 修改文件后缀名
- 篡改Content-Type
- 使用Content-Disposition以替换文件名
- 通过Content-Transfer-Encoding实现文件上传
五、CTF文件上传题目
CTF比赛中,文件上传题目是一个常见的考点。需要选手通过上传恶意文件来获取网站的flag,从而赢得比赛。
以下是一个简单的CTF文件上传题目的 PHP 代码:
<?php
if(isset($_POST['submit'])){
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
$uploadOk = 0;
}
if ($uploadOk == 0) {
echo "Sorry, your file was not uploaded.";
} else {
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
} else {
echo "Sorry, there was an error uploading your file.";
}
}
}
?>
这个例子中,文件上传路径为uploads目录,仅允许上传JPG、PNG、JPEG和GIF格式的文件。如果上传成功,页面会提示上传成功信息,否则会提示上传失败。
六、CTF文件上传只能是图片
在有些情况下,只允许上传图片时,可以使用以下方式实现上传图片功能。
<?php
if(isset($_POST['submit'])){
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
// Check if image file is a actual image or fake image
if(isset($_POST["submit"])) {
$check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
if($check !== false) {
echo "File is an image - " . $check["mime"] . ".";
$uploadOk = 1;
} else {
echo "File is not an image.";
$uploadOk = 0;
}
}
// Check if file already exists
if (file_exists($target_file)) {
echo "Sorry, file already exists.";
$uploadOk = 0;
}
// Check file size
if ($_FILES["fileToUpload"]["size"] > 500000) {
echo "Sorry, your file is too large.";
$uploadOk = 0;
}
// Allow certain file formats
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
$uploadOk = 0;
}
// Check if $uploadOk is set to 0 by an error
if ($uploadOk == 0) {
echo "Sorry, your file was not uploaded.";
} else {
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
} else {
echo "Sorry, there was an error uploading your file.";
}
}
}
?>
除了支持JPG、PNG、JPEG和GIF格式外,上面的代码还支持检查文件是否存在、文件大小限制等。在检查到上传文件不是图片时,前端会提示用户上传不合法。
七、CTF文件上传经典题目
以下是一个基于文件上传漏洞的CTF经典题目:上传并执行WebShell。
这个题目的思路是在文件上传的同时,通过一些漏洞透过文件系统进行WebShell注入,最终获取到服务器的权限。
以下是一个PHP代码示例:
<?php
$uploadfile=$_FILES["file"]["tmp_name"];
$target = "/uploads" . basename($_FILES['uploaded']['name']) ;
if(move_uploaded_file($_FILES['uploaded']['tmp_name'], $target)) {
echo "The file has been uploaded.";
exec($uploadfile);
} else{
echo "Sorry, there was a problem uploading your file.";
}
?>
以上代码中,通过move_uploaded_file()将上传的文件移动到服务器的/uploads目录中,并利用exec()来执行上传的文件,即可在服务器上执行恶意代码(WebShell),攻击者可通过WebShell获取Web目录下文件、服务器系统信息和管理员权限等。
八、CTF文件上传无限制
如果服务器端不存在对上传文件的限制,那么攻击者将有机会上传一个超级大的文件,从而导致服务器出现拒绝服务(DOS)现象。
以下是PHP上传脚本无限制代码示例:
<?php
$folder = "uploads/";
move_uploaded_file($_FILES["file"]["tmp_name"], "$folder".$_FILES["file"]["name"]);
echo "File uploaded successfully.";
?>
如果在没有限制的情况下,可以使用关于“Part file upload”或“范围请求”之类的HTTP POST请求,将文件分块上传,从而上传非常大的文件。
九、CTF文件上传无限制找flag
以下是一种通用的无限制找flag的方法,设置PHP文件上传路径与上传flag,可以获取到服务器上的flag文件。
以下是PHP代码示例:
<?php
if(isset($_POST['submit'])){
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
if ($uploadOk == 0) {
echo "Sorry, your file was not uploaded.";
} else {
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
$content = file_get_contents('flag.txt');
echo $content;
} else {
echo "Sorry, there was an error uploading your file.";
}
}
}
?>
上述代码中,当上传文件成功时,会打印出flag文件的内容。这个方法完全依赖于服务器的漏洞,需要在存储flag的目录中加入php上传脚本,在提交文件时获取flag文件内容。
原创文章,作者:MPSHR,如若转载,请注明出处:https://www.506064.com/n/317677.html