HCTF时PHP WAF然有RLFI漏洞

tips:from菜鸡队长

这次去打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再转回原页面,但是万一没重写环境呢)

具体代码如下:

<?php
//error_reporting(E_ALL);
//ini_set(‘display_errors‘, 1);

/*
** 线下攻防php版本waf
**
** Author: 落
*/

/*
检测请求方式,除了get和post之外拦截下来并写日志。
*/
if($_SERVER[‘REQUEST_METHOD‘] != ‘POST‘ && $_SERVER[‘REQUEST_METHOD‘] != ‘GET‘){
    write_attack_log("method");
}

$url = $_SERVER[‘REQUEST_URI‘]; //获取uri来进行检测

$data = file_get_contents(‘php://input‘); //获取post的data,无论是否是mutipart

$headers = get_all_headers(); //获取header

filter_attack_keyword(filter_invisible(urldecode(filter_0x25($url)))); //对URL进行检测,出现问题则拦截并记录
filter_attack_keyword(filter_invisible(urldecode(filter_0x25($data)))); //对POST的内容进行检测,出现问题拦截并记录

/*
检测过了则对输入进行简单过滤
*/
foreach ($_GET as $key => $value) {
    $_GET[$key] = filter_dangerous_words($value);
}
foreach ($_POST as $key => $value) {
    $_POST[$key] = filter_dangerous_words($value);
}
foreach ($headers as $key => $value) {
    filter_attack_keyword(filter_invisible(urldecode(filter_0x25($value)))); //对http请求头进行检测,出现问题拦截并记录
    $_SERVER[$key] = filter_dangerous_words($value); //简单过滤
}

/*
获取http请求头并写入数组
*/
function get_all_headers() {
    $headers = array(); 

    foreach($_SERVER as $key => $value) {
        if(substr($key, 0, 5) === ‘HTTP_‘) {
            $headers[$key] = $value;
        }
    } 

    return $headers;
} 

/*
检测不可见字符造成的截断和绕过效果,注意网站请求带中文需要简单修改
*/
function filter_invisible($str){
    for($i=0;$i<strlen($str);$i++){
        $ascii = ord($str[$i]);
        if($ascii>126 || $ascii < 32){ //有中文这里要修改
            if(!in_array($ascii, array(9,10,13))){
                write_attack_log("interrupt");
            }else{
                $str = str_replace($ascii, " ", $str);
            }
        }
    }
    $str = str_replace(array("`","|",";",","), " ", $str);
    return $str;
}

/*
检测网站程序存在二次编码绕过漏洞造成的%25绕过,此处是循环将%25替换成%,直至不存在%25
*/
function filter_0x25($str){
    if(strpos($str,"%25") !== false){
        $str = str_replace("%25", "%", $str);
        return filter_0x25($str);
    }else{
        return $str;
    }
}

/*
攻击关键字检测,此处由于之前将特殊字符替换成空格,即使存在绕过特性也绕不过正则的\b
*/
function filter_attack_keyword($str){
    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)){
        write_attack_log("sqli");
    }

    //此处文件包含的检测我真的不会写了,求高人指点。。。
    if(substr_count($str,$_SERVER[‘PHP_SELF‘]) < 2){
        $tmp = str_replace($_SERVER[‘PHP_SELF‘], "", $str);
        if(preg_match("/\.\.|.*\.php[35]{0,1}/i", $tmp)){
            write_attack_log("LFI/LFR");;
        }
    }else{
        write_attack_log("LFI/LFR");
    }
    if(preg_match("/base64_decode|eval\(|assert\(/i", $str)){
        write_attack_log("EXEC");
    }
    if(preg_match("/flag/i", $str)){
        write_attack_log("GETFLAG");
    }

}

/*
简单将易出现问题的字符替换成中文
*/
function filter_dangerous_words($str){
    $str = str_replace("‘", "‘", $str);
    $str = str_replace("\"", "“", $str);
    $str = str_replace("<", "《", $str);
    $str = str_replace(">", "》", $str);
    return $str;
}

