如何伪造客户端至服务器请求?使仅接受localhost的服务器认可请求
能不能伪造localhost请求?看服务器的判断逻辑
首先得明确:服务器限制"仅接受localhost请求",一般分两种验证方式,对应不同的解决办法:
情况1:服务器靠HTTP请求头判断来源
如果服务器是通过X-Forwarded-For、X-Real-IP这类自定义头来识别请求是否来自localhost,那用curl直接加对应请求头就能绕过:
- 优先试
X-Forwarded-For:curl -H "X-Forwarded-For: 127.0.0.1" http://你的目标服务器地址 - 要是不行换
X-Real-IP(部分服务器用这个字段):curl -H "X-Real-IP: 127.0.0.1" http://你的目标服务器地址
如果这俩都没用,得去查服务器的配置或者日志,看它具体依赖哪个请求头做验证。
情况2:服务器检查真实TCP源IP
如果服务器是直接校验网络层的真实源IP(也就是你发起请求的设备IP是不是127.0.0.1/::1),那远程直接伪造是不可能的——源IP是网络路由决定的,你没法让远程服务器把你的公网IP当成localhost。这种情况只有一个靠谱的解决办法:
在目标服务器上运行一个本地代理/转发工具,然后你通过这个代理发送请求。此时请求是从服务器本地发起的,源IP自然是127.0.0.1,服务器会直接接受。
举个简单的Python转发脚本(在服务器上运行):
import socket import threading def relay_request(client_conn): # 接收客户端的请求数据 req_data = client_conn.recv(4096) # 连接到本地的目标服务(假设目标服务在8080端口) local_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) local_server.connect(("127.0.0.1", 8080)) # 转发请求并取回响应 local_server.send(req_data) res_data = local_server.recv(4096) # 把响应发回给客户端 client_conn.send(res_data) # 关闭连接 client_conn.close() local_server.close() def start_proxy(): # 绑定到服务器的公网IP和9999端口,允许远程连接 proxy_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) proxy_socket.bind(("0.0.0.0", 9999)) proxy_socket.listen(5) print(f"本地代理已启动,监听 0.0.0.0:9999") while True: client, addr = proxy_socket.accept() # 用线程处理每个请求 thread = threading.Thread(target=relay_request, args=(client,)) thread.start() if __name__ == "__main__": start_proxy()
运行脚本后,你本地用curl通过这个代理请求:
curl -x http://服务器公网IP:9999 http://127.0.0.1:8080
关于你之前的疑问
- 换WiFi后公网IP失效:说明服务器的白名单里只添加了你原来WiFi的公网IP,换网后你的公网IP改变,自然被拒绝。
- curl加头没成功:大概率是服务器根本不依赖HTTP头做验证,只认真实的源IP,所以加头没用。
内容的提问来源于stack exchange,提问作者Juan David Arce
相关产品推荐
相关产品推荐

