PHP场景中getshell防御思路是什么

学习啦  加城   2018-09-27 14:32:11

  PHP场景中getshell防御思路可能很多人都不知道,那么具体原理思路是什么呢?下面一起看看PHP场景中getshell防御思路分享,希望能帮到需要的人!

  PHP扩展

  防御方案使用了PHP扩展来完成阻断。PHP内核支持C/C++开发一些扩展功能,并且提供了一个框架 – ext_skel帮助生成基本的代码简化开发,由于PHP扩展并不涉及底层的资源管理,所以编写一个PHP扩展和编写一个C应用程序是一样的。下图展示了PHP扩展所处的结构层次,扩展位于PHP内核ZEND 和 PHP应用层代码之间,那么利用PHP扩展可以:

  1) 监控PHP应用层代码的执行细节,包括执行CGI、函数名、参数等;

  2) 调用PHP内核ZEND提供的API接口,包括禁用类、修改配置选项等。

  PHP场景中getshell防御思路分享

  3 相关知识

  3.1 HOOKPHP代码

  PHP是解释型语言,代码被翻译为中间字节码由ZEND引擎解析执行。PHP把中间字节码称之为OPCODE,每个OPCODE对应ZEND底层的一个处理函数,ZEND引擎最终执行这个处理函数。实现HOOK功能只需要改变HOOK OPCODE对应的处理函数即可,而ZEND预先就提供了一个现成的接口:zend_set_user_opcode_handler。防御方案只需要HOOK以下三个OPCODE:

  ZEND_INCLUDE_OR_EVAL — eval、require等

  ZEND_DO_FCALL — 函数执行system等

  ZEND_DO_FCALL_BY_NAME — 变量函数执行 $func = “system”;$func();

  举例:

  ZEND_DO_FCALL这个OPCODE对应的功能是函数调用,如果需要HOOK所有的函数调用:

  1) 在模块初始化函数中使用zend_set_user_opcode_handler修改ZEND_DO_FCALL新的处理函数为mysub:

  PHP_MINIT_FUNCTION(phpips){

  zend_set_user_opcode_handler(ZEND_DO_FCALL, mysub);

  return SUCCESS;

  }

  2) 在自定义函数中实现自己需要的功能并返回原来的处理函数:

  void mysub(){

  自定义功能;

  return ZEND_USER_OPCODE_DISPATCH;

  }

  3.2 ZEND接口

  HOOK之外还需要获取一些基本信息或功能,比如:

  1) 获取执行的PHP脚本名,可调用ZEND的接口zend_get_executed_filename:

  char *cgi_name = (char*)zend_get_executed_filename(TSRMLS_C);

  2) 禁用一些类库,可使用zend_disable_class接口;

  ZEND提供了很多丰富的接口,可根据需求选择调用。

  3.3 数据结构

  PHP是弱类型语言,其上层并不区分变量类型,变量底层对应的是一个union结构体,以php-5.3.6版本举例,结构体在Zend/zend.h文件中定义;内容如下:

  typedef union _zvalue_value {

  long lval; /* longvalue */

  double dval; /* double value */

  struct {

  char *val;

  int len;

  } str;

  HashTable *ht; /* hash table value*/

  zend_object_value obj;

  } zvalue_value;

  PHP是在底层区分开了变量类型;在union结构体中有个非常重要的结构体HashTable,PHP中的数组结构就是利用HashTable这个结构体实现,如果变量是个数组,获取变量内容需要遍历这块HashTable,数据结构这块不做太多介绍。ZEND底层用zval这个结构体存储变量,同时ZEND提供了几个宏可以方便的转换zval到具体的数据类型,比如把zval类型转换为字符串 – zval el; Z_STRVAL_P(el),常用的还有:

  Z_LVAL_P、Z_DVAL_P、Z_ARRVAL_P等,以上宏列表在 Zend/zend_operators.h有定义。

  4 规则策略

  4.1 基本思路

  我们需要解决的问题是getshell、主机敏感文件泄漏等问题。如果限制住PHP脚本执行命令 和 翻阅文件的功能,就达到了目的。同时,由于读取文件的接口非常多,使用场景也较多,因此采取禁用打开目录接口来侧面达到禁止翻阅文件的目的,不能遍历目录便无法得到文件名,可以有效的达到目标。故最终形成的最终策略如下:

  1) 禁用掉执行命令的接口

  2) 禁用掉打开目录的接口

  禁用函数有一些需要注意的问题:

  1) PHP接口还是比较繁多复杂的,除了system、exec、opendir、scandir常用函数之外,一些生僻函数比如glob等函数都要考虑全面,另外还有一些回调函数、反射类(PS:部分考虑不全被blackeye和雪人绕过)

  2) PHP SPL提供的一些类库有文件管理的功能,也需要禁止,比如DirectoryIterator(不过好像没有白帽子使用过SPL)

  4.2 对抗变形

  PHP使用assert或preg_replace /e执行代码,调用zend_get_executed_filename获取的PHP脚本名中会带有辨别标识,assert对应的是assert code,preg_replace对应的是regexp code;当发现这些特殊的脚本执行了system等4.1中提高的高危函数直接阻断。以下图的nonalphanumeric -webshell举例:

  变形webshell解析后的形式和$_GET[1]($_GET[2])类似,比如传入1=assert&2=system(whoami)执行代码,PHP扩展层监控到system函数执行,并且发现PHP脚本名带regexp code标识,清晰的知道是preg_replace的代码执行了调用了system,阻断system。Assert函数同理。总结:扩展并不关注在静态层如何编码运算或加密,扩展只监控最后的行为,所以可以很好的解决目前的变形难题。

  1

  图2nonalphanumeric – webshell

  4.3 减少误杀

  有时正常的PHP脚本也需要用到命令执行的功能,如何保证其正常运行,不被我们的防御策略阻断呢?这里提供三种思路:

  1) 写入权限和执行命令权限互斥

  考虑到入侵者利用上传漏洞或者其他0DAY getshell得到的文件大多会有W写权限,防御方往往希望阻止这部分文件拥有过高的权限。

  那么,我们可以去除正常PHP脚本的可写权限,然后只对有写权限的PHP脚本实施命令执行等防御策略的阻断逻辑。这样即不会影响到业务的使用,又达到了预设场景的防护目标。不过这样的思路,需要禁用chmod等可以修改文件权限的函数。

  2) 使用白名单逻辑

  粗暴一点的可以用文件名白名单,也就是业务报备过的文件不受阻断,其它不认识的文件一律禁止。优雅一点的可以对函数参数做白名单,比如提取正常PHP脚本执行命令的参数或者代码特征,对其进行放行,不认识的特征一律阻断。

  3) 使用黑名单逻辑

  设定一些已知恶意脚本的黑特征参数,类似于杀毒软件早期的特征码思路。

  上述思路在企业推广时,需要和业务有足够充分的配合,也都有不完美的地方,如果大家有更多方案或者思路,欢迎与我共同探讨。

  补充:校园网安全维护技巧

  校园网络分为内网和外网,就是说他们可以上学校的内网也可以同时上互联网,大学的学生平时要玩游戏购物,学校本身有自己的服务器需要维护;

  在大环境下,首先在校园网之间及其互联网接入处,需要设置防火墙设备,防止外部攻击,并且要经常更新抵御外来攻击;

  由于要保护校园网所有用户的安全,我们要安全加固,除了防火墙还要增加如ips,ids等防病毒入侵检测设备对外部数据进行分析检测,确保校园网的安全;

  外面做好防护措施,内部同样要做好防护措施,因为有的学生电脑可能带回家或者在外面感染,所以内部核心交换机上要设置vlan隔离,旁挂安全设备对端口进行检测防护;

  内网可能有ddos攻击或者arp病毒等传播,所以我们要对服务器或者电脑安装杀毒软件,特别是学校服务器系统等,安全正版安全软件,保护重要电脑的安全;

  对服务器本身我们要安全server版系统,经常修复漏洞及更新安全软件,普通电脑一般都是拨号上网,如果有异常上层设备监测一般不影响其他电脑。做好安全防范措施,未雨绸缪。

  相关阅读:提高服务器安全性的技巧

  1.经常更改系统管理员密码。---->且密码最好是大小写都有

  2.定期更新系统补丁。---->开启自动更新,并设定到晚上重启。

  3.检查系统是否多出超级管理员,检查是否有帐号被克隆在“开始”>运行中输入“cmd”>在输入 net localgroup administrators

  4.在“开始”>运行中输入“msconfig”检查随机启动的程序和服务,关掉不必要的随机启动程序和服务。

  5.服务器上的所有程序尽量安装程序的最新稳定版。

  6.检查SERVU是否被创建有执行权限的用户或者对C盘有读写权限的用户,并且给SERVU设置一个登录密码。如果需要请给serv_u设置独立启动账户。

  7.不要随意安装任何的第三方软件。例如XX优化软件,XX插件之类的,更不要在服务器上注册未知的组件。

  8.不要随意在服务器上使用IE访问任何网站,杜绝隐患那是必须的。

  9. 检查系统日志的“安全性”条目,在右侧查看近期“审核成功”的登录

  10.不要在服务器上双击运行任何程序,不然怎么中了木马都不知道。

  11.不要在服务器上用IE打开用户的硬盘中的网页,这是危险的行为。

  12.不要在服务器上浏览图片,以前windows就出过GDI 的安全漏洞。

  13.及时的更新病毒库,查杀病毒。

  14.定时的查看系统各个盘符的磁盘权限,是否为设定的安全权限。

  15.确保你自己的电脑安全,如果自己的电脑不安全,服务器也可能不太安全。


php防御相关文章:

1.怎么利用3389端口攻破服务器

2.如何预防网站被攻击

3.如何防范SQL注入漏洞及检测

4.服务器基础知识大全

5.浅谈网站服务器安全维护技巧

【猜您感兴趣】
【PHP场景中getshell防御思路】相关文章
【系统安全】图文精华
上一篇:常见的网页挂马方式和原理有哪些
下一篇:SQL注入攻击的总体思路和步骤是什么