webpwn的一些总结
字数 1450 2025-08-22 12:23:18
Web PWN 基础与实战总结
一、Socket 套接字基础
1. 基本概念
套接字是网络编程中的通信机制,是支持 TCP/IP 网络通信的基本操作单元,可以看作是不同主机之间进程进行双向通信的端点。
关键要素:
- IP 地址:源 IP 标识发送方区域,目的 IP 标识接收方具体位置
- 端口号:16 位整数,标识主机上的特定进程
- 一个端口号只能被一个进程占用
- IP + 端口号能唯一标识网络上的某一主机的某一进程
2. Socket API 详解
核心函数
-
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(自动选择)
- 参数:
-
bind() - 绑定端口号
int bind(int socket, const struct sockaddr *address, socklen_t address_len); -
listen() - 开始监听
int listen(int socket, int backlog);backlog:连接请求队列的最大长度
-
accept() - 接受连接
int accept(int socket, struct sockaddr* address, socklen_t* address_len); -
connect() - 建立连接
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); -
close() - 关闭套接字
int close(int fd);
3. TCP 通信流程
服务器端流程:
- 创建套接字 (socket)
- 绑定端口 (bind)
- 开始监听 (listen)
- 接受连接 (accept)
- 数据收发 (send/recv)
- 关闭连接 (close)
客户端流程:
- 创建套接字 (socket)
- 连接服务器 (connect)
- 数据收发 (send/recv)
- 关闭连接 (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);
关键漏洞点:
- 接收数据:
v13 = recv(v14, buf, 0x80uLL, 0); buf[v13 - 1] = 0; // 手动添加字符串结束符 - 字符串分割:
v12 = strtok(buf, ":"); // 第一个冒号前的内容 v11 = strtok(0LL, ":"); // 第一个冒号后的内容 - 关键函数调用:
src = sub_400B8A((__int64)v12, (__int64)v11);
漏洞利用思路
- 通过构造特定格式的输入(如 "0:00")触发整数溢出
- 利用溢出条件覆盖关键变量(如文件指针)
- 最终目标是读取 flag 文件而非默认的 msg 文件
2. CISCN2021 Final - Message_Board 题目分析
漏洞分析
关键漏洞:
size_t n = Content-Length; // 用户可控
while (n--) { // 当n=0时,n--会变为极大值
// 缓冲区操作
}
利用方法:
- 通过设置 Content-Length: 0 触发整数溢出
- 构造ROP链或控制程序流
- 利用文件读取功能泄露flag
利用步骤
- 发送特殊构造的HTTP请求:
payload = b'POST /submit HTTP/1.1\r\nContent-Length: 0\r\nCookie: Username=flag;Messages=flag\r\n\r\n' - 构造ROP链覆盖返回地址:
payload = b'a'*(0x82e-14+8) + p32(0x804C180+0x42c+len('Cookie: Username=flag;Messages=')) + p32(0x80492BD) - 利用文件读取功能获取flag
三、补充知识
1. accept() 函数深入
内核实现关键点:
- 创建新的socket实例
- 阻塞等待三次握手完成
- 从全连接队列中取出socket
- 将socket与新连接绑定
返回值:
- 成功:返回新的文件描述符
- 失败:返回-1
2. 网络字节序转换
常用函数:
htons()- 主机到网络短整型htonl()- 主机到网络长整型ntohs()- 网络到主机短整型ntohl()- 网络到主机长整型
四、防御建议
-
输入验证:
- 严格检查所有输入数据的长度和格式
- 对特殊字符进行过滤或转义
-
整数溢出防护:
- 使用安全的数据类型和检查
- 对可能溢出的操作进行边界检查
-
内存安全:
- 使用安全的字符串操作函数
- 启用编译器的安全保护机制(如栈保护)
-
权限控制:
- 最小权限原则运行服务
- 隔离敏感操作
五、总结
Web PWN 题目通常结合网络编程漏洞和二进制漏洞,需要掌握:
- 网络协议和套接字编程基础
- 二进制漏洞分析与利用技术
- 特定场景下的漏洞利用技巧
- 防御措施的绕过方法
通过分析实际比赛题目,可以深入理解这些技术的实际应用场景和利用方法。