參考文章: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]; ?>