软件测试之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''='漏洞。

 

posted @ 2022-03-07 11:38  AubeLiang  阅读(567)  评论(0编辑  收藏  举报