PHP代码安全基础1

PHP代码安全基础

​ 此主要是针对PHP代码中常见遇到或是涉及到的安全问题,总而言之就是安全很大程度是和功能相

挂钩的。因此往往功能越复杂,安全问题越容易产生。

一. 文件上传与下载
1. 1文件上传
<!--
    2022年1月10日00:16:06
    总结:上传方式三种大类:
    1.自写上传
    2.编辑器上传
    3.框架上传

    核心:观察过滤绕过与否
-->
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>




<script type="text/javascript" charset="utf-8" src="/ueditor/ueditor.config.js"></script>
<script type="text/javascript" charset="utf-8" src="/ueditor/ueditor.all.js"></script>
<h1>编辑器上传</h1>
<div>
    <script id="editor" type="text/palin" name="bianji"></script>
</div>

<script type="text/javascript">
    var ue=UE.getEditor('editor');
</script>
<h1>自写文件上传</h1>
<form action="" method="post" enctype="multipart/form-data"> <!--action等号后的内容不写的化表示上传到本地-->
    <p><input type="file" name="upload"></p>
    <p><input type="submit" value="上传"></p>
</form>
</body>
</html>
<?php
$name = $_FILES['upload']['name'];
//获取上传文件的类型
$type = $_FILES['upload']['type'];
//获取上传文件的大小
$size = $_FILES['upload']['size'];
//获取上传文件报错的区域
$error = $_FILES['upload']['error'];
//获取文件上传时临时文件名
$tmpname = $_FILES['upload']['tmp_name'];

echo $name."<br>";
echo $type."<br>";
echo $size."<br>";
echo $error."<br>";
echo $tmpname."<br>";

//此处使用的是白名单上传
if ($type == 'text/plain'){
    if (move_uploaded_file($tmpname,'upload/'.$name)){
        echo "文件上传成功!";
        echo "文件存储在:/upload/".$name;
    }else{
        echo "文件上传失败!";
    }
}else{
    echo "
       <script>alert(' 白名单绕不过滴,弟弟')</script>
    ";

    echo "上传失败";
}

?>

文件上传的核心便是过滤不严,进而导致木马的上传,进而拿到后台权限。

1.2文件下载

主要就是涉及到一个任意文件的下载

下载原理: 1.获取扫描列表 2.拼接url 3.重定向操作

下载的两种方式:

  • https://blog.csdn.net/xxx.zip (直连下载)
    • https://blog.csdn.net/?filename=xxx.zip (传参下载)
<!--
https://blog.csdn.net/xxx.zip  (直连下载)
https://blog.csdn.net/?filename=xxx.zip (传参下载)
-->
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件下载</title>
</head>
<body>

<script type="text/javascript" charset="utf-8" src="../blog/ueditor/ueditor.config.js"></script>
<script type="text/javascript" charset="utf-8" src="../blog/ueditor/ueditor.all.js"></script>
<h1>文件列表</h1>
<?php getfilename(); ?>

<h1>直连下载</h1>
<form action="" method="post">
    <input type="text" name="filename">
    <input type="submit" value="下载">
</form>
<?php
$name=$_POST['filename'];
filenameurl($name);
?>
<h1>传参下载</h1>
<form action="" method="post">
    <input type="text" name="downname">
    <input type="submit" value="下载">
</form>
<?php /*@$name=$_POST['downname'];filenameget($name);*/?>

</body>
</html>

<?php
    //1.直接文件下载形式:1.获取扫描列表  2.拼接url  3.重定向操作

    //目录下文件读取函数,预先装载要下载的文件
    function getfilename(){
        $dir = getcwd();//获取当前路径(计算机下的绝对路径)
        echo "'<br>'.$dir";
        $file = scandir($dir.'/soft');

        //便于效果观察,因此进行遍历
        foreach ($file as $value){
            if($value != '.' && $value != '..') {
                $arr[] = $value;
                echo $value.'<br>';
            }
        }
    }

    function filenameurl($filename){
        $url2 = 'http://'.$_SERVER['HTTP_HOST'].'/soft/'.$filename;
        echo $url2;
        if ($filename != null)
        header("location:$url2");//拼接好url,再用重定向的方式进行下载
    }
?>

