这次去打HCTF决赛,用了这个自己写的WAF,web基本上没被打,被打的漏洞是文件包含漏洞,这个功能在本人这个waf里确实很是捉急,由于只是简单检测了..和php[35]{0,1},导致比赛由于文件包含漏洞web上失分了一次。不过现在不是很想去改进了。这个是比赛专用waf,商业价值几乎为0。

如果是框架写出的web就很好部署了,直接require在重写文件或者数据库文件中,如果是零散的php文件,那也有办法,如果是fastcgi(nginx,IIS比较常见)运行的php就在.user.ini加一句,具体百度一下.user.ini的后门,原理一样。其他情况也可以写个脚本强行在每个PHP前面加一句,脚本代码的样例也会放出来。(当然apache也可以.htaccess强行重写到waf再转回原页面,但是万一没重写环境呢)

具体代码如下

  1. <?php
  2. //error_reporting(E_ALL);
  3. //ini_set('display_errors', 1);
  4.  
  5. /*
  6. ** 线下攻防php版本waf
  7. **
  8. ** Author: 落
  9. */
  10.  
  11. /*
  12. 检测请求方式,除了get和post之外拦截下来并写日志。
  13. */
  14. if($_SERVER['REQUEST_METHOD'] != 'POST' && $_SERVER['REQUEST_METHOD'] != 'GET'){
  15. write_attack_log("method");
  16. }
  17.  
  18. $url = $_SERVER['REQUEST_URI']; //获取uri来进行检测
  19.  
  20. $data = file_get_contents('php://input'); //获取post的data,无论是否是mutipart
  21.  
  22. $headers = get_all_headers(); //获取header
  23.  
  24. filter_attack_keyword(filter_invisible(urldecode(filter_0x25($url)))); //对URL进行检测,出现问题则拦截并记录
  25. filter_attack_keyword(filter_invisible(urldecode(filter_0x25($data)))); //对POST的内容进行检测,出现问题拦截并记录
  26.  
  27. /*
  28. 检测过了则对输入进行简单过滤
  29. */
  30. foreach ($_GET as $key => $value) {
  31. $_GET[$key] = filter_dangerous_words($value);
  32. }
  33. foreach ($_POST as $key => $value) {
  34. $_POST[$key] = filter_dangerous_words($value);
  35. }
  36. foreach ($headers as $key => $value) {
  37. filter_attack_keyword(filter_invisible(urldecode(filter_0x25($value)))); //对http请求头进行检测,出现问题拦截并记录
  38. $_SERVER[$key] = filter_dangerous_words($value); //简单过滤
  39. }
  40.  
  41. /*
  42. 获取http请求头并写入数组
  43. */
  44. function get_all_headers() {
  45. $headers = array();
  46.  
  47. foreach($_SERVER as $key => $value) {
  48. if(substr($key, 0, 5) === 'HTTP_') {
  49. $headers[$key] = $value;
  50. }
  51. }
  52.  
  53. return $headers;
  54. }
  55.  
  56. /*
  57. 检测不可见字符造成的截断和绕过效果,注意网站请求带中文需要简单修改
  58. */
  59. function filter_invisible($str){
  60. for($i=0;$i<strlen($str);$i++){
  61. $ascii = ord($str[$i]);
  62. if($ascii>126 || $ascii < 32){ //有中文这里要修改
  63. if(!in_array($ascii, array(9,10,13))){
  64. write_attack_log("interrupt");
  65. }else{
  66. $str = str_replace($ascii, " ", $str);
  67. }
  68. }
  69. }
  70. $str = str_replace(array("`","|",";",","), " ", $str);
  71. return $str;
  72. }
  73.  
  74. /*
  75. 检测网站程序存在二次编码绕过漏洞造成的%25绕过,此处是循环将%25替换成%,直至不存在%25
  76. */
  77. function filter_0x25($str){
  78. if(strpos($str,"%25") !== false){
  79. $str = str_replace("%25", "%", $str);
  80. return filter_0x25($str);
  81. }else{
  82. return $str;
  83. }
  84. }
  85.  
  86. /*
  87. 攻击关键字检测,此处由于之前将特殊字符替换成空格,即使存在绕过特性也绕不过正则的\b
  88. */
  89. function filter_attack_keyword($str){
  90. if(preg_match("/select\b|insert\b|update\b|drop\b|delete\b|dumpfile\b|outfile\b|load_file|rename\b|floor\(|extractvalue|updatexml|name_const|multipoint\(/i", $str)){
  91. write_attack_log("sqli");
  92. }
  93.  
  94. //此处文件包含的检测我真的不会写了,求高人指点。。。
  95. if(substr_count($str,$_SERVER['PHP_SELF']) < 2){
  96. $tmp = str_replace($_SERVER['PHP_SELF'], "", $str);
  97. if(preg_match("/\.\.|.*\.php[35]{0,1}/i", $tmp)){
  98. write_attack_log("LFI/LFR");;
  99. }
  100. }else{
  101. write_attack_log("LFI/LFR");
  102. }
  103. if(preg_match("/base64_decode|eval\(|assert\(/i", $str)){
  104. write_attack_log("EXEC");
  105. }
  106. if(preg_match("/flag/i", $str)){
  107. write_attack_log("GETFLAG");
  108. }
  109.  
  110. }
  111.  
  112. /*
  113. 简单将易出现问题的字符替换成中文
  114. */
  115. function filter_dangerous_words($str){
  116. $str = str_replace("'", "‘", $str);
  117. $str = str_replace("\"", "“", $str);
  118. $str = str_replace("<", "《", $str);
  119. $str = str_replace(">", "》", $str);
  120. return $str;
  121. }
  122.  
  123. /*
  124. 获取http的请求包,意义在于获取别人的攻击payload
  125. */
  126. function get_http_raw() {
  127. $raw = '';
  128.  
  129. $raw .= $_SERVER['REQUEST_METHOD'].' '.$_SERVER['REQUEST_URI'].' '.$_SERVER['SERVER_PROTOCOL']."\r\n";
  130.  
  131. foreach($_SERVER as $key => $value) {
  132. if(substr($key, 0, 5) === 'HTTP_') {
  133. $key = substr($key, 5);
  134. $key = str_replace('_', '-', $key);
  135. $raw .= $key.': '.$value."\r\n";
  136. }
  137. }
  138. $raw .= "\r\n";
  139. $raw .= file_get_contents('php://input');
  140. return $raw;
  141. }
  142.  
  143. /*
  144. 这里拦截并记录攻击payload
  145. */
  146. function write_attack_log($alert){
  147. $data = date("Y/m/d H:i:s")." -- [".$alert."]"."\r\n".get_http_raw()."\r\n\r\n";
  148. $ffff = fopen('log_is_a_secret_file.txt', 'a'); //日志路径
  149. fwrite($ffff, $data);
  150. fclose($ffff);
  151. if($alert == 'GETFLAG'){
  152. echo "HCTF{aaaa}"; //如果请求带有flag关键字,显示假的flag。(2333333)
  153. }else{
  154. sleep(15); //拦截前延时15秒
  155. }
  156. exit(0);
  157. }
  158.  
  159. ?>

