原理:PHP代码中使用了urldecode()等编解码函数,放在了一个尴尬的使用位置,与PHP自身编码配合失误
自己编写一个二次编码注入的代码
<?php
error_reporting(E_ALL ^ E_DEPRECATED);
header("Content-Type: text/html; charset=utf-8");
$conn = mysql_connect('localhost', 'root', '123456');
mysql_select_db("security", $conn);
//mysql_query("SET NAMES 'gbk'", $conn);
$id = mysql_real_escape_string($_GET['id']);
$id = urldecode($id);
$sql = "select * from users where id='$id'";
$query = mysql_query($sql, $conn);
if($query == True)
{
$result = mysql_fetch_array($query);
$username = $result["username"];
$password = $result["password"];
print_r('用户名: ' . $username . '<br />');
print_r('密 码: ' . $password . '<br />');
print_r('<br />SQL语句:' . $sql);
}
mysql_close($conn);
?>
mysql_real_escape_string在urlencode之前,所以不能解决由于urlencode带来的编码问题
%25%23是被自身编码解决了的,编码成%和#
因为没有明显的分号’,所以mysql_real_escape_string不能操作,所以%27#在urldecode处就变成了’#,就完成了SQL注入的目的
使用union方法