<?php
//文件传参下载核心:会执行将目标文件进行执行,然后以字节流方式进行下载返回,
//进而可造成一任意文件下载,或是PHP文件下载等系列安全问题。
//自动以文件传参下载,
function filenameget($name){
$filename = $name;
$download_path = "soft/";
if(eregi("\.\.", $filename)) die("抱歉,你不能下载该文件!");
$file = str_replace("..", "", $filename);
if(eregi("\.ht.+", $filename)) die("抱歉,你不能下载该文件!");

// 创建文件下载路径
$file = "$download_path$file";

// 判断文件是否存在
if(!file_exists($file)) die("抱歉,文件不存在!");

//  文件类型,作为头部发送给浏览器
$type = filetype($file);

// 获取时间和日期
$today = date("F j, Y, g:i a");
$time = time();

// 发送文件头部
/*
header("Content-type: $type");
header("Content-Disposition: attachment;filename=$filename");
header("Content-Transfer-Encoding: binary");
header('Pragma: no-cache');
header('Expires: 0');
*/
// 发送文件内容
set_time_limit(0);
readfile($file);
}

?>

1.2文件修改
核心:文件读写

造成影响:1.任意文件读取 2.恶意代码写入 3.SQL注入

<!DOCTYPE html>

<html>

<head>

    <meta charset="UTF-8">

    <title>海哥博客</title>

    <style type="text/css">

        .nav li{

            background-color: red;

            padding: 8px 15px;

            float: left;

            list-style: none;

            color:#fff;

        }

    </style>

</head>

<body>

<ul class="nav">

    <li><a href="index.html">首页</a></li>

    <li><a href="news.php">新闻</a></li>

    <li>公司产品</li>

    <li>关于我们</li>

    <li>公司介绍</li>

    <li><?php echo 123;?></li>

</ul>

</body>

<?php
   /* $con = mysqli_connect("127.0.0.1","root","root","dvwa");
    if ($con -> connect_error){
        echo "连接失败";
    }else{
        echo "连接成功";
    }*/
    include ("config.php"); //包含相当于直接把包含中的内容写在代码中
    //mysql_select_db('zzcms',$con);

    $i = $_GET['id'];
    $i2 = $_REQUEST[id2]; //若采用此种方式获取数据而waf又只防了get,则可用post进行一波基础绕过
    echo "<h2>$i2</h2>";
    echo "<br>";
    $Sql = "SELECT * FROM users where user_id = $i;";
    //此处可进行SQL代码拼接进而造成SQL注入等系列问题。

    $res =  mysqli_query($con,$Sql);//这里爆红不用管
    $cows = mysqli_num_rows($res);
    echo "<br>";
    echo "<br>";
    echo "<br>";
    echo "一共".$cows."行";
    /*for ($i=0;$i < $cows;++$i){
        echo $i['first_name'].$i['Last_name'];
    }*/
    while($row=mysqli_fetch_row($res)){
    echo '<br><br><hr>';
    echo $row[1];//目前只能通过下标获取,作为枚举数组返回。

}
?>
</html>


二.输入/出类

php中代码输入输出类问题重要是指用户与网站交互过程中的因用户输入或是网站输出用户结果而可能造成的一系列的安全问题,常见的产生输入输出的问题有以下两种:

  • XSS(跨站脚本)
  • CSRF(也叫跨站请求伪造)
2.1XSS

