文件上传漏洞的目标就是向服务器上传一些服务器可以解析的恶意文件,这类文件可以达到与公鸡者建立连接并执行恶意命令的作用(又名webshell)。其危害之大,早已引起业界的关注。
概述
一句话木ma是一种短小精悍、功能强大、隐蔽性极高的恶意代码。它的工作原理是通过在受害者服务器上植入一段简单的代码,使公鸡者可以远程控制服务器,进行各种恶意操作,如窃取敏感信息、篡改网站内容等。一句话木ma通常被用于黑客公鸡和网站入侵,而且很难被发现和清除。为了绕过网站防火墙WAF的检测,公鸡者通常会对一句话木ma进行变形。
一句话木ma是指一行代码即可实现公鸡的木ma程序。其中,引用中提到的一句话木ma代码为<%eval request("#")%>,而引用中提到的一句话木ma则是将木ma分开写成两行代码,分别为<%Y=request("x")%>和<%execute(Y)%>。需要注意的是,一句话木ma是一种非常危险的公鸡方式,容易被黑客利用进行公鸡。
常用工具
比较常用的就是中国菜刀和cknife、国外的Weevely
Weevely这个工具隐蔽性更高一些
步骤方法
文件上传漏洞是指公鸡者通过上传恶意文件来执行任意代码或获取系统权限的一种攻ji方式。其实现步骤如下:
了解目标网站的文件上传功能,包括上传文件的类型、大小、保存路径等信息。
尝试上传一些常见的文件类型,如jpg、png等,观察是否可以成功上传。
如果上传失败,可以通过抓包工具如burpsuit等,修改上传文件的Content-Type为图片类型,绕过文件类型检查。
如果上传成功,可以尝试上传一些恶意文件,如webshell等,获取系统权限或执行任意代码。
防御文件上传漏洞的方法包括:限制上传文件的类型、大小、保存路径等;对上传的文件进行安全检查,如检查文件头、内容等;对上传的文件进行隔离,如将上传的文件保存在独立的目录下,禁止执行权限等。
连接webshell
连接url问题
我们可以得知文件上传需要七牛云生成的Token才能上传文件,而上传文件的URL也是需要从七牛云获取的。因此,我们需要先获取七牛云的上传URL,然后才能进行文件上传操作。
以下是获取七牛云上传URL的步骤:
首先需要在七牛云上创建一个存储空间(Bucket)。
在创建存储空间时,可以选择存储区域(Zone),不同的存储区域对应的上传URL也不同。
获取上传URL的方式有两种:一种是通过七牛云的API获取,另一种是通过七牛云的SDK获取。其中,使用SDK获取上传URL更加方便。
以下是使用七牛云Node.js SDK获取上传URL的示例代码:
const qiniu = require('qiniu'); // 需要填写你的 Access Key 和 Secret Key qiniu.conf.ACCESS_KEY = 'your access key'; qiniu.conf.SECRET_KEY = 'your secret key'; // 要上传的空间名和文件名 const bucket = 'your bucket name'; const key = 'your file name'; // 构建上传策略函数 const putPolicy = new qiniu.rs.PutPolicy({ scope: bucket + ':' + key, }); // 生成上传 Token const token = putPolicy.uploadToken(); // 获取上传 URL const config = new qiniu.conf.Config(); config.zone = qiniu.zone.Zone_z0; // 存储区域,这里选择华东地区 const formUploader = new qiniu.form_up.FormUploader(config); const putExtra = new qiniu.form_up.PutExtra(); formUploader.putFile(token, key, localFile, putExtra, function(respErr, respBody, respInfo) { if (respErr) { throw respErr; } if (respInfo.statusCode == 200) { console.log(respBody); } else { console.log(respInfo.statusCode); console.log(respBody); } });
1、设置绝对路径
在spring boot项目打成jar包后,可以成功上传。但是根据返回的url,找不到上传成功的文件。这时候我们需要为上传文件设置绝对路径。
#文件上传目录(注意Linux和Windows上的目录结构不同) file: uploadFolder: D:///szzb-welfarework/import/img/zzysj/
注意文件路径最后的 “/”
2、设置虚拟路径,映射访问绝对路径下资源
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { //配置资源映射:设置虚拟路径,访问绝对路径下资源:访问 http://localhost:9090/api/file/xxx.txt访问d:///uploadFiles/下的资源 registry.addResourceHandler("/api/file/**") //虚拟路径 .addResourceLocations("file:" + "D:///szzb-welfarework/import/img/zzysj/"); //绝对路径 } }
3、文件(图片)上传实现
/** * 图片保存路径,自动从yml配置文件中获取数据 */ @Value("${file.uploadFolder}") private String uploadPath; /** * 文件(图片)上传 * @param file 图片文件 */ @SneakyThrows @Override public String uploadFile(MultipartFile file, String projectId, HttpServletRequest request) { //文件原名称 String oldFilename = file.getOriginalFilename(); //图片名后缀:.jpg、.png String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")); //uuid String uuid = UUID.randomUUID().toString(); //文件新名称 String newFileName = uuid + suffix; //创建保存上传文件的文件夹 File folder = new File(uploadPath + newFileName); if (!folder.getParentFile().exists()) { folder.getParentFile().mkdirs(); } //文件写入到该文件夹下 file.transferTo(folder); //获得本机Ip(获取的是服务器的Ip) InetAddress inetAddress = InetAddress.getLocalHost(); String ip = inetAddress.getHostAddress(); //返回保存的url,根据url可以进行文件查看或者下载 String fileDownloadUrl = request.getScheme() + "://" + ip + ":" + request.getServerPort() + "/api/file/" + newFileName; //ps: 在这里可以把路径url存到数据库 //Entity entity = new Entity() //entity.setUrl(fileDownloadUrl); //返回保存的url return fileDownloadUrl; }