使用HTTP Headers防御WEB攻击
搭建试验环境
数据以及实验环境下载地址在文末!
你可以在XAMPP、WAMP、LAMP、MAMP下设置PHP-MYSQL应用,当然这个选择完全取决于你的喜好。
在本实验中,我使用的是搭载MAMP的苹果Mac机器,我把所以文件都放在了根目录下的“sample”文件夹内。
应用程序功能介绍
设置完这个实验样品之后,打开主页
http://localhost/sample/index.php
从上图中我们看以看到,这个页面就是一个简单的登录页面,它会进行基本的服务端验证。
用户输入字段不能为空,完成这个功能只需使用PHP的empty()函数。因此用户如果不输入点东西点击登录,会返回下面这个页面
如果输入的用户名密码不匹配的话,会返回以下页面,当然完成这一步骤是需要执行数据库查询操作的。
输入的用户密码正确,主页显示用户已登录。
如下所示,这是使用MySQLi准备语句完成的。
$stmt = $mysqli->prepare("select * from admin where username=? and password=?");
$stmt->bind_param("ss",$username,$password);
$stmt->execute();
username: admin
password: 1q2w3e4r5t
注意:在这个示例中,给定的密码以SHA1算法方式存储在数据库中,这个密码使用在线工具可以轻松解出来。
登录进去之后会看到一个表单,这个表单含有一个简单的Xss漏洞。
现在我们进行抓包,当我们登陆时注意观察默认的Header信息。
在成功登录之后我们看到一个搜索框,这里接受用户输入并返回相关信息给用户。
下面是构建登录后页面的代码
<?php
session_start();session_regenerate_id();if(!isset($_SESSION['admin_loggedin'])){header('Location: index.php');}if(isset($_GET['search'])){if(!empty($_GET['search'])){$text=$_GET['search'];}else{$text="No text Entered";}}?><!DOCTYPE html><html><head><metacharset="UTF-8"><title>Admin Home</title><linkrel="stylesheet"href="styles.css"></head><body><divid="home"><center></br><legend><textid=text><textid="text2">Welcome to Dashboard...</text></br></br>You are logged in as:<?php echo $_SESSION['admin_loggedin'];?><ahref="logout.php">[logout]</a></text></legend></br><formaction=""method="GET"><divid="search"><textid="text">Search Values</text><inputtype="text"name="search"id="textbox"></br></br><inputtype="submit"value="Search"name="Search"id="but"/><divid="error"><textid="text2">You Entered:</text><?php echo $text;?></div></div></form></center></div></body></html>
使用X-Frame-Options响应头防御点击劫持
首先我们要讨论的就是使用X-Frame-Options缓解点击劫持
通常,攻击者在漏洞页面嵌入iframe标签执行点击劫持攻击。
在我们这个实验中,会在用户管理页面中加载一个iframe标签,如下所述。
成功登录之后会进入http://localhost/sample/home.php页面
<!DOCTYPE html><html><head><title>iframe</title><metacharset="UTF-8"><metaname="viewport"content="width=device-width, initial-scale=1.0"></head><body><iframesrc="http://localhost/sample/home.php"></iframe></body></html>
在同一台服务器上,我将此页面保存为iframe.html。在浏览器中加载home页面的同时也会加载这个iframe
虽然有多钟方案来防御此问题,但是本文是讨论X-Frame-Options响应头这种方案。
X-Frame-Options有以下3个值可以使用。
DENY:表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。
SAMEORIGIN:表示该页面可以在相同域名页面的 frame 中展示。
ALLOW-FROM:表示该页面可以在指定来源的 frame 中展示。
X-Frame-Options: DENY
让我们先从X-Frame-Options: DENY开始
打开home.php文件,添加下面这一行
header(“X-Frame-Options: DENY”);
修改后的代码如下
<?php
session_start();session_regenerate_id();header("X-Frame-Options: DENY");if(!isset($_SESSION['admin_loggedin'])){header('Location: index.php');}if(isset($_GET['search'])){if(!empty($_GET['search'])){$text=$_GET['search'];}else{$text="No text Entered";}}?><!DOCTYPE html><html><head><metacharset="UTF-8"><title>Admin Home</title><linkrel="stylesheet"href="styles.css"></head><body><divid="home"><center></br><legend><textid=text><textid="text2">Welcome to Dashboard...</text></br></br>You are logged in as:<?php echo $_SESSION['admin_loggedin'];?><ahref="logout.php">[logout]</a></text></legend></br><formaction=""method="GET"><divid="search"><textid="text">Search Values</text><inputtype="text"name="search"id="textbox"></br></br><inputtype="submit"value="Search"name="Search"id="but"/><divid="error"><textid="text2">You Entered:</text><?php echo $text;?></div></div></form></center></div></body></html>
从网页中退出后重新登录观察HTTP头信息
得到如下头信息
如果你注意到,在响应信息中出现了一个X-Frame-Options
现在我们重新加载iframe,是得不到任何显示的
使用Chrome的开发者模式,我们来看看背后隐藏的秘密。
在Firefox中使用开发者模式
在Firefox中加载iframe.html页面,下面是控制台提示的错误信息
X-Frame-Options: SAMEORIGIN
有可能存在需要使用框架的情景。在此类情况下,就可以使用SAMEORIGIN值
打开home.php文件并添加如下代码
header(“X-Frame-Options: sameorigin”);\
修改后代码如下
<?php
session_start();session_regenerate_id();header("X-Frame-Options: sameorigin");if(!isset($_SESSION['admin_loggedin'])){header('Location: index.php');}if(isset($_GET['search'])){if(!empty($_GET['search'])){$text=$_GET['search'];}else{$text="No text Entered";}}?><!DOCTYPE html><html><head><metacharset="UTF-8"><title>Admin Home</title><linkrel="stylesheet"href="styles.css"></head><body><divid="home"><center></br><legend><textid=text><textid="text2">Welcome to Dashboard...</text></br></br>You are logged in as:<?php echo $_SESSION['admin_loggedin'];?><ahref="logout.php">[logout]</a></text></legend></br><formaction=""method="GET"><divid="search"><textid="text">Search Values</text><inputtype="text"name="search"id="textbox"></br></br><inputtype="submit"value="Search"name="Search"id="but"/><divid="error"><textid="text2">You Entered:</text><?php echo $text;?></div></div></form></center></div></body></html>
从网页退出后重新登录,注意观察HTTP头信息
接下来,看看他们不同的工作原理
第一步加载相同的iframe.html,从下图中可以看出加载没有问题
我使用虚拟机打开Kali Linux并把文件放入其中,然后加载这个URL(http://localhost/sample/home.php)
当我们打开iframe.html文件时,由于跨域**而不能正常加载
在浏览器的错误信息中可以看到
错误信息表明了,不允许进行跨域。
X-Frame-Options: ALLOW-FROM http://www.site.com
X-Frame-Options: ALLOW_FROM选项,表示该页面可以在指定来源的 frame 中展示,该选项只适用于IE,Firefox浏览器。
首先打开home.php文件添加如下代码
header(“X-Frame-Options: ALLOW-FROM http://localhost”);
修改后代码如下:
<?php
session_start();session_regenerate_id();header("X-Frame-Options: ALLOW-FROM http://localhost");if(!isset($_SESSION['admin_loggedin'])){header('Location: index.php');}if(isset($_GET['search'])){if(!empty($_GET['search'])){$text=$_GET['search'];}else{$text="No text Entered";}}?><!DOCTYPE html><html><head><metacharset="UTF-8"><title>Admin Home</title><linkrel="stylesheet"href="styles.css"></head><body><divid="home"><center></br><legend><textid=text><textid="text2">Welcome to Dashboard...</text></br></br>You are logged in as:<?php echo $_SESSION['admin_loggedin'];?><ahref="logout.php">[logout]</a></text></legend></br><formaction=""method="GET"><divid="search"><textid="text">Search Values</text><inputtype="text"name="search"id="textbox"></br></br><inputtype="submit"value="Search"name="Search"id="but"/><divid="error"><textid="text2">You Entered:</text><?php echo $text;?></div></div></form></center></div></body></html>
退出网页,重新登录,观察HTTP头
如果我们现在尝试从同一个服务器加载iframe,网页不会出现任何错误
这是因为服务器允许加载http://localhost 这个地址
现在我们修改HTTP头,再加载
在home.php文件中添加
header(“X-Frame-Options: ALLOW-FROM http://www.androidpentesting.com”);
修改后代码如下
<?php
session_start();session_regenerate_id();header("X-Frame-Options: ALLOW-FROM http://www.androidpentesting.com");if(!isset($_SESSION['admin_loggedin'])){header('Location: index.php');}if(isset($_GET['search'])){if(!empty($_GET['search'])){$text=$_GET['search'];}else{$text="No text Entered";}}?><!DOCTYPE html><html><head><metacharset="UTF-8"><title>Admin Home</title><linkrel="stylesheet"href="styles.css"></head><body><divid="home"><center></br><legend><textid=text><textid="text2">Welcome to Dashboard...</text></br></br>You are logged in as:<?php echo $_SESSION['admin_loggedin'];?><ahref="logout.php">[logout]</a></text></legend></br><formaction=""method="GET"><divid="search"><textid="text">Search Values</text><inputtype="text"name="search"id="textbox"></br></br><inputtype="submit"value="Search"name="Search"id="but"/><divid="error"><textid="text2">You Entered:</text><?php echo $text;?></div></div></form></center></div></body></html>
以下为抓包获取的HTTP头信息
刷新之前的页面,不会加载iframe了
以下为返回的错误信息
很明显http://localhost 是没有获取许可的
使用HTTP Headers防御WEB攻击相关推荐
- 常见的Web攻击方式及对应防御
Web攻击 XSS(跨站脚本攻击) CSRF(跨站请求伪造) Http Heads攻击 SQL 注入 DOS攻击(拒绝服务攻击) DDOS攻击 (分布式拒绝服务攻击) XSS(跨站脚本攻击) 简介: ...
- WEB攻击手段及防御第1篇-XSS
概念 XSS全称为Cross Site Script,即跨站点脚本攻击,XSS攻击是最为普遍且中招率最多的web攻击方式,一般攻击者通过在网页恶意植入攻击脚本来篡改网页,在用户浏览网页时就能执行恶意的 ...
- WEB攻击手段及防御-扩展篇
转载自 WEB攻击手段及防御-扩展篇 之前的文章介绍了常见的XSS攻击.SQL注入.CSRF攻击等攻击方式和防御手段,没有看的去翻看之前的文章,这些都是针对代码或系统本身发生的攻击,另外还有一些攻击方 ...
- 常见web攻击及其防御手段
目录 一.XSS XSS攻击分类 XSS攻击的危害 防范手段 二.CSRF CSRF攻击的危害 防御 三.点击劫持-clickjacking 防御 四.SQL注入 防御 OS命令注入 请求劫持 一.X ...
- 常见的web攻击有哪些?如何防御?
web攻击是什么 Web攻击(WebAttack)是针对用户上网行为或网站服务器等设备进行攻击的行为,如植入恶意代码.修改网站权限.获取网站用户隐私信息等 Web应用程序的安全性是任何基于Web业务的 ...
- WEB攻击之CSRF攻击与防护
分享一下我的偶像大神的人工智能教程!http://blog.csdn.net/jiangjunshow 也欢迎转载我的文章,转载请注明出处 https://blog.csdn.net/aabbyyz ...
- ICSL WEB攻击模式及防范方法
1.XSS攻击 跨站脚本攻击(Cross Site Scripting)是最普遍的Web应用安全漏洞.这类漏洞能够使得攻击者嵌入恶意脚本代码到正常用户会访问到的页面中,当正常用户访问该页面时,则可 ...
- 【技术干货】浏览器工作原理和常见WEB攻击 (下)
本文作者:上海驻云开发总监 陈昂 上篇给大家带来的是关于浏览器基本工作原理的总结和介绍,这篇文章重点给大家说明有哪些常见WEB攻击. 常见WEB攻击 互联网是个面向全世界的开放平台,越是开放的东西漏洞 ...
- 几种常见的Web攻击
几种常见的Web攻击 文章目录 几种常见的Web攻击 一.DoS攻击 1.SYN洪水攻击 2.IP欺骗 3.Land攻击 4.针对DoS攻击的防御 二.CSRF攻击 1. CSRF攻击的发生有三个必要 ...
最新文章
- android sliding tab,android – 刷新SlidingTabLayout
- bcc校验码计算_CRC校验你会吗?计算、校验、C语言实现,三步教你轻松搞定
- c语言3级菜单_大一新生作品:利用 C 语言实现quot;通讯录管理系统quot;,直言太简单...
- java解析xml转为Map
- nRF51822 SDK初体验
- 两本电子书 |Flink 最佳学习实践 | 从 0 到 1 学会 Apache Flink
- sql两个in并列_SQL窗口函数
- 【已解决】ModuleNotFoundError: No module named ‘web’的解决办法:
- 使用指针时的“陷阱”
- Java NIO1:I/O模型概述
- spart快速大数据分析学习提纲(一)
- 在 ASP.NET MVC 中充分利用 WebGrid (microsoft 官方示例)
- 这就是艺术「GitHub 热点速览 v.22.25」
- 《领导力与沟通艺术》
- java生成tga图片_游戏制作行业为什么使用TGA格式的贴图而不使用PNG格式?
- GitHub 克隆加速
- 想在微信上使用chatGPT?小程序?公众号?企业微信,最终还是选择了企业微信版本的chatgpt
- 敏捷开发:编写开发文档的利与弊
- Android支付接入(一):支付宝
- 2020腾讯数分笔试