/*
获取http的请求包,意义在于获取别人的攻击payload
*/
function get_http_raw() {
    $raw = ‘‘; 

    $raw .= $_SERVER[‘REQUEST_METHOD‘].‘ ‘.$_SERVER[‘REQUEST_URI‘].‘ ‘.$_SERVER[‘SERVER_PROTOCOL‘]."\r\n"; 

    foreach($_SERVER as $key => $value) {
        if(substr($key, 0, 5) === ‘HTTP_‘) {
            $key = substr($key, 5);
            $key = str_replace(‘_‘, ‘-‘, $key);
            $raw .= $key.‘: ‘.$value."\r\n";
        }
    }
    $raw .= "\r\n";
    $raw .= file_get_contents(‘php://input‘);
    return $raw;
}

/*
这里拦截并记录攻击payload
*/
function write_attack_log($alert){
    $data = date("Y/m/d H:i:s")." -- [".$alert."]"."\r\n".get_http_raw()."\r\n\r\n";
    $ffff = fopen(‘log_is_a_secret_file.txt‘, ‘a‘); //日志路径
    fwrite($ffff, $data);
    fclose($ffff);
    if($alert == ‘GETFLAG‘){
        echo "HCTF{aaaa}"; //如果请求带有flag关键字,显示假的flag。(2333333)
    }else{
        sleep(15); //拦截前延时15秒
    }
    exit(0);
}

?>
时间: 11-01

HCTF时PHP WAF然有RLFI漏洞的相关文章

CVE-2017-7269—IIS 6.0 WebDAV远程代码执行漏洞分析

漏洞描述: 3月27日,在Windows 2003 R2上使用IIS 6.0 爆出了0Day漏洞(CVE-2017-7269),漏洞利用PoC开始流传,但糟糕的是这产品已经停止更新了.网上流传的poc下载链接如下. github地址:https://github.com/edwardz246003/IIS_exploit 结合上面的POC,我们对漏洞的成因及利用过程进行了详细的分析.在分析过程中,对poc的exploit利用技巧感到惊叹,多次使用同一个漏洞函数触发,而同一个漏洞同一段漏洞利用代码

Ossim 中漏洞扫描详解

Ossim 中漏洞扫描详解 Openvas是一套开源漏洞扫描系统,如果手动搭建需要复杂的过程,花费不少人力和时间成本,此文主要针对OSSIM平台下如何以图形化方式操作漏洞扫描的过程. 准备工作:首先确保没有运行的扫描进程和任务 扫描漏洞同时升级漏洞库会导致升级失败. 第一步:同步插件 #openvas-nvt-sync 同步数万个插件时间比较长,可以去喝杯咖啡啦,或者了解一下插件的组成. 表1 Openvas主要脚本分类及分布情况 规则名称 数量 备注 IIS_frontpage_DOS_2.n

黑客是怎样绕过WAF讲解

什么是WAFWeb Application Firewall通过执行一系列针对HTTP/HTTPS的安全策略来防御对Web应用的攻击.目前主要有单设备WAF与云WAFWAF的现状1.太多数WAF能够拦截较为普通的WEB攻击2.大多数WAF没有针对热点漏洞奇葩攻击EXP防御的能力3.基本所有的WAF都存在策略性绕过4.由于waf的业务限制等各种原因导致存在通用绕过 WAF逻辑漏洞及白名单阶段的绕过1.搜索引擎白名单(判断引擎方式不严)2.IP段白名单绕过3.目录白名单绕过4.绕过代理直接请求源站(

黑客是如何绕过WAF的

1.什么是WAF Web Application Firewall 通过执行一系列针对HTTP/HTTPS的安全策略来防御对Web应用的攻击. 目前主要有单设备WAF与云WAF 2.WAF的现状 1.太多数WAF能够拦截较为普通的WEB攻击  2.大多数WAF没有针对热点漏洞奇葩攻击EXP防御的能力 3.基本所有的WAF都存在策略性绕过4.由于waf的业务限制等各种原因导致存在通用绕过 3.WAF应用分析 举例DEDECMS的一个变量注入漏洞 http://localhost/plus/down

Java反序列化漏洞分析

相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 http://www.tuicool.com/articles/ZvMbIne http://www.freebuf.com/vuls/86566.html http://sec.chinabyte.com/435/13618435.shtml http://www.myhack58.com/Articl

2015年11月数据安全漏洞分析报告

报告核心观点 1.千帆过尽,SQL注入仍"不改" 2.本月金融业漏洞增长尤为突出 3.11月常见数据泄露原因分析 4.解决弱口令安全建议 报告正文 2015年11月,安华每日安全资讯总结发布了126个数据泄密高危漏洞,这些漏洞分别来自乌云.补天.漏洞盒子等平台,涉及8个行业,公司机构.互联 网.交通运输.教育.金融.能源.运营商.政府.漏洞类型涉及,SQL注入.系统漏洞.弱口令等7类,其中SQL注入仍然是漏洞类型的重灾区. 千帆过尽,SQL注入仍"不改" 数据安全问

[055] SSL 3.0曝出Poodle漏洞的解决方案

SSL 3.0曝出高危漏洞 2014年10月15日,Google研究人员公布SSL 3.0协议存在一个非常严重的漏洞,该漏洞可被黑客用于截取浏览器与服务器之间进行传输的加密数据,如网银账号.邮箱账号.个人隐私等等.SSL 3.0的漏洞允许攻击者发起降级攻击,即欺骗浏览器说“服务器不支持更安全的安全传输层(TLS)协议”,然后强制其转向使用SSL 3.0,在强制浏览器采用SSL 3.0与服务器进行通讯之后,黑客就可以利用中间人攻击来解密HTTPs的cookies,Google将其称之为POODLE

[055] SSL 3.0曝出Poodle漏洞的解决方案-----开发者篇

SSL 3.0曝出高危漏洞 2014年10月15日,Google研究人员公布SSL 3.0协议存在一个非常严重的漏洞,该漏洞可被黑客用于截取浏览器与服务器之间进行传输的加密数据,如网银账号.邮箱账号.个人隐私等等.SSL 3.0的漏洞允许攻击者发起降级攻击,即欺骗浏览器说"服务器不支持更安全的安全传输层(TLS)协议",然后强制其转向使用SSL 3.0,在强制浏览器采用SSL 3.0与服务器进行通讯之后,黑客就可以利用中间人攻击来解密HTTPs的cookies,Google将其称之为P

[转载]我的WafBypass之道(upload篇)

现在位置: 首页 > 文章 > Web安全 > 正文 我的WafBypass之道(upload篇) 2016 /11/30 15:20 4,901 沙发 0x00 前言 玩waf当然也要讲究循序渐进,姊妹篇就写文件上传好了,感觉也就SQLi和Xss的WafBypass最体现发散性思维的,而文件上传.免杀.权限提升这几点的Bypass更需要的是实战的经验.本文内容为沉淀下来的总结以及一些经典案例.想到哪写到哪,所以可能不是很全.创造姿势不易,且行且珍惜.(案例图不好上,毕竟是upload的