定义: 跨站脚本攻击XSS(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页面时,嵌入Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。XSS攻击针对的是用户层面的攻击! 说白了就是用户自己能插入JS代码到网页中

分类:

  • 反射型(DOM也是属于反射型的一种)
  • 存储型

触发与利用原理:

请添加图片描述

在这里插入图片描述

触发位置分析: 见输入即有可能触发. 常见的留言板,评论区,搜索区之类的

<h1>留言板</h1>
<meta charset="UTF-8">
<form id="form1" name="form1" method="post" action="">
    <p>
        <label for="textfield">ID:</label>
        <input type="text" name="id" id="textfield">
    </p>
    <p>
        <label for="textfield2">昵称:</label>
        <input type="text" name="name" id="textfield2">
    </p>
    <p>
        <label for="textfield3">QQ:</label>
        <input type="text" name="qq" id="textfield3">
    </p>
    <p>
        <label for="textarea">内容:</label>
        <textarea name="content" id="content"></textarea>
    </p>
    <p>
        <input type="submit" name="submit" id="submit" value="提交">
    </p>
</form>
<p>




<hr>
<p>留言内容:</p>
<hr>
<p>&nbsp; </p>


<?php
header("Content-type: text/html; charset=utf-8");
include('config.php');

$i=@$_POST['id'];
$n=@$_POST['name'];
$q=@$_POST['qq'];
$c=@$_POST['content'];
//存储型的XSS,
if(!empty($i)){
   $sql = "INSERT into `sy_message` VALUES ('$i', 1, '$n', '$q', '$c', NULL, NULL, '1447433541', '183.92.138.25', '四川', 0, 'yes');";
   mysqli_query($con,$sql);
   echo "<br>"."插入成功";
}

$sql1='select * from sy_message';
$result = mysqli_query($con,$sql1);
while($row=mysqli_fetch_row($result)){
    echo '<br>';
    echo 'ID:'.$row['0'].'<br>';
    echo '昵称:'.$row['2'].'<br>';
    echo 'QQ:'.$row['3'].'<br>';
    echo '内容:'.$row['4'].'<br>';
}

?>

该代码会触发存储型XSS,因为这个留言板的功能是先将留言内容存储至数据库,再进行输出,也就是是说会将插入的JS代码输出到前端界面,进而形成XSS。

触发反射型的XSS:

<?php
include('config.php');
$s=$_POST['search'];
//Like表示模糊查询搜索
$Sql="select * from sy_guestbook where gName like '%$s%'";
$res =  mysqli_query($con,$Sql);//这里爆红不用管
$cows = mysqli_num_rows($res);
echo "<br>";
//搜索时,会将搜索内容输出,则可能造成XSS
echo "你搜索的内容为"."$s"; //触发的关键语句,原理与上面存储型一样
echo "<br>";
echo "<br>";
echo "一共".$cows."行";
/*for ($i=0;$i < $cows;++$i){
    echo $i['first_name'].$i['Last_name'];
}*/
while($row=mysqli_fetch_row($res)){
    echo '<br><br><hr>';
    echo $row[1];//目前只能通过下标获取,作为枚举数组返回。
    echo '<br><hr>';
    echo $row[2];
    echo '<br><hr>';
    echo $row[3];

    /*echo $row['first_name'];
    echo $row['last_name'];*/
}
?>

2.2CSRF(XSRF)

CSRF是跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性。
你可以这样来理解:攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。

字面解读:

**请求伪造:**指的是伪造靶机用户访问的Session(一种网站验证会话),进而获取到用户的Cookie(网站登录凭证).进而达到用户伪造访问的目的。

通常来说攻击者伪造的js代码中会含有记录靶机用户cookie或是Session等一系列操作,进而达到获取靶机的Cookie,或是其他登录凭证,CSRF通常与XSS进行联动操作!

在这里插入图片描述

防御: IP访问验证(HTTP协议验证,TCP协议验证[端到端的验证]),其中IP验证若是X-Forwarded-for型获取ip的话,则可进行ip伪造,而TCP则不行。

Referer验证:来源验证。

<?php
function getIp() //层层拆分,避免过滤进而获取IP
{
    if ($_SERVER["HTTP_CLIENT_IP"] && strcasecmp($_SERVER["HTTP_CLIENT_IP"], "unknown")) {
        $ip = $_SERVER["HTTP_CLIENT_IP"];
    } else {
        if ($_SERVER["HTTP_X_FORWARDED_FOR"] && strcasecmp($_SERVER["HTTP_X_FORWARDED_FOR"], "unknown")) {
            $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
        } else {
            if ($_SERVER["REMOTE_ADDR"] && strcasecmp($_SERVER["REMOTE_ADDR"], "unknown")) {
                $ip = $_SERVER["REMOTE_ADDR"];
            } else {
                if (isset ($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'],
                        "unknown")
                ) {
                    $ip = $_SERVER['REMOTE_ADDR'];
                } else {
                    $ip = "unknown";
                }
            }
        }
    }
    return ($ip);
}

echo getIp()."<br>";


//referer  通常用于CSRF的一个防御,refer是指访问当前页面的上一个页面来源。
//2.除了refer以外还有就是 X-forwared-for:主要是用于检验ip地址来源的验证
//
$referer=$_SERVER['HTTP_REFERER'];
$ua=$_SERVER['HTTP_USER_AGENT']; //通过此可以查看访问的浏览器类型及其他
echo $ua."<br>";

echo $referer."<br>";
echo $ua."<br>";
?>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值