-
-
使用HTTP Headers防御WEB攻击(Part1)
-
发表于: 2015-4-23 19:52 1055
-
新闻链接:330K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3k6J5k6h3g2T1N6h3k6Q4x3X3g2U0L8$3#2Q4x3V1k6S2M7Y4c8A6j5$3I4W2M7#2)9J5c8Y4N6W2j5W2)9J5c8U0j5#2x3K6R3#2i4K6u0W2K9s2c8E0L8l9`.`.
新闻时间:2015-04-23
新闻正文:我们经常能够看到像Xss,点击劫持,会话劫持等各种攻击手法。在这个系列文章中,我们会介绍各种可用来防御常见Web攻击的HTTP头以及通过一个PHP实例来演示其实现方法。本系列文章旨在给开发者一个提示,如何使用HTTP头对一些攻击进行防御。
搭建试验环境
数据以及实验环境下载地址在文末!
你可以在XAMPP、WAMP、LAMP、MAMP下设置PHP-MYSQL应用,当然这个选择完全取决于你的喜好。
在本实验中,我使用的是搭载MAMP的苹果Mac机器,我把所以文件都放在了根目录下的“sample”文件夹内。
应用程序功能介绍
设置完这个实验样品之后,打开主页
500K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3I4G2j5$3q4D9K9r3!0K6N6q4)9J5c8Y4y4S2L8i4m8D9k6g2)9J5c8X3W2F1k6r3g2^5i4K6u0W2M7r3S2H3
从上图中我们看以看到,这个页面就是一个简单的登录页面,它会进行基本的服务端验证。
用户输入字段不能为空,完成这个功能只需使用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>
<meta charset="UTF-8">
<title>Admin Home</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div id="home"><center>
</br><legend><text id=text><text id="text2">Welcome to Dashboard...</text></br></br> You are logged in as: <?php echo $_SESSION['admin_loggedin']; ?> <a href="logout.php">[logout]</a></text></legend></br>
<form action="" method="GET">
<div id="search">
<text id="text">Search Values</text><input type="text" name="search" id="textbox"></br></br>
<input type="submit" value="Search" name="Search" id="but"/>
<div id="error"><text id="text2">You Entered:</text><?php echo $text; ?></div>
</div>
</form></center>
</div>
</body>
</html>
使用X-Frame-Options响应头防御点击劫持
首先我们要讨论的就是使用X-Frame-Options缓解点击劫持
通常,攻击者在漏洞页面嵌入iframe标签执行点击劫持攻击。
在我们这个实验中,会在用户管理页面中加载一个iframe标签,如下所述。
成功登录之后会进入9a6K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3I4G2j5$3q4D9K9r3!0K6N6q4)9J5c8Y4y4S2L8i4m8D9k6g2)9J5c8X3S2G2L8h3g2Q4x3X3g2H3K9s2m8Q4c8e0W2Q4b7e0q4Q4b7U0g2Q4c8e0W2Q4z5f1c8Q4b7e0t1`.
<!DOCTYPE html>
<html>
<head>
<title>iframe</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<iframe src="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>
<meta charset="UTF-8">
<title>Admin Home</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div id="home"><center>
</br><legend><text id=text><text id="text2">Welcome to Dashboard...</text></br></br> You are logged in as: <?php echo $_SESSION['admin_loggedin']; ?> <a href="logout.php">[logout]</a></text></legend></br>
<form action="" method="GET">
<div id="search">
<text id="text">Search Values</text><input type="text" name="search" id="textbox"></br></br>
<input type="submit" value="Search" name="Search" id="but"/>
<div id="error"><text id="text2">You Entered:</text><?php echo $text; ?></div>
</div>
</form>
新闻时间:2015-04-23
新闻正文:我们经常能够看到像Xss,点击劫持,会话劫持等各种攻击手法。在这个系列文章中,我们会介绍各种可用来防御常见Web攻击的HTTP头以及通过一个PHP实例来演示其实现方法。本系列文章旨在给开发者一个提示,如何使用HTTP头对一些攻击进行防御。
搭建试验环境
数据以及实验环境下载地址在文末!
你可以在XAMPP、WAMP、LAMP、MAMP下设置PHP-MYSQL应用,当然这个选择完全取决于你的喜好。
在本实验中,我使用的是搭载MAMP的苹果Mac机器,我把所以文件都放在了根目录下的“sample”文件夹内。
应用程序功能介绍
设置完这个实验样品之后,打开主页
500K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3I4G2j5$3q4D9K9r3!0K6N6q4)9J5c8Y4y4S2L8i4m8D9k6g2)9J5c8X3W2F1k6r3g2^5i4K6u0W2M7r3S2H3
从上图中我们看以看到,这个页面就是一个简单的登录页面,它会进行基本的服务端验证。
用户输入字段不能为空,完成这个功能只需使用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>
<meta charset="UTF-8">
<title>Admin Home</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div id="home"><center>
</br><legend><text id=text><text id="text2">Welcome to Dashboard...</text></br></br> You are logged in as: <?php echo $_SESSION['admin_loggedin']; ?> <a href="logout.php">[logout]</a></text></legend></br>
<form action="" method="GET">
<div id="search">
<text id="text">Search Values</text><input type="text" name="search" id="textbox"></br></br>
<input type="submit" value="Search" name="Search" id="but"/>
<div id="error"><text id="text2">You Entered:</text><?php echo $text; ?></div>
</div>
</form></center>
</div>
</body>
</html>
使用X-Frame-Options响应头防御点击劫持
首先我们要讨论的就是使用X-Frame-Options缓解点击劫持
通常,攻击者在漏洞页面嵌入iframe标签执行点击劫持攻击。
在我们这个实验中,会在用户管理页面中加载一个iframe标签,如下所述。
成功登录之后会进入9a6K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3I4G2j5$3q4D9K9r3!0K6N6q4)9J5c8Y4y4S2L8i4m8D9k6g2)9J5c8X3S2G2L8h3g2Q4x3X3g2H3K9s2m8Q4c8e0W2Q4b7e0q4Q4b7U0g2Q4c8e0W2Q4z5f1c8Q4b7e0t1`.
<!DOCTYPE html>
<html>
<head>
<title>iframe</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<iframe src="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>
<meta charset="UTF-8">
<title>Admin Home</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div id="home"><center>
</br><legend><text id=text><text id="text2">Welcome to Dashboard...</text></br></br> You are logged in as: <?php echo $_SESSION['admin_loggedin']; ?> <a href="logout.php">[logout]</a></text></legend></br>
<form action="" method="GET">
<div id="search">
<text id="text">Search Values</text><input type="text" name="search" id="textbox"></br></br>
<input type="submit" value="Search" name="Search" id="but"/>
<div id="error"><text id="text2">You Entered:</text><?php echo $text; ?></div>
</div>
</form>
赞赏
赞赏
雪币:
留言: