文件上传漏洞(upload-labs)

文件上传漏洞包括解析漏洞CMS漏洞编辑器漏洞CVE漏洞

1.CMS文件系统文件上传漏洞:通达OA漏洞。
2.编辑器漏洞:常见编辑器有ueditor、fckeditor、ckfind、kindeditor等。
3.CVE漏洞:(CVE-2017-15715)Apache换行解析漏洞,在2.4.0-2.4.29版本中存在。在解析php时,.php.\x0A将被按照php后缀进行解析,导致绕过一些服务器的安全策略。
4.解析漏洞:
⑴IIS在解析文件时存在以下两个漏洞: ①当建立
.asa、.asp格式的文件夹时,其目录下的任意文件都将被IIS当做asp来解析。 ②当文件为.asp;1.jpg时,IIS 6.0同样会以asp脚本来执行。
⑵Apache解析漏洞:解析到不认识的扩展名,将会从后向前解析,直到碰到认识的扩展名为止,如果都不认识,则会暴露源代码。
⑶PHP CGI 解析漏洞(Nginx与PHP配合很容易造成这种解析漏洞,所以常被认为是Nginx解析漏洞)。在PHP配置文件中有一个关键的选项:cgi.fi:x_pathinfo,这个选项在某些版本中是开启的,选项开启时访问URL,URL后加*.php,*.php是不存在的文件,则PHP会向前递归解析造成解析漏洞。

Web网站上传页面查找:
①可用御剑扫描敏感目录,获得网站上传页面。
②搜索引擎关键字 site:load.php等。

upload-labs(1-20关)

pass-01(前端JS验证):删除checkfile()函数或浏览器禁用JavaScript(不推荐)。
pass-02(MIME检验):用bp抓包改 content-type类型。

pass-03~pass-11

(黑名单验证):模糊测试,可用fuzz字典(所有可用于绕过上传漏洞的后缀名),使用bp爆破得到能绕过验证的可用后缀名。

所涉及的函数及知识点:

1.trim()函数可以去除字符串首尾空白字符,或其他不可见字符,常用的不可见字符包括制表符’\t’、换行符’ \n ‘、回车符’\r’、空字节符’\0’和垂直制表符’\v ‘。
需要注意的是,trim()只能处理开头和结尾的空白符,而不能处理字符串中间包含的空白符。
2.deldot()从字符串的尾部开始,从后向前删除’.’,直到该字符串的末尾字符不是’.'为止遇到空格会停下。 strrchr()
函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。使用该函数得到后缀名。
3. strtolower()转换为小写。
4.str_ireplace(find,replace,string,count),find必需,规定要查找的值。replace必需,规定替换
find 中的值的值。string必需,规定被搜索的字符串。count可选,一个变量,对替换数进行计数。
5.Windows中如果文件名以点或空格结尾,系统会自动去除点或空格。
6. .htaccess文件是Apache服务器中的一个配置文件,负责相关目录下的网页配置。通过htaccess文件,可以实现网页301重定向、自定义404页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
7.htaccess文件使用前提条件:Apache配置文件httpd.conf开启rewrite模块(默认开启)。
Apache配置文件httpd.conf为AllowOverride All(默认为None)。

pass-03:可用后缀名.php3 .php5 .phtml .htaccess等绕过。但要使用phtml、php3、php4、php5等后缀名绕过,前提是服务器为Apache且在配置文件夹httpd.conf中需配置AddType application/ x-httpd-php .php .phtml .php5 .pht ,重启Apache让其生效。

pass-04 :.htaccess+图片马、.php. .

<FilesMatch "*.jpg"> ​            
SetHandlerapplication/x-httpd-php ​ 
<\Filematch>

上传.htaccess,后上传*.jpg的文件,*.jpg将会被当成php文件执行。

在这里插入图片描述
在这里插入图片描述
pass-03中上传文件重命名中后缀名用的是$file_ext的值,所以.php. .不能绕过;pass-04中上传文件重命名中后缀名用的是$file_name的值,没有经过后面函数的过滤,可用.php. .绕过。

pass-05: .user.ini、php7、php. .后缀名绕过。

auto_prepend_file=1.jpg
auto_append_file=1.jpg
auto_prepend_file指定一个文件1.jpg,自动包含在要执行的php(readme.php)文件中,类似于在文件前调用了require()函数。auto_append_file类似,但在文件最后调用。
利用.user.ini的前提是服务器开启了CGI或者FastCGI,并且上传文件的存储路径下有readme.php可执行文件。(剑访问将文件名改为readme.php)在修改.user.ini之后不用重启服务器中间件,只需等待user_ini.cache_ttl默认的配置时间(300秒),即可被重新加载。

pass-06:没有strtolower()函数,可用大小写绕过。
pass-07:没有trim()函数,可用空格绕过。
pass-08:没有deldot()过滤文件名末尾的点,加’ . '绕过。
pass-09:没有处理::DATA,(在windows中如果文件名后加::DATA则文件名后的数据会被当成文件流处理,不会检测后缀名保 持::DATA之前的文件名,蚁剑链接路径上要去掉::DATA)。
pass-10:php. .
pass-11:双写绕过(替换为空且只执行一次)

pass-12~pass-16

