题目解析
解题链接:http://ctf5.shiyanbar.com/sHeader/
点开题目:
这题提示很明显,看它的要求,明显就是要修改http的请求头伪造身份。
所以就按照它说的,IE浏览器,.net9.9,英国访问
User-Agent加入:
- compatible;MSIE 6.0 表示IE浏览器
- .NET CLR 9.9 表示.NET 9.9 (注意开头那个点!)
Accept-Language加入
- en-gb 表示英国地区
修改好后提交请求头得到flag:
本题知识点
请求头伪造
0x01 IP伪造
在TCP/IP中,我们可以伪造数据包来源IP,但是这样会导致发出去的数据包返回到伪造的IP上(你发件人地址填错了,别人给你发回来的时候肯定就按照错的地址发了)。
但是在应用层协议HTTP上实现就比较容易了,通过伪造IP可以让非授权IP访问服务器,绕过IP地址过滤,甚至可以钻服务器的漏洞进行攻击。
例如在投票系统中,为了防止刷票,往往会限制IP投票次数,比如一个IP只能投2票,那么如果伪造IP,就可以绕过IP限制,进行刷票。
IP伪造的关键是X-Forwarded-For。
关于XFF这里不细讲,想了解更多的同学可以自行学习。我们直接讲它的应用。
它的格式如下:
X-Forwarded-For: client, proxy1, proxy2
XFF包含多个IP地址,每个值通过逗号+空格隔开,最左边是最原始的客户端的IP,后面如果有多层代理,那么每一层代理会在后面追加它自己的IP。
实际上,一般的客户端(例如浏览器)发送HTTP请求是没有XFF头的,当请求到达第一个代理服务器时,代理服务器会加上XFF请求头,并将值设定为客户端的IP地址。
但如果客户端在发起请求时就带了伪造的XFF头,那么后续的代理服务器就只会追加而不会覆盖,最终服务器获取的左边的第一个IP就是我们自己伪造的IP,就达到了伪造的目的。
0x02 User-Agent伪造
User Agent中文名为用户代理,是Http协议中的一部分,属于头域的组成部分,User Agent也简称UA。它是一个特殊字符串头,是一种向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核等信息的标识。通过这个标识,用户所访问的网站可以显示不同的排版从而为用户提供更好的体验或者进行信息统计。比如说手机用户和电脑访问的网页排版样式等都是不一样的,这就是通过UA检测出来的。
UA的语法如下:
User-Agent: <product> / <product-version> <comment>
product代表软件产品名称,product-version表示版本,comment表示一些其他信息。具体UA语法可以参照这篇文章《User Agent 趣事谈》和IETF标准文档,这里不展开讲了。
一般最常见的伪造就是伪造浏览器类型。有时候还要求伪造操作系统或者组件的版本等等,具体根据题目要求进行伪造。本题就要求特定的浏览器,以及特定的.NET版本。
一般常见的UA标识可以参考这篇文章《User-Agent大全》,内容实在太多了就不放在这儿了。
0x03 地区伪造
实际上地区伪造是在Accept-Language请求头中完成的。
Accept-Language请求头允许客户端声明它可以理解的自然语言,以及优先选择的区域方言。
AL的语法如下:
Accept-Language: <language>
Accept-Language: <locale>
Accept-Language: *
// Multiple types, weighted with the quality value syntax:
Accept-Language: fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5
language:用含有两到三个字符的字符串表示的语言码。
locate:完整的语言标签。除了语言本身之外,还会包含其他方面的信息,显示在中划线("-")后面。最常见的额外信息是国家或地区变种(如"en-US")或者表示所用的字母系统(如"sr-Lat")。其他变种诸如拼字法("de-DE-1996")等通常不被应用在这种场合。
* :任意语言;"*"表示通配符。
;q= (q-factor weighting)紧跟在所标识语言的后面:
值代表优先顺序,用相对质量价值表示,又称为权重。q是权重系数,范围 0 =< q <= 1,q 值越大,请求越倾向于获得其“;”之前的类型表示的内容,若没有指定 q 值,则默认为1,若被赋值为0,则用于提醒服务器哪些是浏览器不接受的内容类型。
Examples of language tags
Language family | Language tag | Language variant |
---|---|---|
Bangla | bn-BD | Bangla (Bangladesh) |
bn-IN | Bangla (India) | |
Chinese | zh-CN | Mainland China, simplified characters |
zh-TW | Taiwan, traditional characters | |
zh-HK | Hong Kong, traditional characters | |
Dutch | nl-BE | Belgian Dutch |
nl-NL | Standard Dutch (as spoken in The Netherlands) | |
English | en-GB | British English |
en-US | American English | |
en-CA | Canadian English | |
en-IN | Indian English | |
en-AU | Australian English | |
en-NZ | New Zealand English | |
French | fr-BE | Belgian French |
fr-CH | "Swiss" French | |
fr-FR | Standard French (especially in France) | |
fr-CA | Canadian French | |
German | de-AT | Austrian German |
de-DE | Standard German (as spoken in Germany) | |
de-CH | "Swiss" German | |
Italian | it-CH | "Swiss" Italian |
it-IT | Standard Italian (as spoken in Italy) | |
Portuguese | pt-PT | European Portuguese (as written and spoken in Portugal) |
pt-BR | Brazilian Portuguese | |
Spanish | es-ES | Castilian Spanish (as spoken in Central-Northern Spain) |
es-MX | Mexican Spanish | |
es-AR | Argentine Spanish | |
es-CO | Colombian Spanish | |
es-CL | Chilean Spanish | |
es-US | American Spanish | |
Tamil | ta-IN | Indian Tamil |
ta-LK | Sri Lankan Tamil |
Comments | NOTHING