[SWPUCTF 2023 秋季新生赛]Pingpingping

这种是ctf中比较简单的一类题,主要解法基本上也就那些形式。

这道题我给它提出来主要是涉及了一下比较零散的知识点,觉得想要跟大家分享一下。

<?php
highlight_file(__FILE__);
error_reporting(0);
$_ping = $_GET['Ping_ip.exe'];
if(isset($_ping)){
    system("ping -c 3 ".$_ping);
}else{
    $data = base64_encode(file_get_contents("error.png"));
    echo "<img src='data:image/png;base64,$data'/>";
} 

直接给出了我们的源代码,我来简单的进行一些代码解说。

这代码非常简单,先是需要我们以get的方式提交参数Ping_ip.exe。然后我们提交的参数会在system()函数中与ping命令连接在一起进行执行。

那么很明了的思路就是使用我们的cat命令抓取我们的flag。

 system("ping -c 3 ".$_ping);

可以看到我们这里面的ping命令形式是不完整的,所以我们必须要先补全我们的ping命令再进行cat命令抓取。

那么第一个陷阱点出现了,我们必须提交的参数是Ping_ip.exe但是:

PHP中我们变量名只有数字字母下划线,被get或者post传入的变量名,如果含有空格、+、[则会被转化为_,如果传入[,它被转化为_之后,后面的字符就会被保留下来不会被替换。

可以看到如果直接提交则会发生错误。

 

所以我们必须先转义前面的字符,以防止后面的点被转义。

为了使其转义为下划线所以我们选择使用[来替换。

接下来就是了解怎样补全ping命令了。

ping命令的最基本形式只需包含目标主机的地址。我们只需要将它所给出的ping命令加上主机地址即可。这里我测试的是任何ip都可以。

最终payload:

?Ping[ip.exe=127.0.0.1||cat /flag

 在payload中我们使用了“||”符号,“||” 是一个管道操作符,它用于在命令行中执行多个命令,当前一个命令执行成功时,才会执行后一个命令。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值