webpwn的一些总结
字数 1450 2025-08-22 12:23:18

Web PWN 基础与实战总结

一、Socket 套接字基础

1. 基本概念

套接字是网络编程中的通信机制,是支持 TCP/IP 网络通信的基本操作单元,可以看作是不同主机之间进程进行双向通信的端点。

关键要素:

  • IP 地址:源 IP 标识发送方区域,目的 IP 标识接收方具体位置
  • 端口号:16 位整数,标识主机上的特定进程
    • 一个端口号只能被一个进程占用
    • IP + 端口号能唯一标识网络上的某一主机的某一进程

2. Socket API 详解

核心函数

  1. socket() - 创建套接字

    int socket(int domain, int type, int protocol);
    
    • 参数:
      • domain:协议族(AF_INET: IPv4, AF_INET6: IPv6)
      • type:套接字类型(SOCK_STREAM: TCP, SOCK_DGRAM: UDP)
      • protocol:通常为 0(自动选择)
  2. bind() - 绑定端口号

    int bind(int socket, const struct sockaddr *address, socklen_t address_len);
    
  3. listen() - 开始监听

    int listen(int socket, int backlog);
    
    • backlog:连接请求队列的最大长度
  4. accept() - 接受连接

    int accept(int socket, struct sockaddr* address, socklen_t* address_len);
    
  5. connect() - 建立连接

    int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
    
  6. close() - 关闭套接字

    int close(int fd);
    

3. TCP 通信流程

服务器端流程:

  1. 创建套接字 (socket)
  2. 绑定端口 (bind)
  3. 开始监听 (listen)
  4. 接受连接 (accept)
  5. 数据收发 (send/recv)
  6. 关闭连接 (close)

客户端流程:

  1. 创建套接字 (socket)
  2. 连接服务器 (connect)
  3. 数据收发 (send/recv)
  4. 关闭连接 (close)

二、二进制安全实战分析

1. 广东省第三届信息安全大赛 - Server 题目分析

静态分析关键点

fd = socket(2, 1, 0);  // AF_INET(2), SOCK_STREAM(1), 自动选择协议(0)
addr.sa_family = 2;     // AF_INET
*(_WORD *)addr.sa_data = htons(0x2A88u);  // 端口号 10888
bind(fd, &addr, 0x10u);
listen(fd, 2);

关键漏洞点:

  1. 接收数据:
    v13 = recv(v14, buf, 0x80uLL, 0);
    buf[v13 - 1] = 0;  // 手动添加字符串结束符
    
  2. 字符串分割:
    v12 = strtok(buf, ":");  // 第一个冒号前的内容
    v11 = strtok(0LL, ":");  // 第一个冒号后的内容
    
  3. 关键函数调用:
    src = sub_400B8A((__int64)v12, (__int64)v11);
    

漏洞利用思路

  1. 通过构造特定格式的输入(如 "0:00")触发整数溢出
  2. 利用溢出条件覆盖关键变量(如文件指针)
  3. 最终目标是读取 flag 文件而非默认的 msg 文件

2. CISCN2021 Final - Message_Board 题目分析

漏洞分析

关键漏洞:

size_t n = Content-Length;  // 用户可控
while (n--) {  // 当n=0时,n--会变为极大值
    // 缓冲区操作
}

利用方法:

  1. 通过设置 Content-Length: 0 触发整数溢出
  2. 构造ROP链或控制程序流
  3. 利用文件读取功能泄露flag

利用步骤

  1. 发送特殊构造的HTTP请求:
    payload = b'POST /submit HTTP/1.1\r\nContent-Length: 0\r\nCookie: Username=flag;Messages=flag\r\n\r\n'
    
  2. 构造ROP链覆盖返回地址:
    payload = b'a'*(0x82e-14+8) + p32(0x804C180+0x42c+len('Cookie: Username=flag;Messages=')) + p32(0x80492BD)
    
  3. 利用文件读取功能获取flag

三、补充知识

1. accept() 函数深入

内核实现关键点:

  1. 创建新的socket实例
  2. 阻塞等待三次握手完成
  3. 从全连接队列中取出socket
  4. 将socket与新连接绑定

返回值:

  • 成功:返回新的文件描述符
  • 失败:返回-1

2. 网络字节序转换

