转载PHP安全之webshell和后门检测

时间:2021-08-16 21:26:17

PHP安全之webshell和后门检测
阅读 1442,2017年03月17日 发布,来源:www.cnblogs.com

基于PHP的应用面临着各种各样的攻击:

XSS:对PHP的Web应用而言,跨站脚本是一个易受攻击的点。攻击者可以利用它盗取用户信息。你可以配置Apache,或是写更安全的PHP代码(验证所有用户输入)来防范XSS攻击
SQL注入:这是PHP应用中,数据库层的易受攻击点。防范方式同上。常用的方法是,使用mysql_real_escape_string()对参数进行转义,而后进行SQL查询。
文件上传:它可以让访问者在服务器上放置(即上传)文件。这会造成例如,删除服务器文件、数据库,获取用户信息等一系列问题。你可以使用PHP来禁止文件上传,或编写更安全的代码(如检验用户输入,只允许上传png、gif这些图片格式)
包含本地与远程文件:攻击者可以使远程服务器打开文件,运行任何PHP代码,然后上传或删除文件,安装后门。可以通过取消远程文件执行的设置来防范
eval():这个函数可以使一段字符串如同PHP代码一样执行。它通常被攻击者用于在服务器上隐藏代码和工具。通过配置PHP,取消eval()函数调用来实现
Sea-surt Attack(Cross-site request forgery,CSRF。跨站请求伪造):这种攻击会使终端用户在当前账号下执行非指定行为。这会危害终端用户的数据与操作安全。如果目标终端用户的账号用于管理员权限,整个Web应用都会收到威胁。
一、各种webshell
随着业务量的增大,越来越多的黑客来攻击扫描,网站安全性日益重要,一不留神就被黑客控制了服务器,最常见的方式就是通过POST请求来上传木马文件,从而可以执行任意命令

最流行的一种后门叫做一句话木马,其形式如下所示:

!/usr/bin/env python

encoding: utf-8

import os,sys
import re
import hashlib
import time

