文章目录
前文中提到万能密钥的工作原理,然而万能密钥仅在源代码中没有代码审计,此时才被称之为万能密钥,而代码中有代码审计时需要分以下几种情况讨论
一.uagent注入
先看代码:
php
<?php
#提供用于连接数据库的信息(账号密码等)
include("../sql-connections/sql-connect.php");
error_reporting(0);
function check_input($value)
{
#判断括号中的值是否为空
if(!empty($value))
{
#使用substr()函数截取变量的前20个内容
$value = substr($value,0,20);
}
if (get_magic_quotes_gpc())
{
$value = stripslashes($value);
}
#使用ctype_digit()检查变量是否全部为数字
if (!ctype_digit($value))
{
#若不全是数字使用mysql_real_escape_string()转译变量中的特殊字符
#是原先的符号实体化如单引号不再具有闭合的效果
$value = "'" . mysql_real_escape_string($value) . "'";
}
else
{
$value = intval($value);
}
return $value;
}
#使用php内置函数$_SERVER[]提取http报文中的信息
$uagent = $_SERVER['HTTP_USER_AGENT'];
$IP = $_SERVER['REMOTE_ADDR'];
echo "<br>";
echo 'Your IP ADDRESS is: ' .$IP;
echo "<br>";
#使用isset()函数判断变量是否为空
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
#使用自定义函数check_input()检查使用post方式传递的账户+密码
$uname = check_input($_POST['uname']);
$passwd = check_input($_POST['passwd']);
$fp=fopen('result.txt','a');
fwrite($fp,'User Agent:'.$uname."\n");
fclose($fp);
$sql="SELECT users.username, users.password FROM users WHERE users.username=$uname and users.password=$passwd ORDER BY users.id DESC LIMIT 0,1";
$result1 = mysql_query($sql);
$row1 = mysql_fetch_array($result1);
if($row1)
{
echo '<font color= "#FFFF00" font size = 3 >';
#将查询到的数据uagent,IP,uname插入数据库security中的表uagents的列uagent,ip_address,username
$insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";
mysql_query($insert);
echo "</font>";
echo 'Your User Agent is: ' .$uagent;
echo "</font>";
echo "<br>";
print_r(mysql_error());
echo "<br><br>";
echo "<br>";
}
}
?>
了解完上述代码后发现,uagent没有相应的审计代码防止SQL注入,因此可以使用uagent进行注入。