网络攻防比赛PHP版本WAF的更多相关文章

  1. 网络攻防工具介绍——Wireshark

    网络攻防工具介绍 Wireshark 简介 Wireshark(前称Ethereal)是一个网络封包分析软件.它是一个理想的开源多平台网络协议分析工具.网络封包分析软件的功能是撷取网络封包,并尽可能显 ...

  2. 2018-2019-2 20165206 网络攻防技术 Exp5 MSF基础应用

    - 2018-2019-2 20165206<网络攻防技术>Exp5 MSF基础应用 - 实验任务 1.1一个主动攻击实践,如ms08_067; (1分) 1.2 一个针对浏览器的攻击,如 ...

  3. 2018-2019-2 20165336《网络攻防技术》Exp5 MSF基础应用

    2018-2019-2 20165336<网络攻防技术>Exp5 MSF基础应用 一.攻击实例 主动攻击的实践 ms08_067(成功) payload/generic/shell_rev ...

  4. 2018-2019-2 20165312《网络攻防技术》Exp6 信息搜集与漏洞扫描

    2018-2019-2 20165312<网络攻防技术>Exp6 信息搜集与漏洞扫描 目录 一.信息搜集技术与隐私保护--知识点总结 二.实验步骤 各种搜索技巧的应用 Google Hac ...

  5. 2018-2019-2 20165312《网络攻防技术》Exp5 MSF基础应用

    2018-2019-2 20165312<网络攻防技术>Exp5 MSF基础应用 目录 一.知识点总结 二.攻击实例 主动攻击的实践 ms08_067 payload/generic/sh ...

  6. 2018-2019-2 20165312《网络攻防技术》Exp4 恶意代码分析

    2018-2019-2 20165312<网络攻防技术>Exp4 恶意代码分析 知识点总结 1.有关schtasks schtacks的作用:安排命令和程序定期运行或在指定时间内运行.从计 ...

  7. 2018-2019-2 20165312《网络攻防技术》Exp3 免杀原理与实践

    2018-2019-2 20165312<网络攻防技术>Exp3 免杀原理与实践 课上知识点总结 1.恶意软件检测机制 基于特征码的检测(需要定期更新病毒库) 启发式恶意软件检测(实时监控 ...

  8. 2018-2019-2 20165205 网络攻防Exp3免杀原理与实践

    2018-2019-2 20165205 网络攻防Exp3免杀原理与实践 一.实践内容 1.1正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,加壳工具,使用 ...

  9. 2018-2019-2 20165315《网络攻防技术》Exp6 信息搜集与漏洞扫描

    2018-2019-2 20165315<网络攻防技术>Exp6 信息搜集与漏洞扫描 目录 一.实验内容 二.实验步骤 1.各种搜索技巧的应用 2.DNS IP注册信息的查询 3.基本的扫 ...

随机推荐

  1. 【译】仿Taasky的3D翻转菜单动画实现

    最终效果 最终效果 开始 首先下载并打开一个事先搭好架子的Demo,然后来分析一下.这个Demo包含一个主页和详情页,其中MenuViewController继承自UITableViewControl ...

  2. 【代码笔记】iOS-等待动画

    一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...

  3. IOS设计模式-观察者模式

    前言:23种软件设计模式中的观察者模式,也是在软件开发中,挺常用的一种设计模式.而在苹果开发中,苹果Cocoa框架已经给我们实现了这个设 计模式,那就是通知和KVO(Key-Value Observi ...

  4. Entity Framework 4.1 - Code First 指定外键名称

    Entity Framework 4.1 中,生成外键的方式有以下几种: 1-指定导航属性,会自动生成外键,命名规则为:“表名_主键名”2-默认情况下与导航属性的主键名称相同的字段会自动被标记为外键, ...

  5. (转) 一步一步学习ASP.NET 5 (五)- TypeScript

    转发:微软MVP 卢建晖 的文章,希望对大家有帮助.原文:http://blog.csdn.net/kinfey/article/details/44568971 编者语 : 人总会多次犯错,历史上告 ...

  6. #研发解决方案介绍#Recsys-Evaluate(推荐评测)

    郑昀 基于刘金鑫文档 最后更新于2014/12/1 关键词:recsys.推荐评测.Evaluation of Recommender System.piwik.flume.kafka.storm.r ...

  7. Asp.net MVC的Model Binder工作流程以及扩展方法(2) - Binder Attribute

    上篇文章中分析了Custom Binder的弊端: 由于Custom Binder是和具体的类型相关,比如指定类型A由我们的Custom Binder解析,那么导致系统运行中的所有Action的访问参 ...

  8. C# 读取在存储过程多结果集

    --SQL Server 测试环境搭建: Create database Test; go USE [Test] GO if OBJECT_ID('Tab','U') is not null drop ...

  9. 【Oracle XE系列之一】Windows10_X64环境 安装Oracle XE11gR2 X64数据库

    一.安装 1.去Oracle官网下载XE版的安装包[下载路径](Oracle Database Express Edition 11g Release 2 for Windows x64),解压. 2 ...

  10. 虚拟机centos6.5 --hadoop2.6集群环境搭建

    一.环境说明 虚拟机:virtualBox 系统:centos6.5,64位 集群:3个节点 master 192.168.12.232 slave01 192.168.12.233 slave02 ...