常用函数:

  • htons() - 主机到网络短整型
  • htonl() - 主机到网络长整型
  • ntohs() - 网络到主机短整型
  • ntohl() - 网络到主机长整型

四、防御建议

  1. 输入验证

    • 严格检查所有输入数据的长度和格式
    • 对特殊字符进行过滤或转义
  2. 整数溢出防护

    • 使用安全的数据类型和检查
    • 对可能溢出的操作进行边界检查
  3. 内存安全

    • 使用安全的字符串操作函数
    • 启用编译器的安全保护机制(如栈保护)
  4. 权限控制

    • 最小权限原则运行服务
    • 隔离敏感操作

五、总结

Web PWN 题目通常结合网络编程漏洞和二进制漏洞,需要掌握:

  1. 网络协议和套接字编程基础
  2. 二进制漏洞分析与利用技术
  3. 特定场景下的漏洞利用技巧
  4. 防御措施的绕过方法

通过分析实际比赛题目,可以深入理解这些技术的实际应用场景和利用方法。

Web PWN 基础与实战总结 一、Socket 套接字基础 1. 基本概念 套接字是网络编程中的通信机制,是支持 TCP/IP 网络通信的基本操作单元,可以看作是不同主机之间进程进行双向通信的端点。 关键要素: IP 地址 :源 IP 标识发送方区域,目的 IP 标识接收方具体位置 端口号 :16 位整数,标识主机上的特定进程 一个端口号只能被一个进程占用 IP + 端口号能唯一标识网络上的某一主机的某一进程 2. Socket API 详解 核心函数 socket() - 创建套接字 参数: domain :协议族(AF_ INET: IPv4, AF_ INET6: IPv6) type :套接字类型(SOCK_ STREAM: TCP, SOCK_ DGRAM: UDP) protocol :通常为 0(自动选择) bind() - 绑定端口号 listen() - 开始监听 backlog :连接请求队列的最大长度 accept() - 接受连接 connect() - 建立连接 close() - 关闭套接字 3. TCP 通信流程 服务器端流程: 创建套接字 (socket) 绑定端口 (bind) 开始监听 (listen) 接受连接 (accept) 数据收发 (send/recv) 关闭连接 (close) 客户端流程: 创建套接字 (socket) 连接服务器 (connect) 数据收发 (send/recv) 关闭连接 (close) 二、二进制安全实战分析 1. 广东省第三届信息安全大赛 - Server 题目分析 静态分析关键点 关键漏洞点: 接收数据: 字符串分割: 关键函数调用: 漏洞利用思路 通过构造特定格式的输入(如 "0:00")触发整数溢出 利用溢出条件覆盖关键变量(如文件指针) 最终目标是读取 flag 文件而非默认的 msg 文件 2. CISCN2021 Final - Message_ Board 题目分析 漏洞分析 关键漏洞: 利用方法: 通过设置 Content-Length: 0 触发整数溢出 构造ROP链或控制程序流 利用文件读取功能泄露flag 利用步骤 发送特殊构造的HTTP请求: 构造ROP链覆盖返回地址: 利用文件读取功能获取flag 三、补充知识 1. accept() 函数深入 内核实现关键点: 创建新的socket实例 阻塞等待三次握手完成 从全连接队列中取出socket 将socket与新连接绑定 返回值: 成功:返回新的文件描述符 失败:返回-1 2. 网络字节序转换 常用函数: htons() - 主机到网络短整型 htonl() - 主机到网络长整型 ntohs() - 网络到主机短整型 ntohl() - 网络到主机长整型 四、防御建议 输入验证 : 严格检查所有输入数据的长度和格式 对特殊字符进行过滤或转义 整数溢出防护 : 使用安全的数据类型和检查 对可能溢出的操作进行边界检查 内存安全 : 使用安全的字符串操作函数 启用编译器的安全保护机制(如栈保护) 权限控制 : 最小权限原则运行服务 隔离敏感操作 五、总结 Web PWN 题目通常结合网络编程漏洞和二进制漏洞,需要掌握: 网络协议和套接字编程基础 二进制漏洞分析与利用技术 特定场景下的漏洞利用技巧 防御措施的绕过方法 通过分析实际比赛题目,可以深入理解这些技术的实际应用场景和利用方法。