sql編碼形成的安全問題(基於mysql8.0版本)

參考文章:https://www.leavesongs.com/PENETRATION/mysql-charset-trick.htmlphp

https://www.leavesongs.com/PENETRATION/Mini-XCTF-Writeup.htmlhtml

建議先看下上面兩篇文章mysql

參考離別歌大神測試了一下mysql8.0版本是否也存在這個問題sql

mysql8.0開始,默認編碼是utf8mb4,但總有數據庫會設置爲gbk,因此也可能存在一樣編碼問題數據庫

<?php
define('DBHOST', '127.0.0.1');
define('DBUSER', 'root');
define('DBPW', 'password');
define('DBNAME', 'stu');
define('DBPORT', '3306');

$link=@mysqli_connect(DBHOST, DBUSER, DBPW, DBNAME, DBPORT);



for($i = 0 ; $i < 256 ; $i++){
    $c = chr($i);
    $name = @mysqli_real_escape_string($link,'201215121' . $c);
    $sql = "SELECT * FROM `s` WHERE `sno` = '{$name}'";
    $result=@mysqli_query($link,$sql);
    $row = @mysqli_fetch_array($result,MYSQLI_NUM);
    if ($row[0] == '201215121') {
        echo "$i";
        echo "{$c} <br/>";
    }
}

輸出$c時可能會出現亂碼,因此能夠echo utf8_encode($i);測試

這裏是ascii碼0-256全部的對照字符 https://blog.csdn.net/ttmice/article/details/50978054fetch

mysql8.0基本也存在一樣的問題,對於其餘編碼,須要本身再進行測試編碼

tips:測試發現不管後面添加多少空格,查詢都是可行的,猜想sql查詢會自動去掉空格,不過其它空白符不行
測試代碼:.net

<?php
define('DBHOST', '127.0.0.1');址
define('DBUSER', 'root');
define('DBPW', 'password');
define('DBNAME', 'stu');
define('DBPORT', '3306');

$link=@mysqli_connect(DBHOST, DBUSER, DBPW, DBNAME, DBPORT);

$name = @$_GET['name'];

$sql = "SELECT * FROM `s` WHERE `sno` = '{$name}'";

$result=@mysqli_query($link,$sql);
$row = @mysqli_fetch_array($result,MYSQLI_NUM);
echo $row[0];

?>
相關文章
相關標籤/搜索