知了堂《web安全-上传漏洞》课程讲解文档(上)
文章来源:知了堂冯老师

0 声明
1.本课程涉及的所有信息安全攻击技术等内容均作为教育和学习之用,不得用于其他用途,否则后果自付。
2.本课程中所涉及的所有软件工具均来自互联网,本着互联网的共享精神可以提供给学员,但仅限于教育和学习之用,不得用于其他用途。
1 中华人民共和国网络安全法(2017年6月1日施行)
第十二条
任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得危害网络安全,不得利用网络从事危害国家安全、荣誉和利益,煽动颠覆国家政权、推翻社会主义制度,煽动分裂国家、破坏国家统一,宣扬恐怖主义、极端主义,宣扬民族仇恨、民族歧视,传播暴力、淫秽色情信息,编造、传播虚假信息扰 乱经济秩序和社会秩序,以及侵害他人名誉、隐私、知识产权和其他合法权益等活动。
第四十四条
任何个人和组织不得窃取或者以其他非法方式获取个人信息,不得非法出售或者非法向他人提供个人信息。
2 中华人民共和国刑法(节选)
第二百八十五条
【非法侵入计算机信息系 统罪】 违反国家规定,侵入国家事务、国防建设、尖端科学技术领域的计算机信息系统的, 处三年以下有期徒刑或者拘役。
第二百八十六条
【破坏计算机信息系统罪】 违反国家规定,对计算机信息系统功能进行删除、修改、增加、干扰,造成计算机信息 系统不能正常运行,后果严重的,处五年以下有期徒刑或者拘役;后果特别严重的,处五年以上有期徒刑。
3 本课程面向的主要群体:
本课程主要面向立志从事网络安全相关岗位,立志从事安全行业人员,对web安全及渗透测试有兴趣的入坑人员。本课程初步设计主要对象为零基础入坑学员,由于技术有限,请多多指正。

0 上传漏洞介绍
在现代互联网的web应用程序中,上传文件是一种常见的功能,因为它有助于提高业务效率,比如企业的OA系统,允许用户上传图片、视频、头像和许多其他类型的文件。然而向用户提供的功能越多,web应用受到攻击的风险就越大,如果web应用存在文件上传漏洞,那么恶意用户就可以利用文件上传漏洞将可执行脚本程序上传到服务器中,获取网站的权限,或者进一步危害服务器。
·为什么文件上传存在漏洞
上传文件时,如果服务器代码未对客户端上传的文件进行严格的验证和过滤,就容易造成可以上传任意文件的情况,包括上传脚本文件(asp、aspx、php、jsp等格式的文件)。
·危害
非法用户可以利用上传的恶意脚本文件控制整个网站,甚至控制服务器。这个恶意的脚本文件,又称之为webshell,也可将webshell脚本称为一种网页后门,webshell脚本具有强大的功能,比如查看服务器目录,服务器中的文件,执行系统命令等。
1 案例讲解
2 JS检测绕过攻击
JS检测绕过上传漏洞常见于用户选择文件上传的场景,如果上传文件的后缀不被允许,则会弹框告知,此时上传文件的数据包并没有发送到服务器端,只是在客户端。览器使用JavaScript对数据包进行检测。


这时有两种方法可以绕过客户端JavaScript的检测
·使用浏览器的插件,删除检测文件后缀的JS代码,然后上传文件即可绕过。
·把需要上传文件的后缀改称允许上传的,如JPG,PNG等,绕过JS的检测,再抓包,把后缀名改成可执行文件的后缀即可上传成功。
(注:除了删除代码这个绕过方法,还有很多,比如ie的禁用脚本功能或者火狐的noscript插件或者删除代码中的JS引用)

3 JS检测绕过攻击分析

客户端上传文件的HTML代码如下,在选择文件时,会调用JS的selectFile函数,函数的作用是先将文件名转换为小写,然后通过substr获取文件名最后一个点号后面的后缀(包括点号)。如果后缀不是”jpg”,则会弹窗提示“请选择jpg格式的照片上传”。
服务器处理上传文件的代码如下所示。如果上传文件没有错,再通过file_exists判断在upload目录下文件是否已存在,不存在的话就通过move_uploaded_file将文件保存到upload目录。此PHP代码中没有对文件后缀做任何判断,所以只需要绕过前端JS校验就可以上传webshell

4 文件后缀绕过攻击
文件后缀绕过攻击是服务器代码中限制了某些后缀的文件不允许上传,但是有些apache是允许其他文件后缀的,例如在http.conf中,如果配置有如下代码,则能够解析php和phtml文件AddType application/x-httpd-php .php .phtml。
所以可以上传一个后缀为phtml的webshell如 abc.php.phtml。
在apache的解析顺序中,是从右到左开始解析文件后缀的,如果最右侧的扩展名不识别,就继续往左判断,直到遇到可以解析的文件为止,所以如果上传的文件名类似abc.php.xxx,因为后缀xxx不可以解析,所以向左解析后缀php。
服务端处理上传文件的代码如下所示。通过函数pathinfo()获取文件后缀,将后缀,将后缀转换为小写之后,判断是不是“php”,如果上传文件的后缀是php,则不允许上传,所以此处可以通过利用apache解析顺序或上传phtml等后缀的文件绕过该代码限制。

5 文件类型绕过攻击
在客户端上传文件时,通过burp suite抓取数据包,当上传一个php格式的文件时,可以看到数据包中的Content-Type的值是application/octet-stream,而上传jpg格式的文件时,数据包中的content-Type的值是image/jpeg。

如果服务器端代码是通过content-type的值来判断文件的类型,那么就存在被绕过的可能,因为content-type的值是通过客户端传递的,是可以任意修改的。所以当上传一个php文件时,在burpsuite中将content-type修改为image/jpeg,就可以绕过服务端的检测。

今天就先更新到这儿了,未完待续!!!请持续关注~~
