目录
一、认识Web木马
1.1 木马概念
web木马:是应用页面,是用 Web 系统语言(如:ASP, PHP,,JSP等)编写的木马,木马上传服务器后当成页面被攻击者访问,常当作后门。
1.2 web木马危害
1.2.1 攻击者留后门
1.2.2 文件、数据库操作
1.2.3 修改web页面
1.3 Web 木马特点
1.3.1 Web木马可大可小
小到一句话,大到也会超过10k 。
1.3.2 无法有效隐藏
Web木马执行时心须按照中间件支持的格式进行解析并执行。在真实攻击中,攻击者通常会将木马命名为一个近似系统文件或正常文件的名字,并在其中填充大量与当前站点相似的无效代码,以迷惑管理员。若攻击者没育系统权限,木马在服务器端无法真正隐藏。
1.3.3 具有明显特征值
- Web 木马使用过程中,攻击者的操作行为会利用外部参数传入到Web木马中,Web 木马再将攻击者传入的参数拼接成系统命令并执行。
- 在 Web 木马中,需要调用系统的关键函数以执行本身的功能,这些关键函数在 Web 木马中起着关键作用,因此这些关键函数可作为 Web 木马的明显特征。
- 命令执行函数:eval、system、popen、execshell_exec 等
- 文件功能类函数:fopen、opendir、dirname、pathinfo 等
- 数据库操作类函数:mysql_query、mysqli_query 等
1.3.4 必须为可执行的网页格式:
Web 木马需在当前服务器的 Web 容器中执行,因此必须为网页格式。
1.4 Web木马分类
1.4.1 一句话木马
- 代码一句话,实现基本的链接功能,在web服务器上“打开窗口”,需配合中国菜刀进行相关操作。
- 由于木马越简单,针对木马的变种,隐匿方法就相对容易实现,木马成功部署及长久留存的概率也就越高。
① 以PHP为例:<?php @eval($_POST[‘c’])?> 获得客户端提交的参数,然后执行,需要用户提交的就是引号里的内容。
- <?:脚本语言开始标记
- ?>:脚本语言结束标记
- @eval:执行后面请求到的数据
- ($_POST['c’]:获取客户端提交数据,其中 c 是需要获取的参数,也可以理解为密码。
② 隐藏手段:
- 404页面
- 图片或日志:构造图片马
③ 变形方法:
- 更换执行数据来源:利用 get 方式<?php $_GET[ 'a ']($_GET[ 'b']);?>,其中 a 传入执行命令,b 传入执行代码,PHP接收到GET请求后相当于执行一个 assert 函数,并把 b 作为 assert 的参数。
- 字符替换或特殊编码
- 采用藏匿手段
- 混合上述手段
1.4.2 大马小马
- 文件大小和功能大小区别于一句话木马,是以 asp、php、jsp 或者 cgi 等网页文件形式存在的一种命令执行环境。也是WebShell后门木马。
- 小马的作用是为后期上传其他文件做准备,如上传大马。
- 大马的作用有文件管理,数据库连接,命令执行(提权)。
防护方法:
- 更新防护类工具
- 对服务器文件夹设置严格的读写权限
- 禁用敏感危险函数
- 定期观察系统服务管理中的服务
- 定期检查是否有可疑进程
- 检查是否近期有可执行文件
二、初识文件上传漏洞
2.1 文件上传漏洞的概念
在动态网站或Web应用系统中,动态脚本对用户文件上传部分控制不足或者处理缺陷,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件,进而危害服务器安全的软件漏洞。
2.2 文件上传漏洞的危害
2.2.1 非授权用户的越权访问
2.2.2 信息的泄露
2.2.3 种下后门(webshell)
① Webshell
- WebShell 可使得文件上传漏洞无限扩大。
- WebShell就是以 asp、php、jsp 或者 cgi 等网页文件形式存在的一种命令执行环境,也可以将其称之为一种网页后门。
- 攻击者在入侵了一个网站后,通常会将这些 asp 或 php 后门文件与网站服务器 web 目录下正常的网页文件混在一起,然后使用浏览器来访问这些后门,得到一个命令执行环境,以达到控制网站服务器的目的(可以上传下载或者修改文件,操作数据库,执行任意命令等)。
- 特点:WebShell 后门隐蔽性较高,可以轻松穿越防火墙。
- 形式:一句话木马、小马、大马
② 上传攻击的条件
1. 你的文件能上传到web服务器
- web系统本身具备文件上传功能
- 程序未对用户上传的文件进行合法性检验
2. 你的文件能被当成脚本文件执行
- 上传文件的后缀应是可执行格式
- 存放上传文件的目录要有执行脚本的权限
3. 能找到上传后的文件路径及文件名
- 许多web应用都会修改上传文件的文件名,这时就需要结合其他漏洞获取这些信息。
4. 目标文件可被访问
2.3 文件上传漏洞的防护
2.3.1 总体思想
确保上传的文件不会被服务器解析成可执行的脚本,进而引发偏离功能设计的以外后果。
- “不能上传”:加强文件合法性检测
- “不能被执行”:阻止上传文件执行
2.3.2 文件上传验证
① 客户端验证:是指客户端利用javascript对扩展名进行检测。
② 服务端验证:
- MIME检测(文件头Content—type检测)
- 扩展名检测(通常黑名单/白名单)
- 文件内容头校验
三、文件上传漏洞利用及防护
3.1 文件上传介绍
3.1.1 文件上传漏洞原因
- 文件过滤不严或被绕过
- 文件解析漏洞导致文件执行
- 文件路径截断
- 服务器配置不当及系统“特性”
3.2 文件上传检测
分为客户端JS验证和服务端验证
3.3 客户端JS验证
顾名思义,就是使用 javascript 在客户端对上传文件后缀进行限制,但上传验证这样做是非常危险的,JS防护绕过有:
- 浏览器禁用 JavaScript 脚本执行
- 使用 burpsuite 进行抓包拦截,再改包
3.4 服务端验证
3.4.1 MIME检测
MIME值即文件头 Content-type。在HTTP协议中,会利用 Content-type 标识本次上传的内容类型。这些类型由客户端的浏览器根据本次上传文件的后缀名自动生成。
常见的 Content-type 有:
- text/html (html文档)
- text/plain(纯文本)
- text/css (css代码)
- text/javascript (js代码)
- image/jpeg (JPEG图像)
- image/png (PNG图像)
- image/gif(GlF图像)
- application/x-www-form- (POST方法提交的表单)
- multipart/form-data(伴随文件上传的表单)
绕过方法:HTTP抓包后,修改 Content-type 类型,如 Content一type类型为 application/octet-stream 修改为“image/gif”或“image/jpeg”。
3.4.2 扩展名检测
① 思路
通过在服务器端检测上传文件的扩展名来判断上传文件的合法性。
② 方法
- 黑名单过滤:一种容易遗漏的过滤方法,黑客上传非黑名单里的格式均可以被放行
- 白名单过滤
③ 绕过方法
◆ 抓包改包
方法类似于前端JS检测及绕过,通过使用 burpsuit 进行数据包拦截,然后修改文件后缀名,尝试常见的PHP后缀。
◆ 文件解析缺陷
通过 Apache 文件解析缺陷绕过后缀检查:
在 Apache 1.x 、2.x 版本中,对文件名后缀解析存在从后往前解析的特性,比如1.php.xxx.ccc.fff.zzz,apache 并不认识 zzz、xxx 等一系列后缀,就会往前找,直到找到 php 这个 apache “认识”的后缀,就 php 解析了。
通过在非法后缀名后添加合法后缀
如:1.php 后添加 .360, apache 在解析时不认识 360 这个后缀,会自动向前遍历,直到出现可被识别的后缀 .php,并将之解析为 php 运行。
在 llS6.0 下也有类似的解析漏洞,IlS6.0 服务器对分号后面的扩展名不去解析,也就是说当文件为*. asp.jpg 时,llS6.0 同样会以ASP脚本来执行。
◆ 文件路径截断
上传的文件中使用一些特殊的字符(N00×00被认为是终止符),使得文件被上传到服务器时,路径或文件名会被从 \0 处截断,从而控制文件名或文件路径,最终绕过文件后缀判断。
应用原本只允许上传JPG图片,那么可以构造文件名为xxx. php[\0].JPG,其中 [\0] 为十六进制的0x00 字符,.JPG绕过了应用的上传文件后缀名判断,而服务器解析时又从 \0 截断,被成功解析成了 ***.php 文件。
3.4.3 文件内容头校验
- getimagesize() 函数可得到上传图片的大小。
- 通过分析图片头部来判断这个是不是一个有效的图片格式,比如 jpg 格式头部是JFIF,gif 头部是GiF89a, png 头部是 %PNG。
- 绕过方法:构造图片马可以绕过。
3.5 文件上传漏洞防护
3.5.1 关闭不必要的文件上传功能
3.5.2 加强文件合法性检测
3.5.3 阻止上传文件执行
- 使用代理页面隐藏真实路径,使得用户找不到文件,自然就没育办法执行文件。
- 对上传的文件在服务器上存储时进行重命名。
- 文件上传目录设置为静态资源目录,防止被解析为脚本执行。