web十大漏洞之文件上传漏洞
·
文件上传漏洞定义
Web应用程序没有对用户上传的文件进行安全判断或者判断条件
不够严谨,导致攻击者将恶意代码文件植入到服务器中从而去执
行解析恶意代码。
文件上传漏洞产生的原因
文件上传限制被绕过
开源编辑器的上传漏洞
特别是上传头像等地方
文 件 上 传 漏 危害
漏洞的危害
执行任意代码:攻击者可以上传包含恶意代码的文件,从而在受
影响的服务器上执行任意命令
横向移动: 通过上传恶意文件,攻击者可以在服务器上建立后门,
从而在网络内部进行横向移动,攻击其他系统。
恶意文件传播: 攻击者可以上传恶意文件,然后将下载链接传播
给其他用户,使得这些用户受到攻击。
破坏文件完整性: 攻击者可以上传恶意文件,修改、删除或篡改
服务器上的文件,破坏文件的完整性。
一些常见的风险点有如下

另外我们需要搭建靶场
upload-labs:
https://github.com/c0ny1/upload-labs
漏洞利用方式
小马 :对应网站开发言编写的动态脚本 体积小 功能少
大马:对应网站开发语言编写的动态脚本 体积大 功能多
一句话木马:代码短只有一行 隐蔽性强
https://github.com/tennc/webshell/blob/master/php/b374k/b37
4k-2.3.min.php
网站控制工具
中国蚁剑
下载配套的加载器:
https://github.com/AntSwordProject/AntSword-
Loader?tab=readme-ov-file
下载源代码:https://github.com/AntSwordProject/antSword
哥斯拉 godzilla
https://github.com/BeichenDream/Godzilla
冰蝎 behinder
https://github.com/rebeyond/Behinder
漏洞绕过方式
接下来我们讲一下如何绕过一些常规的限制,以下所有操作均在文件上传靶场实现
前端验证:绕过JS验证(pass-01)
在谷歌浏览器里面可以设置禁用JavaScript脚本
打开谷歌浏览器,按下f12,点击设置

找到disable Javascript点击,此时就能禁用js,然后就可以文件上传

绕过MIME-Type验证(pass-02)
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩
展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,
当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打
开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开
方式。
这种绕过方式就比较简单打开bp抓包,修改content-type字段为image/jpge

绕过黑名单验证(等价扩展名-pass-03)
fuzz字典 :https://github.com/evi1hack/Fuzz_dic/tree/master
重要提示:
httpd.conf AddType application/x-httpd-php .php .phtml .php3
同样进行抓包,会filename后面文件的后缀进行修改 .php改成php3,然后就能进行上传

另外上面有字典,都是同义后缀名替换
.htaccess文件绕过(pass-04)
htaccess文件是Apache服务器中的一个配置文件
作用范围:.htaccess的用途范围主要针对当前目录。
优先级:较高 可覆盖Apache的主要配置文件(httpd-conf)
生效方式:修改后立刻生效
httpd-conf
服务器的全局行为和默认设置
作用范围:整个服务器
优先级:较低
生效方式:重启服务器后生效
这里我们写一个.htaccess的文件,用记事本打开里面输入如下内容

我们先上传这个文件,然后呢这个意思是将txt和jpg文件解析成php
随后我们上传demo.php,抓包,将.php修改成jpg,然后就可以上传成功

.user.ini绕过(pass-05)
.user.ini(用户自定义配置文件)
特定于用户或特定目录的配置文件,通常位于Web应用程序的根目录下。
它用于覆盖或追加全局配置文件(如·php.ini)中的·PHP.配置选项
php.ini
存储了对整个PHP环境生效的配置选项。它通常位于PHP安装目录中
我们还是创建一个.user.ini文件

随后创建一个1.txt文件,写入一句话木马

上传上面两个文件,.user.ini里面内容会将1.txt解析得到readme.php里面

