以下是文件上传漏洞的基本原理:
一句话木马
可执行脚本的文件后缀名,可被网站目录解析。以下是常见的后缀名
asp
asa
cdx
cer
php
aspx
ashx
jsp
php3
php.a
shtml
phtml
有些网站会对 asp 或者 php 进行过滤转成空可用这些后缀名。
aspasp asaspp
phpphp
一句话木马可以让服务器执行入侵者指定的命令
php的一句话木马:
asp的一句话是:
aspx的一句话是:
文件上传时,用户选择文件时,或者提交时,有些网站会对前端文件名进行验证,一般检测后缀名,是否为上传的格式。如果上传的格式不对,则弹出提示文字。此时数据包并没有提交到服务器,只是在客户端通过 js 文件进行校验,验证不通过则不会提交到服务器进行处理
有些上传模块,会对 http 的类型头进行检测,如果是图片类型,允许上传文件到服务器,否则返回上传失败。因为服务端是通过content-type 判断类型,content-type 在客户端可被修改。则此文件上传也有可能被绕过的风险
上传模块,有时候会写成黑名单限制,在上传文件的时获取后缀名,再把后缀名与程序中黑名单进行检测,如果后缀名在黑名单的列表内,文件将禁止文件上传
上传图片时,如果提示不允许 php、asp 这种信息提示,可判断为黑名单限制,上传黑名单以外的后缀名即可。 在 iis 里 asp 禁止上传了,可以上传 asa cer cdx 这些后缀,如在网站里允许.net执行 可以上传 ashx 代替 aspx。如果网站可以 执行这些脚本,通过上传后门即可获取 webshell。 在不同的中间件中有特殊的情况,如果在apache可以开启application/x-httpd-php, 在 AddType application/x-httpd-php .php .php3 .phtml后缀名为.phtml、.php3均被解析成php,有的apache版本默认开启。 上传目标中间件可支持的环境的语言脚本即可,如.phtml、php3
上传模块,黑名单过滤了所有的能执行的后缀名,如果允许上传.htaccess。htaccess文件的作用是可以帮我们实现包括文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定 IP 地址的用户、只允许特定 IP 地址的用户、禁止目录列表,以及使用其他文件作为index文件等一些功能。在.htaccess里写入SetHandler application/x-httpd-php,则可以文件重写成php文件。 要 htaccess 的规则生效,则需要在apache开启rewrite 重写模块,因为apache是多数都开启这个模块,所以规则一般都生效
上传攻击
上传.htaccess到网站里,.htaccess 内容是
SetHandler application/x-httpd-php
再上传恶意的jpg到.htaccess相同目录里,访问图片即可获取执行脚本,当图片上传成功之后,即使格式是jpg的,也一样会被当成php脚本执行
有的上传模块后缀名采用黑名单判断,但是没有对后缀名的大小写进行严格判断,导致可以更改后缀大小写可以被绕过
自 PHP 5.3.0 起,PHP 支持基于每个目录的 .htaccess 风格的 INI 文件。此类文件仅被 CGI/FastCGI SAPI 处理。此功能使得 PECL 的 htscanner 扩展作废。如果使用 Apache,则用 .htaccess 文件有同样效果
.user.ini原理
.user.ini中两个中的配置就是_auto_prepend_file_和_auto_append_file_。这两个配置的意思就是:我们指定一个文件(如1.jpg),那么该文件就会被包含在要执行的php文件中(如index.php),相当于在index.php中插入一句:require(./1.jpg)。这两个设置的区别只是在于auto_prepend_file是在文件前插入,auto_append_file在文件最后插入。
利用.user.ini的前提是服务器开启了CGI或者FastCGI,并且上传文件的存储路径下有index.php可执行文件
利用.user.ini的环境
有时候我们进行文件上传的时候,站点不仅在前端做了白名单处理,还在后端做了黑名单处理以及文件类型的检验且服务器没有配置"AddType application/x-httpd-php .php .phtml",这时我们就不能通过简单的绕过前端验证修改数据包的 Content-Type 并将文件后缀改为 phtml 以此来利用文件上传漏洞
这时我们就需要利用.user.ini进行配合,使得我们上传的图片格式的webshell也能够被解析,以此成功利用漏洞拿到shell权限
auto_append_file=demo.jpg
该文件意思是无论访问当前目录下哪个 PHP 文件都会自动去包含 demo.jpg 这个文件
在上传模块里,采用黑名单上传,如果没有对空格进行去掉可能被绕过
在 windows 中文件后缀名的点“.”,系统会自动忽略。所以shell.php.和shell.php的效果一样。可以在文件名后面加上.绕过
如果后缀名没有对::$DATA 进行判断,利用 windows 系统 NTFS 特征可以绕过上传。 在window的时候如果文件名+::$DATA
会把::$DATA
之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA
之前的文件名,他的目的就是不检查后缀名
例如:phpinfo.php::$DATA
Windows会自动去掉末尾的::$DATA
变成phpinfo.php
在Windows操作系统中,文件系统有一定的规则来处理文件名。当一个文件以特定的方式命名时,比如 phpinfo.php:.jpg
,Windows可能会截断或忽略文件名中某些特殊字符后面的部分。这是因为 :
在Windows中是一个用于表示卷标或驱动器的特殊字符,而在文件名中通常不被允许。当你尝试上传一个名为 phpinfo.php:.jpg
的文件时,Windows可能会将文件名截断为 phpinfo.php
,因为 :
后面的部分被视为对文件系统的指令,而不是文件名的一部分。这样,就会在目录下创建一个名为 phpinfo.php
的空白文件
Windows的文件系统中,以下符号在正则匹配时可能被视为相等:
"
等于 点号 .
>
等于 问号 ?
等于 星号 *
文件名.、
文件名.、
文件名.>>>
或 文件名.>> 时,这些是在尝试利用Windows文件系统的特性来创建特殊的文件名,这些文件名会在文件系统中被解释为不同的东西,或者导致文件名的一部分被忽略
在上传模块,有的代码会把黑名单的后缀名替换成空,例如 a.php 会把 php 替换成空,但是可以使用双写绕过例如 asaspp,pphphp,即可绕过上传
目录可控是指在文件上传功能中,我们可以控制文件上传的目录路径。在某些情况下,即使服务器使用了白名单来验证上传文件的扩展名,攻击者仍然可能通过目录控制来绕过安全措施
截断原理:在C语言和许多基于C的编程语言中,字符串以空字符(NULL,即 %00
)结尾。如果服务器端的代码在处理文件名时没有正确处理空字符,攻击者可以在文件名的某个位置插入 %00
,使得服务器在处理文件名时只看到 %00
字符之前的部分
绕过白名单: 假设服务器使用白名单验证上传文件的扩展名,只允许 .jpg
、.png
等图片格式。如果攻击者可以控制上传路径,并且服务器在处理路径时没有正确地过滤 %00
字符,攻击者可以构造一个特殊的文件名,例如 malicious.php%00.jpg
上传攻击:
malicious.php%00.jpg
malicious.php
,因为它在 %00
字符处停止读取字符串.jpg
),它可能会认为这是一个合法的图片文件,并将其保存到服务器上malicious.php
,这是一个PHP脚本文件,而不是图片上面是 GET 请求的,可以直接在 url 输入%00 即可截断,但是在 post 下直接注入%00 是不行的,需要把%00 解码变成空白符,截断才有效。才能把目录截断成文件名
有的文件上传,上传时候会检测头文件,不同的文件,头文件也不尽相同。常见的文件上传图片头检测,它检测图片是两个字节的长度,如果 不是图片的格式,会禁止上传,常见的文件头:
FF D8 FF
89 50 4E 47 0D 0A 1A 0A
47 49 46 38
(GIF89a) 或者 47 49 46 38 37 61
(GIF87a)%PDF-
50 4B 03 04
(压缩的ZIP文件) 或者 50 4B 05 06
(未压缩的ZIP文件)D0 CF 11 E0 A1 B1 1A E1
50 4B 03 04 14 00 06 00
D0 CF 11 E0 A1 B1 1A E1
50 4B 03 04 14 00 06 00
D0 CF 11 E0 A1 B1 1A E1
50 4B 03 04 14 00 06 00
49 49 2A 00
(小端) 或者 4D 4D 00 2A
(大端)49 44 33
后面通常跟着 2E 00
或者其他标识版本和层的信息52 49 46 46
(RIFF) 紧接着是 41 56 49 20
(AVI )42 4D
getimagesize 是获取图片的大小,如果头文件不是图片会报错直接可以用图片马绕过检测
有些图片上传,会对上传的图片进行二次渲染后在保存,体积可能会更小,图片会模糊一些,但是符合网站的需求。例如新闻图片封面等可能需要二次渲染,因为原图片占用的体积更大。访问人数太多时候会占用很大带宽。二次渲染后的图片内容会减少,如果里面包含后门代码,可能会被省略。导致上传的图片马,恶意代码被清除
绕过方式:
首先判断图片是否允许上传 gif,gif 图片在二次渲染后,与原图片差别不会太大。所以二次渲染攻击最好用 gif图片马。 制作图片马: 将原图片上传,下载渲染后的图片进行对比,找相同处,覆盖字符串,填写一句话后门,或者恶意指令。 使用工具:HxDHexEditor2.3.0.0
条件竞争漏洞(Race condition)官方概念是——竞争条件发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中。服务器对上传文件的操作大多数都是单线程处理,当我们执行多个线程时可以绕过一些服务器端的防御。 这里使用了unlink函数来删除不符合的文件,但代码执行的过程是需要耗费时间的。如果我们能在上传的一句话被删除之前访问就可以了。这个也就叫做条件竞争上传绕过
判断是否为黑白名单,如果是白名单 寻找可控参数。如果是黑名单禁止上传,可以用有危害的后缀名批量提交测试,寻找遗留的执行脚本
.php
.php5
.php4
.php3
.php2
.html
.htm
.phtml
.pht
.pHp
.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
使用 burpsuite 抓包上传将后缀名设置成变量,把这些文件设置成一个字典批量提交
在PHP中,如果程序不严格验证用户输入,攻击者可能会通过提供非预期的数组结构来绕过安全限制。在该PHP代码示例中,存在一个安全漏洞,因为它直接使用了用户通过GET请求提供的save_name
参数,而没有进行适当的验证
$file
变量进行任何形式的验证,直接使用用户输入可能会导致安全问题reset($file)
函数返回数组的第一个元素$file[count($file) - 1]
尝试获取数组的最后一个元素如果攻击者控制了$file
数组,他们可以通过以下方式绕过文件类型检查:
.php
(或其他可执行文件扩展名).
,攻击者可以利用这一点来绕过文件扩展名的限制假设攻击者发送以下GET请求:
http://example.com/upload.php?save_name[0]=image-20240128185152767&save_name[2]=php
在这个例子中,reset($file)
将返回image-20240128185152767
,而$file[count($file) - 1]
将返回php
。生成的文件名将是image-20240128185152767.php
。
在Windows中,如果文件名以.
结尾,系统会自动删除这个.
,所以如果攻击者发送:
http://example.com/upload.php?save_name[0]=image-20240128185152767&save_name[2]=
生成的文件名将是image-20240128185152767.
,Windows会将其保存为image-20240128185152767
,没有扩展名。
参与评论
手机查看
返回顶部