[Day5] HTTP Header Injection - HTTP Header 注入

前言

在上一篇的HTTP请求走私之後,已经知道HTTP Header也可以被拿来利用,这篇会更直接的透过Header本身实现攻击。

正文

简略介绍

当Web应用程序使用且信任来自User所发送的Request Header时,就可能导致HTTP Header Injection,并trigger其他Attack vector,用一个简单的例子说明这种状况:

网站有个X-forwarded-for Header,并且没有检查安全性,而且直接显示在网页上,这时候构造一个Request:

GET /myip HTTP/1.1
Host: example.com
User-Agent: Chrome...
x-forwarded-for: 1.1.1.1<script>alert("XSS")</script>

网站收到请求并Response时,就会出现一个弹出式视窗并写着"XSS"的字样,这只是一个基本的利用方法。下面讲述HTTP Header Injection所能够造成的其他危害。


Attack Vector

SQL Injection via HTTP Header Injection

若网站的资料库使用不安全的方法,引入了Request Header作为资料,例如使用刚刚讲过的X-forwarded-for纪录使用者IP;使用Refer蒐集使用者从哪里连结到目前的网页;使用cookie验证使用者等等。若是我们在Header中写入了SQL语法,就可以达成SQL Injection的效果,但因为本系列(和本章)不会特别讨论SQL Injection因此就不多谈(之後会有代替SQL Injection的ORM Injection)

Host Header Injection

Host Heaeder指定User要访问的domain,例如我们浏览google.com时,就会发出这种Request:

GET / HTTP/1.1
Host: google.com
...

而某些网站以不安全的方式处理Host Header的值,在没有正确验证的情况下,就会引发HTTP Host Header Injection,这可以拿来做像是Web Cache Poison,SSRF等的攻击。

攻击者可以透过更改requset中的Host Header的value(Host需与IP分离,否则更改Host header会导致request发送到不同的IP address),去检查网站的Host Header使用上是否有问题,例如某些网站可能在省略port(因为使用预设)的情况下parse Host Header,因此可透过在port的位置写入恶意内容。

GET / HTTP/1.1
Host: example.com:<payload>
...

写入重复的Host Header、在Host Header之前放[space],[tab]等等的,导致Web Server在判别优先级时误判

GET / HTTP/1.1
Host: example.com
Host: <payload>
GET / HTTP/1.1
Host: example.com
[tab] Host: <payload>

或是使用在上一篇的Case Study中的方法,写入绝对路径的URL:

GET http://example.com/ HTTP/1.1
Host: <payload>

注:<payload>可能是attacker的service或是一些用於攻击的exploit。依情况而定

以上这些还有很多不同的变种,虽然HTTP Header Injection并不常见,但仍是需要注意的安全问题,它可以用来trigger或结合其他攻击,像是Password reset poison,Web Cache Poison、bypass一些防御/认证、SSRF等等。


下篇预告: 中场休息,OSCP小分享


<<:  Day 5 - 部署 Home Lab 网路 - 下

>>:  Day 19:「通通拿去做鸡精啦!」- Vue SFC

自动化测试,让你上班拥有一杯咖啡的时间 | Day 5 - 执行自动化测试脚本

此系列文章会同步发文到个人部落格,有兴趣的读者可以前往观看喔。 写完 cypress 脚本後,可以...

IIFE立即执行函式

IIFE(Immediately Invoked Function Expression),是一种...

Python - Python Selenium 套件使用参考笔记

Python - Python Selenium 套件使用参考笔记 参考资料 Selenium-Py...

Day 27 Ruby == vs ===

阿修说文解字 先来看一下结论,因为 eql? 及 equal? 的用法与 == 类似,这边也顺便介绍...

【Side Project】 (老板)订单清单UX功能实作2-ChcekBox

上一篇中我们已经可以将左边的未完成清单移动到右边的已完成清单, 也可以将已完成清单返回到未完成清单。...