常见的文件上传
常见的文件上传(待完善)
1.htaccess文件绕过
① .htaccess是什么? .htaccess文件也被成为分布式配置文件,提供了针对目录改变配置的方法,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。
② .htaccess功能:
文件夹密码保护、用户自定义重定向、自定义404页面、扩展名伪静态化、禁止特定IP地址的用户、只允许特定IP地址的用户、禁止目录列表,很可惜,这么一个强大的功能默认是不开启的
③ 例如:
AddType application/x-httpd-php .jpg 这个指令代表着.jpg文件会当做php来解析
我们发现无法将文件名命名为.htaccess ,那么该怎么办?
可以使用cmd的重命名
ren 17.txt .htaccess
2.大小写绕过
我们可以通过大小写去绕过。WEB容器除非非常老的版本,不然都不区分大小写。
3.文件后缀(空)绕过
在文件名后面留一个空格,然后上传上去后空格会被自动的省略,但是看源码可知道,源码中黑名单中没有过滤空值,那么php和php ,当然是不一样的。
4.文件后缀(点)绕过
windows有一个特性,会自动去掉后缀名最后的。
5. ::$DATA(Windows文件流绕过)
① 这里利用到了NTFS交换数据流(ADS),ADS是NTFS磁盘格式的一个特性,在NTFS文件系统下,每个文件都可以存在多个数据流。通俗的理解,就是其它文件可以“寄宿”在某个文件身上,而在资源管理器中却只能看到宿主文件,找不到寄宿文件。
② 我们肯定不懂这个意思是什么,我们先在CMD运行一个(藏文件的小福利)
echo abcd>>a.txt:b.txt 将abcd写入a.txt:b.txt 很明显生成一个a.txt
然后再试试a.txt::$DATA
::$DATA就是默认不修改文件流的情况
所以生成一个正常的a.txt
利用windows特性,可在后缀名中加” ::$DATA”绕过
6.构造文件后缀绕过
1 $is_upload = false; 2 $msg = null; 3 if (isset($_POST['submit'])) { 4 if (file_exists($UPLOAD_ADDR)) { 5 $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess"); 6 $file_name = trim($_FILES['upload_file']['name']); 7 $file_name = deldot($file_name);//删除文件名末尾的点 8 $file_ext = strrchr($file_name, '.'); 9 $file_ext = strtolower($file_ext); //转换为小写 10 $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA 11 $file_ext = trim($file_ext); //首尾去空 12 13 if (!in_array($file_ext, $deny_ext)) { 14 if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) { 15 $img_path = $UPLOAD_ADDR . '/' . $file_name; 16 $is_upload = true; 17 } 18 } else { 19 $msg = '此文件不允许上传'; 20 } 21 } else { 22 $msg = $UPLOAD_ADDR . '文件夹不存在,请手工创建!'; 23 } 24 }
$file_ext = strrchr($file_name, '.'); 是检测末尾最后是否是. (很明显是为了防御双写.)
我们可以写一个空,最后反正有首尾去空,干完这一切后他才开始进行判断是否是非法文件
我们可以尝试构建一个. . (前面去掉.然后检验.不存在,再去空格,留下php.,然后php.不属于$deny_ext数组中存在的,当然就直接提交了,然后因为windows自动去点,于是乎php后缀就出来了。
7.双写绕过
仔细看源码发现 ,这里的意思就是讲检测到的危险字符替换为空,php被替换为空是空,那么pphphp被替换为空就会变为php,不就达到了绕过。
8.(%00截断):
① 知识点
了解%00实际上我们要先了解0x00,0x00实际上是一个十六进制表示方式,实际上就是表示ascii码值为0,有些函数在处理这个字符的时候会把这个字符当做结束符,他们就读取到这里认为这一段结束了
② 原理
在文件上传时,如果遇到了白名单机制只允许上传jpg后缀的,在没有解析漏洞的情况下我们该怎么办?
JPG格式并不会被解析,那么我们需要绕过上传过滤。
假如我写了1.php%00.jpg 传参之后,有些过滤都是直接匹配字符串,他强行匹配到了结尾是.jpg,然后允许上传,但是php的函数去执行的时候他读取到0x00认为结束了,那么这个文件就变成了1.php
%00实际上和00截断是一模一样的原理,只不过%00是经过URL编码的,%00解码后就是0x00截断的那个字符。
③ 利用实例
1 $is_upload = false; 2 $msg = null; 3 if(isset($_POST['submit'])){ 4 $ext_arr = array('jpg','png','gif'); 5 $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1); 6 if(in_array($file_ext,$ext_arr)){ 7 $temp_file = $_FILES['upload_file']['tmp_name']; //upload_file是上传的文件名,tmp_name是服务器储存的临时目录(系统默认在php.ini中可以设置) 8 $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext; //在GET传参过程中使用00截断 9 10 11 if(move_uploaded_file($temp_file,$img_path)){ 12 $is_upload = true; 13 } 14 else{ 15 $msg = '上传失败!'; 16 } 17 } 18 else{ 19 $msg = "只允许上传.jpg|.png|.gif类型文件!"; 20 } 21 }
前面讲了%00截断,然后我们现在看题目,他会自动重命名,这是个头疼的问题,我们该如何解决。
9.条件竞争
① 知识点
竞争条件”发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中。
开发者在进行代码开发时常常倾向于认为代码会以线性的方式执行,而且他们忽视了并行服务器会并发执行多个线程,这就会导致意想不到的结果。
线程同步机制确保两个及以上的并发进程或线程不同时执行某些特定的程序段,也被称之为临界区(critical section),如果没有应用好同步技术则会发生“竞争条件”问题。
在我理解就是两只哈士奇(线程)同时去抢一个丢出去的飞盘(资源),不知道到底哪只能抢到,此处便形成了竞争。
那我们上传是和谁去竞争?
一般而言我们是上传了文件,上传了但是最后却因为过滤或者因为其他原因被删除了,那么我们可以使用条件竞争,我们实际上是和unlink,是和删除文件的函数进行竞争。
② 实例
假如我不断的上传发包,然后我同时也不断的访问那个我们上传上去的文件的地址,我们就开始和服务器的函数比手速了,函数执行都是要时间的,如果我这边上传上去,且没有删除,那个时间可能很短,然后 被我访问到了,岂不是就可以执行PHP了~我就比服务器手速快了~
你可以上传一个php然后访问后,由这个php去写一个马
<?php $a = '<?php @eval($_REQUEST[\'a\'])?>';file_put_contents('1.php',$a)?>
上传文件
访问文件
10.IIS6.0漏洞
① IIS6.0除了将ASP后缀当做ASP进行解析的同时,当文件后缀名字为.asa .cer .cdx 也会当做asp去解析,这是因为IIS6.0在应用程序扩展中默认设置了.asa .cer .cdx 都会调用 asp.dll
IIS5.1和IIS7.5无此漏洞。
② IIS 6.0在处理含有特殊符号的文件路径时会出现逻辑错误,从而造成文件解析漏洞。这一漏洞有两种完全不同的利用方式:
test.asp;.jpg 他将当做asp进行解析
test.asp/123.jpg 他将当做asp进行解析
③ 请求 /aaa.asp;xxxx.jpg
N1:从头部查找查找 "."号,获得 .asp;xxxx.jpg
N2:查找";"号,如果有则内存截断
N3:查找"/",如果有则内存截断
最终,将保留下来 .asp 字符串,从META_SCRIPT_MAP脚本映射表里与扩展名匹配对比,并反馈给了asp.dll处理
④ put
options 探针服务器信息,返回报文头部会出现allow字段
put 上传文件
move更改文件名
11.apache文件解析问题
在1.x、2.x中,apache对于文件名的解析是从后往前解析的,直到遇到apache认识的文件类型为止,如1.php.rar.rar.rar因为apache不认识rar文件类型所以会一直遍历后缀到.php,然后认为这是一个php的类型文件。(apache认识的文件类型定义在mime.types文件中)。
12.CGI路径解析问题
当访问www.xx.com/phpinfo.jpg/1.php这个URL时,$fastcgi_script_name会被设置“phpinfo.jpg/1.php”,然后构造成SCRIPT_FILENAME(绝对路径)传递给PHP CGI,如果开启了cgi.fix_pathinfo=1选项(这个默认值就是1,所以没有设置过就是开启),那么就会触发在PHP中的如下逻辑:
PHP会认为SCRIPT_FILENAME(绝对路径)是phpinfo.jpg,而1.php是PATH_INFO,所以就会phpinfo.jpg作为PHP文件来解析了.
也是一个逻辑问题,所以说我们只需要在正常的.jpg后面加/.php就可以成功的绕过解析
此漏洞是php用cgi解析造成的,在其他web容器中也有可能存在。
文件上传常见问题汇总
- 图片马制作
-
文件上传对渗透测试的意义
-
文件上传需要做信息收集吗?
-
文件上传是不是只会检测后缀?
-
黑名单和白名单哪个安全?
-
如果只能上传图片,这个上传点是不是没用?
-
只是windows有::$DATA吗?
-
windows忽略大小写,linux?
-
双写绕过常见吗?
-
没有源码怎么测试文件上传漏洞?
-
.htaccess文件绕过这个常见吗?
-
后缀大小写绕过可能存在吗?
-
文件后缀(空和点)绕过适用于什么环境?
-
00截断和%00截断有区别吗?
-
00截断有限制条件吗?
-
有没有把图片打成base64保存到数据库的操作?
-
条件竞争实战可行性?
-
IIs6.0畸形解析漏洞(一)怎么利用?
-
IIS6.0感觉很老呀现在还多吗?
-
CGI解析漏洞仅仅用于Nginx吗?
-
文件上传漏洞就只有靶场的这23个吗?
-
文件上传是不是必须要图片马?
-
我图片马做了,但是上传上去连接不了怎么办?
-
动态脚本语言不同,他们的一句话木马可以通用吗?