|
访问一个网站,打开对网屏幕上蹦出“405 Method Not Allowed”,网站威胁多数人第一反应是显示关掉页面走人。但如果你是安全这个网站的管理员,或者刚好在排查安全问题,打开对网这个405可能比500错误更值得琢磨。网站威胁它不一定是显示服务器崩了,反而可能是安全一道被触发的安全防线。 先搞清楚405是打开对网什么。HTTP状态码里,网站威胁405表示服务器认识请求里的显示方法(比如GET、POST、安全PUT、打开对网DELETE),网站威胁但目标资源不允许用这个方法。显示举个例子,你往一个只接受GET请求的静态页面发了个POST,服务器就会回405。听起来人畜无害,对吧?问题在于,攻击者经常利用各种HTTP方法探测服务器配置。如果服务器对不该开放的方法没有正确拦截,而是用405“礼貌拒绝”,这本身就可能泄露信息——攻击者会知道哪些方法被服务器识别了,哪些端点存在。 我见过一个真实案例。某小型电商网站的后台登录接口,正常只接受POST。安全人员做测试时,用PUT方法去请求同一个URL,服务器返回405,但响应头里带了一行Allow: POST, OPTIONS。这等于告诉对方:“我这儿只认POST和OPTIONS,别的别试了。”攻击者拿到这个信息,就可以集中精力构造POST请求的绕过手段,比如参数污染、内容类型混淆。405没挡住攻击,反而成了指路牌。 更麻烦的情况是,有些老旧的框架或中间件在处理不认识的HTTP方法时,会直接返回405,但背后可能触发了意料之外的逻辑。比如某个基于Java Servlet的网站,对TRACE方法返回405,看似安全。可如果服务器同时开启了不安全的CORS配置,攻击者用TRACE方法配合跨域请求,有可能读到本不该读的响应内容。405在这里不是威胁本身,而是威胁的入口——它说明服务器在方法处理上存在不一致,这种不一致往往连着更深的漏洞。 那是不是说,网站返回405就一定不安全?当然不是。关键看返回405之后,服务器还做了什么。健康的做法是:对于不允许的方法,直接返回405,并且响应里不包含任何额外信息,比如Allow头可以省略,或者只列出真正支持的方法。同时,服务器应该记录这次请求,因为频繁的405错误往往意味着有人在扫描。我自己的服务器日志里,一旦某个IP在短时间内触发大量405,我会直接把它丢进黑名单。这比等它触发403或401更主动。 另一个容易被忽略的点:405和CSRF(跨站请求伪造)的关联。很多网站用POST做状态变更,用GET做查询。如果某个删除操作的接口错误地允许了GET方法,但服务器又因为某些原因对GET返回405,开发者可能以为“反正GET被拒了,没事”。可攻击者可以用表单自动提交POST,而浏览器不会因为405就阻止请求发出。405只是服务器端的拒绝,请求本身已经到达了。如果后端逻辑有缺陷,比如先执行了删除再检查方法,那405就是个事后通知,数据已经没了。 所以,当你看到405,别只当成一个普通的客户端错误。对普通用户,它意味着你点错了按钮或者提交了错误的表单。对网站维护者,它是一面镜子:照出你的方法白名单是否严格,错误处理是否泄露信息,日志监控是否到位。我习惯在Nginx配置里对未定义的方法直接返回444(关闭连接),而不是405。因为444连响应都不给,扫描器什么都拿不到。当然,这会影响调试,得看具体场景。 最后说个反直觉的观察:有些网站故意对敏感接口返回405,而不是403或401,目的是混淆攻击者。比如一个管理后台,你未授权访问时它不说“禁止”,而是说“方法不允许”。攻击者可能以为是自己用错了方法,换一个再试,结果浪费大量时间。这种策略叫“安全模糊化”,不算正统防御,但在低价值目标上偶尔管用。不过别依赖它,真正的安全还是靠严格的输入验证、最小权限和方法白名单。405可以是警报,也可以是烟雾弹,取决于你怎么用。 |