文件上传漏洞
文件上传漏洞是开发者在开发功能时没有做足够充分的验证(包括前端和后端),导致用户可以上传恶意文件,比如木马、病毒、恶意脚本和webshell等。
利用条件:
- 能够获取文件上传后的文件名及路径;(有的服务器上传成功后会修改文件名及或者隐藏路径,攻击者首先必须知道文件上传在哪个路径下)
- 服务器能够解析上传的文件:
比如如果上传的文件名为test.php,服务器能解析php代码并执行,那么就能获取webshell,但是如果服务器无法解析php文件,那么该webshell就是无效的。
比如上传的文件名为test.php55,服务器无法解析php55后缀的文件,因此无法利用。
各个webserver服务器能解析的文件格式在配置文件里配置,比如apache2的配置文件是/etc/apache2
路径下的apache2.json
文件,该文件里有如下配置,即apache2会加载mods-enabled目录下的文件,在mods-enabled
文件夹里php.conf
文件则定义了哪种文件后缀可以被php解析器解析
# apache2.json
# Include module configuration:
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf
# php.conf
# 正则表达式配置能解析的php文件后缀
<FilesMatch ".+\.ph(p[345]?|t|tml)$">
SetHandler application/x-httpd-php
</FilesMatch>
绕过方法
思路:进行绕过尝试时,需要判断:
- 是否能控制上传的文件路径
- 是否能控制上传的文件名
黑名单限制绕过
特殊后缀绕过
服务器设置黑名单,比如限制aps、aspx、php等后缀的文件,可以根据服务器类型,判断哪种文件类型后缀能绕过黑名单限制且能被服务器解析来进行后缀绕过。
比如黑名单设置为php asp aspx
,可以尝试php3
特殊后缀:
".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".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绕过
.htaccess文件(分布式配置文件)提供了一种方式,使得配置文件可以随文件夹不同而不同,它配置了网站或文件夹的访问规则。
可以利用 .htaccess文件来绕过限制较为全面的黑名单过滤,白名单过滤无法进行这种方式的绕过。
利用方式:
- 上传 .htaccess文件,文件内容设置为
AddType application/x-httpd-php .test
,即将 .test 文件以php格式进行解析, - 上传一句话木马文件,文件名为
shell.test
,服务器即可以php格式解析shell.test
如果服务器修改上传的文件名,该方法无用
大小写绕过
主要针对黑名单限制,可以把php
改为pHp
原因:
windows平台大小写不敏感,linux平台大小写敏感,但是很多web平台开发人员会为了用户方便将网页配置修改为大小写不敏感,可以以这种方式进行绕过。
空格或点绕过
空格或点绕过,在文件后缀名后加空格或点,windows在存储文件时会自动去掉后面的空格,linux则不行。
比如.php
或.php.
白名单限制绕过
%00截断绕过
利用条件:
- 能够控制文件路径和文件名;
- 服务器在解析文件结尾时以
.
进行判断; - 服务器能成功解析到
%00
。
利用方法:尽量在上传路径中使用,在文件名处使用能绕过前端检测,如果后端继续对文件后缀进行校验,无法绕过。
原理:
在url中 %00代表的是ascii码中的0, 在ascii码中0是特殊字符,会被解析为文件终止符,因此当读到%00时程序会停止继续往下解析。
可以使用burp进行抓包,然后在需要使用%00截断的地方打一个空格,然后切换到hex16进制模式,找到20
字符,修改为00
,这是回到正常编码模式,空格就变为文件终止符了。
一般的文件上传代码示例:
$uploaded_name = $_FILES[ 'file' ][ 'name' ];
$uploaded_ext = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1); // 获取上传文件后缀
$target_name = md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext; // 对上传文件进行重命名
if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" ))
{
move_uploaded_file($_FILES["file"]["tmp_name"], $dir . $target_name); // 将临时文件移动到指定目录
$result = $dir . $target_name;
echo "Stored in: $result";
}
else{
echo "Invalid file";
}
结合上述代码来详解%00截断在文件名中使用和在上传路径中使用的区别:
当在文件名中使用%00时:
假设文件名为test.php
,将文件名修改为test.php%00.jpg
,前端检测到文件名结尾为.jpg,这样可以绕过前端检测,但是后端php substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);
这一行代码对文件名后缀进行了提取,此时%00截断已经发挥了作用,即此时uploaded_ext
是.php
。因此在下面的文件名后缀检验中,后缀名已经是.php
,无法绕过。
即如果在上传文件名中使用%00截断的方法,能否绕过需要看前后端的代码。
当在上传路径中使用%00时:
假设上传路径为./upload
,我们修改上传路径为./upload/test.php%00
,上传的文件名为test.jpg
,这样可以成功上传文件。
代码的前三行都正常运行,获取的文件后缀为.jpg
,服务器生成了随机的文件名,假设为new.jpg
,if语句成功执行。
在If语句里,php代码将上传路径和新生成的文件名进行拼接生成新的文件名,即./upload/test.php%00new.jpg
。然后上传成功。
在接下来访问url时,访问的路径就是http://xxx.com//upload/test.php%00new.jpg
,此时就会发生00截断,浏览器会解析为http://xxx.com/upload/test.php
因此,在实际测试中,%00截断要配合文件上传路径使用效果最好。
00截断编码问题
为什么网上有的%00不用改动,有的却要进行urldecode呢?
因为在上传表单中存在一个enctype的属性,而且在enctype=”multipart/form-data”这里,是不会对表单中的数据进行解码的。
而path(路径)又大多存放在表单中,所以需要对%00进行urldecode
简单粗暴点说,在碰到multipart/from-data的时候,就需要进行urldecode 了。
为什么有的%00不用改动呢?
因为path也有可能直接存在url、cookie里边,在提交数据的时候,浏览器会对数据进行url编码。到服务器,则会对数据进行一次解码操作。
简单些说,path在url、cookie或者上传方式不是multipart/from-data的时候,就不用进行url编码
https://blog.csdn.net/weixin_44840696/article/details/90581104
00截断与%00截断 : 讲了00截断的应用
关于上传中00截断的理解与分析 讲的比较清楚明白
前端验证绕过
有的服务器只在前端进行验证,可以绕过前端的验证
- 通过burp抓包,修改并重放网络包,绕过前端验证
- 删除或禁用js代码进行绕过
服务器解析漏洞绕过
IIS 5.x / 6.0解析漏洞
漏洞1: 当创建.asp的文件目录时,在此目录下的任意文件,服务器都解析为asp文件。
比如 http://www.xxx.com/xx.asp/xx.jpg
会被解析为asp文件
漏洞2: 服务器默认不解析“;”以后的内容
比如http://www.xxx.com/xx.asp;.jpg
会被解析为asp文件
Nginx解析漏洞
低版本的nginx中,php配置文件php.ini
中的cgi.fix_pathinfo
选项默认为开启状态,当url中有不存在的文件时,php会默认向前解析,直到找到能解析的文件。
比如http://www.xxx.com/phpinfo.jpg/1.php
,在服务器中1.php
不存在,会向前解析,解析phpinfo.jpg
文件,但是会以php
的格式进行解析,即解析为phpinfo.php
。
Apache 1.x / 2.x 解析漏洞
Apache从右向左判断文件后缀,跳过非可识别的后缀,直到找到可识别的后缀然后按照可识别的后缀进行解析。
比如http://www.xxx.com/test.php.abc
,apache无法识别abc
后缀,向前识别到php
后缀,最后该文件以php文件格式进行解析
windows文件流特性绕过
windows文件流
文件内容检测绕过
有些系统会检测文件内容,可以将php文件和图片文件进行结合
比如图片文件 test.png,php文件为test.php
执行命令cat test.php >> test.png
,可以将test.php文件成功追加在test.png文件后面且可以执行
有时网上找的图片进行拼接时无法运行php,是因为图片里的有些字符无法被识别,可以删除一些非关键内容,只保留图片的文件头,这样既保存了文件格式,也可以被php解析器解析进行代码执行。
防御方式
文件类型检测
使用白名单、黑名单
安全的函数
使用安全啊的函数
webserver安全配置
熟悉webserver,使用安全的webserver版本,进行安全的配置
漏洞链
有时单一的漏洞无法完成,可以利用多个漏洞结合的方式来完成绕过
比如 文件上传漏洞 + 本地文件包含漏洞
网友评论