关于PHP编码安全—Hack之路

关于PHP编码安全

弱数据类安全
    由于PHP的弱数据特性,早就了PHP的易学和易用。PHP在使用双等于号的时候(==),不会严格检验传入的变量类型,同时在执行的过程中可以将变量自由的进行转换类型。由于弱数据类型的特点, 在使用双等号和一些函数时,会造成一定的安全隐患
在下面的代码中,当用户输入type = 0 时,会直接进入支付逻辑。这不是研发人员希望看到的结果

<?php
$type = $_GET(‘type’);
if($type==’pay’){ //这里用双等号进行判断
echo “这里是支付逻辑;”
}else{
echo”这里是其他逻辑”;
}

建议使用三个等号(===)来判断变量值与类型是否完全相等

使用PHP进行判断的时候,为了避免安全漏洞,在使用弱类型机制的时候需要特别的留意。下面是一些弱类型的判断示例

<?php
var_dump(false == 0);    //执行结果bool(true)
var_dump(false == ”);    //执行结果bool(true)
var_dump(false == ‘0’);  //执行结果bool(true)
var_dump(0 == ‘0’);       //执行结果bool(true)
var_dump(0 == ‘0xxx’);  //执行结果bool(true)
var_dump(0 == ‘xxx’);    //执行结果bool(true)

Hash比较缺陷

关于PHP开发人员常用的等于(==),不等于(!=)进行比较。如果hash值以0e开头,后面的都是数字,当与数字进行比较时,就会被解析成0×10的n次方被判断与0相等,使攻击者可以绕过某些系统逻辑。

var_dump(‘0e123456789’==0); //bool(true)
var_dump(‘0e123456789’==’0’);//bool(true)
var_dump(‘0e1234abcde’==’0’);//bool(false)

当密码经过散列计算过后可能会以0e开头,下面示例在进行密码判断时可以绕过密码登录逻辑

<?php
$servername = “localhost”;
$username = “root”;
$password = “root”;
$dbname = “login”;

// 创建连接
$conn = new mysqli($servername, $username, $password,$dbname);

// 检测连接
if ($conn->connect_error) {
die(“连接失败: ” . $conn->connect_error);
}
$sql = “SELECT id, username, password FROM login1”;
$result = $conn->query($sql);
echo “连接成功”;
if ($result->num_rows > 0) {
// 输出数据
while($row = $result->fetch_assoc()) {
echo “id: ” . $row[“id”]. ” – Name: ” . $row[“username”]. ” ” . $row[“password”]. “<br>”;
}
} else {
echo “0 结果”;
}
$conn->close();
$username1 = $_POST[‘username’];
$password1= $_POST[‘password’];
// 创建连接
$conn = new mysqli($servername, $username, $password,$dbname);

// 检测连接
if ($conn->connect_error) {
die(“连接失败: ” . $conn->connect_error);
}
$sql = “SELECT id, username, password FROM login1”;
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// 输出数据
while($row = $result->fetch_assoc()) {
echo “id: ” . $row[“id”]. ” – Name: ” . $row[“username”]. ” ” . $row[“password”]. “<br>”;
echo var_dump ($password1==$row[“password”]);
if(md5($password1)== $row[“password”] & $row[“username”] ==($username1)) {//Hash 比较缺陷
echo ‘登录成功’;

}else{
echo ‘登录失败’;
$psd = $row[“password”];
echo $psd;
echo “<br>”;
echo md5($password1);
echo “<br>”;
echo md5($psd);

}
}
} else {
echo “0 结果”;
}

?>

关于PHP编码安全---Hack之路

关于PHP编码安全---Hack之路

为了测试写的比较繁琐见谅!

小结:在某些系统里有遇到密码经过md5加密后,成为0e开头的密码并储存于数据库,我们就可以输入任意一个在md5加密后等于0e的密码进行任意密码登录,因为0e==0!

关于解决方法我们可以使用hash_equals()函数比较Hash值,可以避免被恶意绕过。Hash_equals()函数要求提供两个参数必须是相同长度的字符串,如果所提供的字符串长度不同会立刻返回Flase

 

网站地址:https://www.hackzl.cn;发布者:hack之路,转转请注明出处:https://www.hackzl.cn/index.php/2020/09/11/%e5%85%b3%e4%ba%8ephp%e7%bc%96%e7%a0%81%e5%ae%89%e5%85%a8-hack%e4%b9%8b%e8%b7%af/

发表评论

邮箱地址不会被公开。 必填项已用*标注