作者 | 漏洞404
编辑 | L
[漏洞404] 学习文章
网络安全需要你我共同努力
如需转载,请联系平台
为什么php会有安全性问题
软件安全问题由来已久,任何语言编写的软件都或多或少的会出现安全问题,常见的安全问题如下:
1、SQL注入
2、XSS攻击
3、CSRF攻击
4、Cookie、Session问题
5、文件系统的安全问题
6、服务器安全问题
安全问题本质
一切安全方案的涉及基础,都建立在信任的基础上,如果没了信任,也就没有安全性可言
安全问题三要素
机密性:要求数据内容不能被泄露,通常的做法是加密
完整性:要求数据不能随意篡改,通常的做法是给数据做数字签名
可用性:要求资产可以正常使用,(DDOS攻击就是破坏资源的可用性)
认证安全问题
Cookie、Session
Cookie:存储在客户端的一段小文本,用户服务器识别用户的一种技术
Session:基于Cookie,只是数据不存储在客户端,改为存储在服务端,用户端至存储一个id,也称为session_id,服务端可以用过这个session_id找到该用户信息
URL中Session_id的安全性隐患
1、通常浏览器在发送session_id的时候,会将其放到http请求的header头中发送,这种方式较安全,会受到浏览器的同源策略保护,也是浏览器发送session_id的默认方式
2、另一种方式是把session_id放到url中发送,这种方法安全性较低,如果在session_id的生命周期内,黑客通过非常手段获取到该url的session_id,那么黑客就可以冒充该用户访问用户系统
为什么会有Session_id 或者认证方式放到URL中
首先就是当客户的某一些浏览器为了安全性禁用了浏览器的时候,那么设置的Cookie或者Session_id 就无法存在到客户的浏览器中作为认证凭证,那么为了系统的可用性那么开发者就会设置把Session_id放到浏览器中作为用户认证的凭证,也是为了安全问题的三要素:可用性
php 配置文件设置Session_id存放到URL中
方法一
在 php.ini配置文件中找到
session.use_trans_sid = 0
将0改为1即可
方法二
可以通过代码实现session_id存放到url中
//session 技术
ini_set('session.use_cookies',0);
ini_set('session.use_only_cookies',0);
ini_set('session.name','sid');
// 上面三行代码是实现url 在浏览器中使用的
session_start();
// 开启session
$_SESSION['user']=array('id'=>1,'name'=>'Linux','age'=>18);
//session 用户信息
echo '<a href="session_url.php?usesid=yes">使用url传sessionid</a>';
小结
通过上面的案例学习,其实在做渗透测试的时候可以先关闭浏览器对Cookie、Session的存储,如果web应用系统使用了 url 传参的方式进行了身份鉴权或者使用URL对Session_id Cookie等敏感信息进行传参那么就代表了该系统安全性还是不足够
session fixation 攻击
攻击利用的是服务器产生的session_id没有及时改变
攻击场景:某个网站存在session fixation漏洞
1、黑客访问某个url,产生一个session_id,如:http://www.xx.com 服务器返回:Set-Cookie:5wqerkjwerq98wer
2、黑客向A用户发送一个email:降价啦,所有商品一折起,iphone xs 只要1000元,详情访问:http://www.xx.com/sid=5wqerkjwerq98wer
3、用户A访问这个链接,并输入了用户名密码接下来黑客就可以光明正大的冒充用户A消费,最后都是用户A买单
解决方案:
在登录之后重写Sessionid
session 保持攻击
如果攻击者获取了用户的sessionid,并成功进入系统,然后不停的刷新界面,就可能使session 一直有效
php文件包含漏洞
产生安全问题的php文件包含函数
include()
include_once()
require()
require_once()
fopen()
readfile()
其中include、include_once()、require()、require_once()包含的文件将作为php代码执行
<?php
include($_GET[123]);
?>
本地文件包含
利用 include、require等函数的文件包含功能,不仅能执行web站点中的问题,还可以执行系统文件,如Linux中的pasword 文件
例如:windows 系统中的,D盘又一个a.txt,网站在
d://www/n=mysite目录中,我们在浏览器输入:http://www.xxx.com/test.php?file=../../../a.txt 就可以将d://a.txt中的内容下显示出来
远程文件包含
在 php.ini 文件中有一个配置:allow_url_include,如果为on,则include等包含文件时,可以包含远程服务器上的文件,默认为off,建议不要将其设置为on
文件包含学习小结
本地文件包含
一般我认为,能够打开并包含本地文件的漏洞,被称为本地文件包含漏洞,但是关于本地文件包含,也要看被包含的变量是否为可控,如果本地文件包含,已经被写死了,如:只能包含某一个路径下的某一个文件,且改文件不可控那么久不能属于漏洞
远程文件包含
远程文件包含不安全为什么还会存在呢?首先在开发来说一般会遇到集群或者远程安全服务器里面的可控文件,有时候是需要调用到该文件那么就可以使用到远程文件包含,所以一般在审计代码的时候如果发现开启了远程文件包含,那么首先需要看看远程包含的服务器的安全性、还有是否为安全集群设备,是否为该公司或者单位完全控制的的服务器设备,或者文件,不然都可以判定为不安全的文件包含,因为如果包含了别人的文件,或者其他人的文件,甚至是gethub上的php 文件,那么就一定会存在危害,因为不知道什么时候会文件消失,或者被对方知道后故意修改文件,改为恶意的一句话木马文件,甚至是恶意文件,反社会文件... 对企业造成不可估量的损失破坏
php常用函数漏洞
extract变量覆盖漏洞
extact 函数:将变量从数组导入当前符号表,在一些MVC框架中会有它的踪影
extract 函数的定义:int extract(arrat,extract_rules,prefix)
extract() 函数将检查每个键名是否为合法的变量名,同时也检查符号表中已存在的变量名是否冲突,对不合法和冲突的键名的处理将根据此参数决定
extract_rules:
EXTR_OVERWRITE - 默认。如果有冲突,则覆盖已有的变量。
EXTR_SKIP - 如果有冲突,不覆盖已有的变量。
EXTR_PREFIX_SAME - 如果有冲突,在变量名前加上前缀 prefix。
EXTR_PREFIX_ALL - 给所有变量名加上前缀 prefix。
EXTR_PREFIX_INVALID - 仅在不合法或数字变量名前加上前缀 prefix。
EXTR_IF_EXISTS - 仅在当前符号表中已有同名变量时,覆盖它们的值。其它的都不处理。
EXTR_PREFIX_IF_EXISTS - 仅在当前符号表中已有同名变量时,建立附加了前缀的变量名,其它的都不处理。
EXTR_REFS - 将变量作为引用提取。导入的变量仍然引用了数组参数的值。
<?php
$name='www.php.cn';
$params=$_GET;
//通过get传参直接修改了 www.php.cn 的内容
extract($params);
eval($name);
//为了显示变量覆盖严重的后果 这里我直接让他代码执行
echo $name;
?>
http://127.0.0.1/index/index.php?name=phpinfo();
Parse_srt 变量覆盖
Parse_str函数将把查询的字符串解析到变量中,其定义如下:
parese_str(string,array)
参数:string要解析的字符串,array(可选的),把解析后的变量存储到数组中,如果第二个参数array不写,则解析的变量会被导入到当前符号列表中,从而导致变量覆盖
<?php
$querey_params=$_SERVER['QUERY_STRING'];
$name='www.php.cn';
parse_str($querey_params);
eval($name);
原文始发于微信公众号(漏洞404):PHP安全问题
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论