然后我们在网页里访问文件下面的readme.php,由于上面有一个配置文件,将1.txt内容解析到readme.php,随后网页里存在一句话木马,这时可以使用中国蚁剑链接
绕过黑名单验证(大小写验证-pass06)
Windows系统下,对于文件名中的大小写不敏感。例如:test.php和
TeSt.PHP是一样的,这个利用Windows系统特性与编程语言的特性之间差异
绕过黑名单验证(空格验证-pass-07)
Windows系统下,对于文件名中空格会被作为空处理,程序中的检测代
码却不能自动删除空格。从而绕过黑名单。这个和上面一样,所以我们就不在详细讲
这里‘’.php "相当于".php"
绕过黑名单验证(.号绕过-pass-08)
Windows系统下,文件后缀名最后一个点会被自动去除。这里".php.”相当于".php"
绕过黑名单验证(特殊符号绕过-pass-09)
在Windows操作系统中,当你看到文件名后跟着"::$DATA"时,它表示文件的一个
附加数据流(Alternate DataStream,ADS)。数据流是一种用于在文件内部存储额
外数据的机制
在普通情况下,我们使用的文件只有一个默认的数据流,可以通过文件名访问。但
是Windows NT文件系统(NTFS)支持在文件内部创建额外的数据流,以存储其他信
息。这些额外的数据流可以通过在文件名后面添加"::$DATA"来访问
原理:Windows系统下,如果上传的文件名中test.php::$DATA会在服务器上生成
一个test.php的文件,其中内容和所上传文件内容相同,并被解析。
像这里我们写入两个命令,第一个是将“123"写入到2.txt文件,而第二个文件是将"123"写入到2.txt,并且放入到hello空间里

这里则会生成一个3.php文件,内容就是"123",利用windows这个特性我们上传文件的时候,后面可以加上::$DATA

还是同理我们打开bp抓包修改上传文件后缀如下(我这里是demo.php,后面加上::$DATA)然后就能绕过防守

绕过黑名单验证(路径拼接绕过-pass-10)
在没有对上传的文件进行重命名的情况下,用户可以自定义文件名并在
服务器中上传新建,就会造成对应的绕过黑名单。漏洞绕过方式
这里我们查看源代码

如果我们传入1.php. .,从删除文件末尾点开始,但是他只删了一次点,然后呢就变成了上面上传的1.php. ,随后进行一系列操作最后只剩下一个点
绕过黑名单验证(双写绕过-pass-11)
代码编写过程中,只对黑名单中的内容进行空替换,因为只替换一次所
以造成双写绕过漏洞绕过方式
源码如下

查看其中函数str_ireplace

他的意思是将body列表内容替换成black,在返回文件,其中1.php ,由于php在那个黑名单里面,就会将php替换成空,于是1.就上传不了,其他就没有限制,这里我们可以双写
例如1.pphphp,这样就能绕过了
绕过黑名单验证(空字符-pass-12)
php环境00截断的条件:
1.php版本小于5.3.29
2.magic_quotes_gpc = Off # 这个在php.ini中漏洞绕过方式
这里我们需要知道在搜索框里面输入黑客,在url里面黑客俩个字中间加入%00,最后到搜索框里面只有黑字了这里就是我们的空字符

靶场源码

打开bp抓包在upload后面加入demo.php%00这里和前面原理一样,根据上面的代码,demo.php%00+demo.jpg拼成名字,%00截断后面,最后文件名字为demo.php

同理靶场13关也是这样,upload后加上/aa.php,还要加上空格,选中空格,将其改为00,下面的demo.php改为demo.jpg

其中代码层面0x00 url里面是%00
文件头-字节标识(pass-14)
常见的文件格式头
JPEG/JFIF(常见的照片格式):头两个字节为·0xFF 0xD8
PNG(无损压缩格式):头两个字节为·0x89 0x50
GIF(支持动画的图像格式):头两个字节为·0x47 0x49
BMP(Windows 位图格式):头两个字节为·0x42 0x4D漏洞绕过方式
我们来看看源码

其中有一个PHP韩函数$bin这里读取两个字节,而@unpack是将读取的两个字节转换成整数,也就是从十六进制转到十进制
这里需要用010软件,拖入一个gif文件,可以看到前面两个是89 50 将这两个转换为十进制,就是7173,通过这样的方式,来验证文件后缀,但我们可以写入一个aa.php,随后拖入010,然后呢改掉他前面两个字节,前面两个字节是他的标识,不会影响文件本身内容

这样操作,但是后面会拼接文件名字为aa.jpg,这里需要用到文件包含,打开靶场的文件包含网址,然后呢进入到这个页面,他的意思是传入一个文件参数,就可以解析到网页,这里输入?file=upload/213021391239.png,就会把刚才上传假的png文件解析出来,这里就可以使用蚁剑连接,注意inclucde.php应该是和213021391239.png同级目录