(白名单验证):只允许在白名单中的后缀名上传。
所涉及的函数及知识点:

1.%00截断是当程序遇到%00时会自动停止不再解析之后的内容,控制上传的路径,%00截断需要magic_quotes_gpc参数关闭(默认关闭)且php版本<5.3.4。
2.strrpos() 函数查找字符串在另一字符串中最后一次出现的位置(区分大小写)
3.isimage()函数可以判断一个文件是否是一个图片文件,并且能识别出jpeg、png、bmp等常见的图片格式
4.getimagesize()函数是PHP中用于获取图像的大小和格式的函数,返回一个包含图像的宽度、高度、类型和MIME类型的数组。
5.imagecreatefromjpeg():一个JPEG格式的文件转换为一个图像资源。 intval()用于获取变量的整数值。
6. unpack():在PHP中,unpack函数用于将二进制数据按照指定的格式进行解包,将其转换为具有特定数据类型的值或数组。
7.stripos()是查找字符串在另一字符串中第一次出现的位置,该函数不区分大小写。
8. image_type_to_extension()根据指定的图像类型返回对应的后缀名。
9. exif_imagetype()是PHP中的内置函数,用于确定图像的类型(php需开启_exif模块)。

pass-12 (GET%00截断) URL中%00解码成16进制就是0x00,URL截断upload/zoe.php%00…
pass-13 (POST%00截断),POST不会对传输的数据自动解码,所以需要在Hex中修改,对上传路径进行截断。
pass-14~pass-16(图片马):会读取判断上传文件的前两个字节,判断上传文件类型,使用图片马+文件包含漏洞( 使用文件包含才能解析木马并执行)
图片马cmd命令→copy 1.png/b + 2.php pass-.jpg,生成后上传pass-.jpg。构造URL:http://…include.php?file=upload/*.png即可访问。

pass-17

二次渲染(后端重写文件内容):进行了后缀名、MIME类型、imagecreatefromgif判断,二次渲染需要找到上传前与上传后两张图片的Hex值仍保持不变的位置(用编辑器进行对比两个GIF图片的Hex),在不变的部分中加入一句话木马。构造URL:include.php?file=upload/*.gif访问

图片18

pass-18

(条件竞争):在上传的一句话木马删除(不符合白名单的文件)之前访问成功,利用bp多线程发包,在浏览器一直刷新,可访问成功
<?php fputs(fopen(‘Tony.php’,‘w’),‘<?php @eval($_POST[“Tony”]) ?>’); ?>把这个phl文件通过bp一直不停地重放,然后再写python脚本不停地访问我们上传的文件。
python脚本:
import requests
URL =“http://…/upload-labs/include.php?file=upload/文件名”
while True
html=requests.get(url)
if ‘warning’ not in str(html.text):
print(“OK”)
break
bp与脚本同时运行,当出现OK则Tony成功创建,可以连接

pass-19

move_uploaded_file()有一个特性,会忽略掉文件末尾的 /.

pass-20

数组绕过
php的数组既可以当数组又可以当字典,这里是字典的用法,传参为:
KaTeX parse error: Double superscript at position 32: …pload20.php/' '̲2'=>'jpg' } re…ext获取的是最后面的值为jpg绕过了判断。

上传漏洞之waf绕过

❶数据溢出
在filename="x.php"前或在Form_datacontent-pisposition后加入大量垃圾数据,并用分号分隔结尾造成缓冲溢出(可能造成服务器崩溃)或将content-disposition、form-data的内容复制到 filename = "*.php"的引号里,利用重复数据成功上传。
❷符号变异(引号、分号匹配缺陷绕过)
filename = ("*.php" → "*.php)
filename = ('*.php' → '*.php)
filename = ("*.php" → "*".php)
filename=("*.php" → "1.jpg;*.php"):WAF只会检验分号前面的内容是否合法而不会检验后面的*.php,成功上传后为php文件。
❸数据截断
filename = "a.p\nh\np",换行绕过,分块传输的原理。
❹斜杠绕过
目录命名*.php/. 以文件夹命名方式绕过后缀名的限制,但代码保存结果为php文件。

补充知识:

1.Png图片文件头有8字节:89 50 4E 47 0D 0A 1A 0A,89是PNG文件的固定标识,50 4E 47代表PNG文件类型,0D 0A是换行符,1A 0A是文件结束标识。Gif图片文件头包括6字节:为 GIF89(7)a。
2.MIME类型:用来设定某种扩展名文件的打开形式,当具有改扩展名的文件被访问时,浏览器会自动使用指定的应用程序来打开,如GIF图片MIME为image/gif,css文件MIME类型为text/css。
3.如果直接以文本的方式打开图片插入一句话木马,可能会造成文件损失,可用工具 Edjpgcom.exe制作一句话木马。
4.HTTP协议中请求头content-length代表实体正文长度,若filename的值修改,应修改content-length,否则上传可能失败。
5.文件包含漏洞原理:代码开发过程中,会把可重复使用的函数写到单个文件中,需要时直接调,无需再次编写。(前提是被文件包含的代码文件是一个变量,且能够被用户传入参数,如果没有对该变量做相应的安全防护,就可能会引发出文件包含漏洞。)
6.常见的Web容器有IIS、Apache、Nginx、Tomcat等。

  • 19
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值