说说 WEB SHELL

简介:
 WEB SHELL 的威力和危害性有多大,大家都知道,我就不多说了。下面首先给出一个 WEB SHELL 的例子,然后,逐步分析我们应该怎样来防范 WEB SHELL。
 一.  WEB SHELL 例子
本文提供该 WEB SHELL,是因为下文的分析会用到它。请读者不要误用,感谢。
 
二. WEB SHELL 的防护
WEB SHELL 的防护,说到底,就是三点:
 首先,怎样防止别人把 WEB SHELL 放到你的网站上去;
  其次,如果不幸,别人把 WEB SHELL 放到了你的网站上,怎样防止别人执行这些被
              放上去 的 WEB SHELL;
  再次,如果更不幸,你遇上了绝顶高手,他不但把 WEB SHELL 放进了你的网站,而
              且还能想出招式来执行,怎样尽量减小这些 WEB SHELL 执行所造成的破坏。
 
三. 先来谈谈怎样防止别人上传 WEB SHELL
这个问题说简单也简单,说复杂也负责,关键看网站的 WEB 程序员是否把网站的安全放在有心之上。如果 WEB 程序员关注自己开发的程序的安全,他们就会对自己的代码中,处理用户上传文件的地方特别留意。对用户上传的文件的类型和内容执行严格的检查。期望用户上传什么样的文件,就只允许上传这些类型的文件,其它一概拒绝。这样,恶意用户想把 WEB SHELL传上来 就难了。读者可以参考笔者的<<WEB 应用数据验证指南>>,其中讲了对WEB 应用数据验证的一些方法。
 
四. 接下来谈谈怎样防止恶意用户执行放上来的 WEB SHELL
笔者知道并实践过的方法有两种,下面详述。
一是禁止 WEB 应用服务器编译 WEB 页面的能力,可以通过设置 $RESIN_HOME/webapps 目录对 RESIN 进程为只读来实现。当然,前提条件是你自己的 WEB 应用程序要事先编译好,然后再放到 $RESIN_HOME/webapps 里的适当位置。因为RESIN 对  $RESIN_HOME/webapps 目录只有只读权限,不管是对你自己的程序而言,还是对于上传上来的 WEB SHELL 而言,都不能在线编译。
二是配置一个专门的域名来负责发布用户上传的文件,该域名由纯静态的服务器来发布,比如APACHE。这样,即使恶意用户把 WEB SHELL 传上来了,纵然他有天大的本事,也不能让静态服务器来执行他的 WEB SHELL。哈哈哈哈。
 
五. 最后来谈谈怎样尽量减小 WEB SHELL 执行所带来的危害
人世间有些事情是很难说的,对于信息安全来说更是如此。有很多你觉得根本就不可能发生的事情,总是在你不经意之间出现。所以,就算你运用了上面的招式,未必就一定能防止黑客精英们在你的网站上执行 WEB SHELL。 所以,我们还要做最坏的打算,如果不幸中的不幸发生在了我们的头上,我们怎样限制 WEB SHELL 执行所造成的破坏呢。
一是用非root(比如 resin)用户来运行应用服务器,比如 RESIN, 这样,即使 RESIN 执行了系统命令,那么其破坏程度也可以限制在非root用户(比如resin)的权限范围内,绝不会出现恶意用户执行了 rm -rf / 所导致的让你痛苦流涕的恶果。^_^
下面是我配置RESIN的通用刀法:
[root@wireless-239 local]# pwd
/usr/local
[root@wireless-239 local]# ll 
总用量 28124
drwxr-xr-x  11  root root      4096  1月  6 15:19 resin-3.0.22
[root@wireless-239 resin-3.0.22]# ll
总用量 36
drwxr-xr-x  2 root  root  4096  1月  6 16:05 bin
drwxr-xr-x  2 root  root  4096  1月  6 15:23 conf
drwxr-xr-x  2 root  root  4096  1月  6 15:16 lib
drwxr-xr-x  2 root  root  4096  1月  6 15:16 libexec
drwxr-xr-x  2  resin resin 4096  1月  6 16:05 log
drwxr-xr-x  2  resin resin 4096  1月  6 15:18 logs
drwxr-xr-x  3  resin resin 4096  1月  6 15:24 tmp
drwxr-xr-x  5 root  root  4096  1月  6 15:16 webapps
drwxr-xr-x  3  resin resin 4096  1月  6 15:25 work
[root@wireless-239 resin-3.0.22]# ps -ef | grep resin | grep -v  grep
resin    25073 25071  0 16:05 ?        00:00:05 /usr/local/jdk/bin/java -ms2048m -mx2048m -Xss1m -Dresin.home=/usr/local/resin-3.0.22 -Dserver.root=/usr/local/resin-3.0.22 -Djava.util.logging.manager=com.caucho.log.LogManagerImpl -Djavax.management.builder.initial=com.caucho.jmx.MBeanServerBuilderImpl com.caucho.server.resin.Resin -socketwait 51989 -stdout /usr/local/resin-3.0.22/log/stdout.log -stderr /usr/local/resin-3.0.22/log/stderr.log
[root@wireless-239 resin-3.0.22]# ll log
总用量 36
-rw-r--r--  1 resin resin     6  1月  6 16:05  httpd.pid
-rw-r--r--  1 resin resin     0  1月  6 15:18 jvm.log
-rw-r--r--  1 resin resin 28377  1月  6 16:05 stderr.log
-rw-r--r--  1 resin resin  4008  1月  6 16:09 stdout.log
[root@wireless-239 resin-3.0.22]# cat bin/httpd.sh
......
args="-J-ms2048m -J-mx2048m  -pid log/httpd.pid"
以上内容的具体解释,超出了本文的范围,请参考 resin 文档。
 
