原理

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注入的原理及一般步骤的更多相关文章

  1. Sql注入基础原理介绍

    说明:文章所有内容均截选自实验楼教程[Sql注入基础原理介绍]~ 实验原理 Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击, ...

  2. 【渗透课程】第五篇-SQL注入的原理

    哈哈哈,讲到注入了.我想给大家讲注入的原理.这个我们前面的前言篇就说过,所谓的SQL注入就是,绕过数据库验证机制直接执行SQL语句.怎么说呢,我们先讲一个概念吧! 网站和网页的区别 单纯的网页是静态的 ...

  3. SQL注入的原理以及危害

    SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符 ...

  4. Java学习笔记47(JDBC、SQL注入攻击原理以及解决)

    JDBC:java的数据库连接 JDBC本质是一套API,由开发公司定义的类和接口 这里使用mysql驱动,是一套类库,实现了接口 驱动程序类库,实现接口重写方法,由驱动程序操作数据库 JDBC操作步 ...

  5. 初级安全入门——SQL注入的原理与利用

    工具简介 SQLMAP: 一个开放源码的渗透测试工具,它可以自动探测和利用SQL注入漏洞来接管数据库服务器.它配备了一个强大的探测引擎,为最终渗透测试人员提供很多强大的功能,可以拖库,可以访问底层的文 ...

  6. 使用JDBC分别利用Statement和PreparedStatement来对MySQL数据库进行简单的增删改查以及SQL注入的原理

    一.MySQL数据库的下载及安装 https://www.mysql.com/ 点击DOWNLOADS,拉到页面底部,找到MySQL Community(GPL)Downloads,点击 选择下图中的 ...

  7. 简单说说mybatis是防止SQL注入的原理

    mybatis是如何防止SQL注入的 1.首先看一下下面两个sql语句的区别: <select id="selectByNameAndPassword" parameterT ...

  8. 【荐】PDO防 SQL注入攻击 原理分析 以及 使用PDO的注意事项

    我们都知道,只要合理正确使用PDO,可以基本上防止SQL注入的产生,本文主要回答以下几个问题: 为什么要使用PDO而不是mysql_connect? 为何PDO能防注入? 使用PDO防注入的时候应该特 ...

  9. SQL注入的原理与预防

    1. 什么是SQL注入? SQL注入是常见的网络攻击方式之一,通过SQL语句实现无账号登录,非法获取甚至篡改数据库中的数据. 2. SQL注入的思路 (1)找到SQL注入位置: (2)判断服务器类型和 ...

随机推荐

  1. JMeter_事务控制器

    性能测试的结果统计时我们一定会关注TPS,TPS代表的是每秒事务数,每个事务对应的是我们的请求.虽然JMeter能够帮我们把每个请求统计成一个事务,但有时候我们希望把多个操作统计成一个事务,JMete ...

  2. spring-Ioc(二)学习笔记

    属性注入方式 设值注入:也就是set注入,通过setter方法注入 java Bean private ITestDao dao; public void setDao(ITestDao dao){ ...

  3. 35个JAVA性能优化总结

    原文链接:http://mp.weixin.qq.com/s/J614jGM_oMrzdeS_ivmhvA   代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对 ...

  4. Mysql实训任务书

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6635189537079296526/ 什么是数据库:数据库(Database)是按照数据结构来组织.存储和管理数据 ...

  5. MongoDB-基础知识学习(一)

    概述 最近mongodb在互联网的活跃度直线上升,并且我们公司也使用了mongoDB 3.6 作为生产重要的数据库,我们项目组要监控mongodb的op.log日志,在此整理以前学习的知识,为以后备份 ...

  6. 从容器镜像的选择-alpine 说起

    在 容器崛起之前,Alpine 还是个无名之辈,可能是因为大家并不是很关心操作系统本身的大小,毕竟大家只关心业务数据和文档,程序.库文件和系统本身的大小通常可以忽略不计. 容器技术席卷整个软件产业之后 ...

  7. redis与集群实用操作笔记

    redis哨兵 部署方式 redis配置 首先需要区分的是主从redis,主机也就是用来写的机器,从机是从来读的,为主机分担压力,与集群不同的是redis哨兵不可通过从机写入数据同步到主机,但是也可以 ...

  8. window-server 服务器解决远程连接

    mstsc 连接远程服务器,出现黑屏的情况: 解决方案: 运行 -> 输入gpedit.msc,进入组策略 -> 计算机配置 -> 管理模板 -> Windows组件 -> ...

  9. Linux 系统conda环境,pip文件的导出和安装。

    /** * 注意:1.在当前的Linux系统中,先生成yaml和requirement.txt文件.通过ssh命令连接到另一台Linux实例.需要先在新的Linux实例上安装 conda.然后再将 y ...

  10. Arduino+ESP32 之 驱动GC9A01圆形LCD(一),基于Arduino_GFX库

    最近买了一块圆形屏幕,驱动IC是GC9A01,自己参考淘宝给的stm32的驱动例程, 在ubuntu下使用IDF开发ESP32,也在windows的vscode内安装IDF开发ESP32,虽然都做到了 ...