图片马绕过(pass-15)
getimagesize函数
索引0:图像的宽度
索引1:图像的高度
索引2:图像的常量值
索引3:包含图像属性的字符串
图像的常量值:IMAGETYPE_GIF、IMAGETYPE_JPEG、
IMAGETYPE_PNG、IMAGETYPE_PSD、IMAGETYPE_BMP漏洞绕过方式
源码如下

其中getimagesize会返回这个文件的4个参数,索引0-3,其相关含义如上,如果不是图片这个函数会返回false,下面的代码也无法执行,然后用ext接收image_type_to_extension函数对上面getimagesize处理结果第二个参数,得到文件后缀如下

如果是传入一个demo1.php文件,这里后面也会显示false

所以我们需要进行生成图片码,打开windows的cmd窗口,输入如下命令,其意思是1.png文件以字节后面加入3.php文件内容,然后生成hack.php,其中3.php里面是写入了一句话木马

后面将这个hack.png上传,但是也是和前面一样的,打开文件包含页?file=......输入相关文件,这里就不仔细讲了。

另外还有一个方式,打开010软件,拖入一个222.png文件然后呢在里面写入一句话木马,随后进行上传,还是和上面一样的方式

图片的二次渲染(pass-17)
上传的图片与原图片内容不一致漏洞绕过方式
核心代码如下,他的意思是,上传一个图片然后生成新的图片

就比如这里上传后的图片和本地图片有些不一样

依然我们还是通过010软件进行区别,我们将上传后的文件和本地图片进行对比,发现其中有相同部分就是match,以及不同部分就是different,

我们只需要在相同部分加入一句话木马。随后将这个文件进行上传,也是按照上面的文件包含页面进行解析图片,随后就能进行蚁剑连接
条件竞争原理(pass-18)
先上传再删除,在上传到删除之间这几十毫秒之内我们的文件还是在的,
我们就可以访问我们上传的文件。这种就就叫条件竞争漏洞(时间竞争
漏洞),这道题干好符合条件我们就利用时间竞争来做漏洞绕过方式
核心代码如下

其中里面有一句很关键的代码就是if(move_uploaded)这里是先把文件移入服务器里面,然后进行判断,随后对文件进行判断,然后不是允许的文件,对其进行删除
但是在上传这个几十毫秒之间,是可以访问,利用这个时间差,就可以进行蚁剑连接
我们在1.php里面加入以下内容,随后在进行上传,

我们这里写入一个py脚本,对这个文件进行反复访问,这里需要很多次实验,这样成功的可能性大一些

发起请求

同时用bp不断发起上传

两边同时发起请求,多试几次,就能成功,随后就能在这个目录里面写入文件
随后就能进行蚁剑连接
数组后缀绕过(pass-21)
通过代码审计绕过
源码如下

上面还是白名单上传,其中有jpg,png,gif,取上传文件类型进行对比,然后是如果不在名单内,返回禁止上传,
$_file['upload_file']['type']其实就是bp抓包后的content-type,只需对这个进行修改就可以。
下面的三元运算符,如果post里面是空,就返回$_FILES['upload_file']['name'],否则返回$_POST['save_name'];
下面is_array判断是否为数组,如果不是数组,通过点分割,变成一个数组,
$ext =end($file);这里取分割后最后一个元素
随后if (!in_array($ext,$allow_suffix))判断后缀是不是在这个白名单内,如果不在,就禁止上传
$file_name =reset($file)"..$file[count($file)- 1];这里其实是做了文件名字重新拼接,后面拼接好之后,就开始上传

核心代码在这个地方,看能不能伪造$file参数,把$_file伪造成一个不是数组的参数
打开bp抓包,然后第一个修改contant-type后面参数

随后我们利用这个数组特性,给下标为零赋值,下标为二赋值,然后呢count-1,就为空

利用这个特性,我们对于same_name[0]=1.php和same_name[2]=png

same_name接收到参数,不是数组,直接来到下面,取元素最后一个,就是png,随后进行文件拼接,两个拼接元素,第一个就是上面数组第一个元素,而第二个是上面下标减一的元素,其中我们没有对下标为一的元素进行赋值,所以为空,最后文件为1.php进行上传
到此文件上传结束。感谢兄弟们支持
更多推荐
所有评论(0)