下图表明,当我们以非 root 身份运行 RESIN 的时候,RESIN 不能访问 /root 了:
 
 
我们说,让应用服务器以非root身份运行,可以保证 WEB SHELL 不能把魔爪伸出到应用服务器运行的用户身份的权限之外。可是,应用服务器为了能正常服务 WEB 请求,还是必须访问 JSP 文件,那么,如果不仔细考虑权限,应用服务器还是可能会被赋予删除这些 JSP 文件的权限的。那么,我们应该怎样做呢?笔者的做法是将RESIN的webapps目录宿主设置为root,而单独配置另外两个目录来作为 RESIN 工作目录。由于 JSP 文件是放在 webapps目录下的,而该目录是root所有,RESIN 就拿它没办法了。至于这两个工作目录,RESIN 当然有所有的权限,不过我们并不太关心工作目录里面的东西。因为这些东西是轻易就可以重新生成的。
相关配置如下所示:
[root@wireless-239 resin-3.0.22]# ll
总用量 36
drwxr-xr-x  3  resin resin 4096  1月  6 15:24  tmp
drwxr-xr-x  5  root  root  4096  1月  6 15:16  webapps
drwxr-xr-x  3  resin resin 4096  1月  6 15:25  work
[root@wireless-239 resin-3.0.22]# cat conf/app-default.xml | grep dir
......
<work-dir>/usr/local/resin-3.0.22/work/${host.name}/${app.name}</work-dir>
<temp-dir>/usr/local/resin-3.0.22/tmp/${host.name}/${app.name}</temp-dir>
 
下图表明,当我们禁止了 RESIN 对 $RESIN_HOME/webapps 的写访问后, RESIN 不能删除 JSP 文件了:   
 
到此为止,我们已经让 RESIN 不能破坏系统,不能破坏 JSP 文件。可是,还有一个让人头痛的问题,那就是数据库连接信息的问题。有个大中型 WEB 系统维护经验的读者都知道,数据库连接信息一般都是放在应用服务器的配置文件里面的。而应用服务器是一定需要读自己的配置文件才能正常工作。不过,我们仔细想想,就会发现,其实应用服务器只有在启动的时候才需要读自己的配置文件,一旦启动完成了,就不再需要读了。所以,我们可以这样做,让应用服务器在启动的时候对自己的配置文件有读权限,一旦启动完毕,就禁止应用服务器对自己配置文件的读权限。这样,我们就防止了 WEB SHELL 通过读应用服务器的配置文件来获得数据库连接信息了。
下面提供笔者自己的相关配置:
[ root@wireless-239 resin-3.0.22]# cat bin/my-httpd.sh 
chmod 755 /usr/local/resin-3.0.22/conf/resin.conf
sudo -u resin ./httpd.sh $@
sleep 90
chmod 000 /usr/local/resin-3.0.22/conf/resin.conf
 
注:笔者配置文件中的 sleep 90, 适合自己服务器的应用,读者可能需要做适当调整,才能适合你的WEB 应用。
 
下图表明,当我们配置了 RESIN 启动后失去对 $RESIN_HOME/conf /resin.conf 的读权限后,RESIN 不能读该文件了:
 
 
总之, 尽管 WEB SHELL 臭名昭著而威力强大,但是,只要我们做个有心人,采取适当的防范措施,WEB SHELL 要施展手脚,也不是一件易事。最后,愿大家维护的网站永远都不要受到 WEB SHELL 的破坏。good luck !!! 
 
 
    
        本文转自zkjian517 51CTO博客,原文链接:http://blog.51cto.com/zoukejian/58242



相关文章
|
3月前
|
数据可视化 Shell Linux
shell+crontab+gitlab实现ecs服务器文件的web展示
本文通过把ecs服务器上的文件定时上传至gitlab,实现文件的页面可视化和修改历史。技术点:shell、crontab、gitlab。
54 3
|
开发框架 .NET 应用服务中间件
|
Web App开发 前端开发 JavaScript
vbs学习,书籍,看书笔记(5) 客户端web脚本 .Power shell 使用 脚本文件的类型2
vbs学习,书籍,看书笔记(5) 客户端web脚本 .Power shell 使用 脚本文件的类型2
vbs学习,书籍,看书笔记(5) 客户端web脚本 .Power shell 使用 脚本文件的类型2
|
Shell
From Serialized to Shell :: Auditing Google Web Toolkit
https://srcincite.io/blog/2017/04/27/from-serialized-to-shell-auditing-google-web-toolkit.
1547 0
|
Web App开发 关系型数据库 Shell
《Linux命令行与shell脚本编程大全》第二十五章 创建与数据库、web及电子邮件相关的脚本
25.1 MySQL数据库 /* 但是我在虚拟机上安装的时候居然不提示输入密码。 这个可以参考http://blog.csdn.net/sinat_21302587/article/details/76870457 导致登录的时候不知道账号密码。
1687 0
|
安全 .NET Shell