rulelist = [
‘($_(GET|POST|REQUEST)[.]\s(\s$_(GET|POST|REQUEST)[.]))’,
‘((eval|assert)(\s|\n)((\s|\n)$_(POST|GET|REQUEST)[.]))’,
‘(eval(\s|\n)(base64_decode(\s|\n)((.|\n))’,
‘(function_exists\s*(\s*\’|\”+[\’|\”]\s*))’,
‘((exec|shell_exec|passthru)+\s*(\s*$_(\w+)[(.)]\s))’,
‘($(\w+)\s*(\s.chr(\d+)))’,
‘($(\w+)\s*${(.*)})’,
‘($(\w+)\s*(\s*$_(GET|POST|REQUEST|COOKIE|SERVER)+[(.)]\s))’,
‘($_(GET|POST|REQUEST|COOKIE|SERVER)+[(.)](\s$(.*)))’,
‘($_\=(.*)$_)’,
‘($(.)\s((.)\/e(.),\s*$_(.),(.)))’,
‘(new com\s*(\s*[\’|\”]shell(.)[\’|\”]\s))’,
‘(echo\s*curl_exec\s*(\s*$(\w+)\s*))’,
‘((fopen|fwrite|fputs|file_put_contents)+\s*((.)$_(GET|POST|REQUEST|COOKIE|SERVER)+[(.)](.*)))’,
‘((\s*$_FILES[(.)][(.)]\s*,\s*$_(GET|POST|REQUEST|FILES)+[(.)][(.)]\s*))’,
‘($_(\w+)(.)(eval|assert|include|require|include_once|require_once)+\s(\s*$(\w+)\s*))’,
‘((include|require|include_once|require_once)+\s*(\s*\’|\”.(jpg|gif|ico|bmp|png|txt|zip|rar|htm|css|js)+[\’|\”]\s*))’,
‘(eval\s*(\s*(\s*$$(\w+))’,
‘((eval|assert|include|require|include_once|require_once|array_map|array_walk)+\s*(\s*$_(GET|POST|REQUEST|COOKIE|SERVER|SESSION)+[(.)]\s))’,
‘(preg_replace\s*((.*)(base64_decode($)’
]

def scan(path):
print(’ 可疑文件 ‘)
print(‘*’*30)
for root,dirs,files in os.walk(path):
for filespath in files:
if os.path.getsize(os.path.join(root,filespath))<1024000:
file= open(os.path.join(root,filespath))
filestr = file.read()
file.close()
for rule in rulelist:
result = re.compile(rule).findall(filestr)
if result:
print ‘文件:’+os.path.join(root,filespath )
print ‘恶意代码:’+str(result[0][0:200])
print (‘最后修改时间:’+time.strftime(‘%Y-%m-%d %H:%M:%S’,time.localtime(os.path.getmtime(os.path.join(root,filespath)))))
print ‘\n\n’
break
def md5sum(md5_file):
m = hashlib.md5()
fp = open(md5_file)
m.update(fp.read())
return m.hexdigest()
fp.close()

if md5sum(‘/etc/issue’) == ‘3e3c7c4194b12af573ab11c16990c477’:
if md5sum(‘/usr/sbin/sshd’) == ‘abf7a90c36705ef679298a44af80b10b’:
pass
else:
print(‘*’*40)
print “\033[31m sshd被修改,疑似留有后门\033[m”
print(‘*’*40)
time.sleep(5)
if md5sum(‘/etc/issue’) == ‘6c9222ee501323045d85545853ebea55’:
if md5sum(‘/usr/sbin/sshd’) == ‘4bbf2b12d6b7f234fa01b23dc9822838’:
pass
else:
print(‘*’*40)
print “\033[31m sshd被修改,疑似留有后门\033[m”
print(‘*’*40)
time.sleep(5)
if name==’main‘:

if len(sys.argv)!=2:
print ‘参数错误’
print “\t按恶意代码查找:”+sys.argv[0]+’目录名’
if os.path.lexists(sys.argv[1]) == False:
print “目录不存在”
exit()
print (‘\n\n开始查找:’+sys.argv[1])
if len(sys.argv) ==2:
scan(sys.argv[1])
else:
exit()
2、如何防范

php.ini 设置

disable_functions =phpinfo,passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,get_current_user,leak,putenv,popen,opendir
设置“safe_mode”为“on”
禁止“open_basedir” 可以禁止指定目录之外的文件操作
expose_php设为off 这样php不会在http文件头中泄露信息
设置“allow_url_fopen”为“off” 可禁止远程文件功能
log_errors”设为“on” 错误日志开启
php编码方面

所有用户提交的信息 post get 或是其他形式提交的数据 都要单独写个过滤函数处理一遍,养成习惯(intval,strip_tags,mysql_real_escape_string)
经常检查有没有一句话木马 eval($_POST[ 全站搜索php代码有没有这样的源代码
文件要命名规范 至少让自己可以一目了然,哪些php文件名字有问题
如用开源代码,有补丁出来的话,尽快打上补丁
如果攻击者拿到了服务器的最高权限,有可能通过修改服务器的配置文件php.ini来达到他们隐藏后门的目的,前几年比较流行。原理如下:php.ini 里面的这两个配置项:auto_prepend_file ,auto_append_file 可以让php解析前,自己加点东西进去 Automatically add files before or after any PHP document,如果被配置了eval()函数的后门 那就很阴险了,php文件代码里面查不出,只会在php解析前包含eval()函数进来 并且因为是全局的 所以所有php页面都是后门!所以要先确认auto_prepend_file ,auto_append_file没被配置成其他东西,才进行第3点的源代码检查。
服务器配置

配置的时候尽量使用最小权限,不要写入或者执行的目录不能给相应的权限

nginx或者apache配置的时候,不能访问的目录一定要配置为deny

待续。。。

参考文章

https://github.com/chenpingzhao/php-webshells

http://blog.csdn.net/miltonzhong/article/details/9714367

http://blog.jobbole.com/53821/
© 著作权归原作者所有