软件测试之SQL注入
一、SQL注入的概念
SQL 注入是一种非常常见的数据库攻击手段,SQL 注入漏洞也是网络世界中最普遍的漏洞之一,SQL 注入其实就是恶意用户通过在表单中填写包含 SQL 关键字的数据来使数据库执行非常规代码的过程
二、模拟SQL注入
1、环境搭建
软件环境:操作系统、DBMS、语言、浏览器、WEB应用服务器
操作系统:win10
DBMS:MYSQL5.6.12
语言:PHP
浏览器:GOOGLE
WEB应用服务器:Apache
硬件环境:CPU、内存、网络环境
CPU:i5-7200
内存:镁光8G
网络环境:单机
2、模拟SQL注入
(1)环境的安装
安装Wampserver2.4
(2)数据库的准备(SQL脚本)
Create database login charset=gbk; Use login; Create table users(username char(20) primary key,password char(32) not null) charset=gbk; Insert into users value(‘admin’,’admin’) Select * from users;
(3)登录页面程序的开发(PHP脚本)
<form action="login_process.php" method="post"> 用户名:<input type="text" name="username" /> <br/> 密码: <input type="password" name="password" /> <br/> <input type="submit" value="登录"> </from>
(4)登录处理程序的开发(PHP脚本)
<?php header("Content-Type:text/html;charset=gbk"); $username = $_POST["username"]; $password =$_POST["password"]; $sql = "select * from users where username='$username' and password='$password'"; echo $sql; echo "<br/>"; $con = mysqli_connect("localhost","root",""); mysqli_select_db($con,"login"); $result = mysqli_query($con,$sql); var_dump($result); $num = mysqli_num_rows($result); if($num>0){ echo "登陆成功"; }else{ echo "登陆失败"; } ?>
(5)设计测试用例,测试应用程序(列举详细步骤)
依次输入符合条件的字符(包括数字,特殊字符,英文字母等)
发现在登录界面将密码账号输入为“ 'or''='” 可以直接登陆成功
or 是一个逻辑运算符,作用是在判断两个条件的时候,只要其中一个条件成立,那么
等式将会成立.而在语言中,是以1来代表真的(成立).那么在这行语句中,原语句的"and"验证将不再继续,而因为"1=1"和"or"令语句返回为真值.。
三、分析产生SQL注入的原因
在B/S模式中,用户可以通过Get或Post等方式,对服务器发出HTTP请求。在服务器端,对数据库执行查询操作,将查询的结果返回浏览器端。黑客利用上述过程,将精心构造的请求放到传入的变量参数中,让服务器端执行恶意代码,从而达到了读取数据库中敏感信息的效果在B/S模式中,用户可以通过Get或Post等方式,对服务器发出HTTP请求。在服务器端,对数据库执行查询操作,将查询的结果返回浏览器端。黑客利用上述过程,将精心构造的请求放到传入的变量参数中,让服务器端执行恶意代码,从而达到了读取数据库中敏感信息的效果,甚至将数据库删除
四、修改应用程序,避免SQL注入
<?php header("Content-Type:text/html;charset=gbk");
//使用str_replace将浏览器端的用户输入的引号替换成转义引号 $username = str_replace("'","\'",$_POST["username"]); $password =str_replace("'","\'",$_POST["password"]); $sql = "select * from users where username='$username' and password='$password'"; echo $sql; echo "<br/>"; $con = mysqli_connect("localhost","root",""); mysqli_select_db($con,"login"); $result = mysqli_query($con,$sql); var_dump($result); $num = mysqli_num_rows($result); if($num>0){ echo "登陆成功"; }else{ echo "登陆失败"; } ?>
这里,我将浏览器端的用户输入的引号替换成转义引号,避免出现'or''='漏洞。