资讯专栏INFORMATION COLUMN

SQL注入学习笔记

sihai / 2195人阅读

摘要:结果反馈分类盲注入盲注入不会展现任何数据库报错内容,它是依据构造真或假的问题对数据库进行提问,注入方式主要有两种基于布尔值与基于时间。


前言

SQL注入漏洞(SQL injection)是Web层面最高危的漏洞之一。但凡使用数据库开发的应用系统,就可能存在SQL注入攻击的媒介。在2008年至2010年期间,SQL注入漏洞连续3年在OWASP年度十大漏洞排行中排名第一。


以下是本篇文章正文内容,内容仅供参考

SQL注入是什么?

SQL注入,简单的说就是在post/getweb表单、输入域名或页面请求的查询字符串中插入SQL命令,最终使web服务器执行恶意命令的过程。

SQL注入具体内容

一.攻击思路

1、寻找SQL注入点
2、收集后台数据库信息,判断数据库类型
3、猜解用户名和密码
4、查找后台可以登录的地址,进一步提权,进行入侵和破坏

二.万能密码

在说sql注入分类之前,先来看一下万能密码的构成原理。万能密码是由于某些程序,通过采用判断sql语句查询结果的值是否大于0,来判断用户输入数据的正确性造成的。当查询之大于0时,代表用户存在,返回true,代表登录成功,否则返回false 代表登录失败。由于 ‘or 1=1–’ 在执行后,结果始终为1,所以可以登录成功。因此,被称为万能密码。

三.注入分类

1、参数类型分类

·数字型注入:输入参数为整型时,如Id、年龄和页码等;
测试具体步骤:
(1) 加单引号,
www.text.com/text.php?id=3’
对应的sql:select * from table where id=3’这时sql语句出错,程序无法正常从数据库中查询出数据,就会抛出异常;
(2) 加and 1=1,
www.text.com/text.php?id=3 and 1=1
对应的sql:select * from table where id=3’ and 1=1语句执行正常,与原始页面如任何差异;
(3) 加and 1=2
www.text.com/text.php?id=3 and 1=2
对应的sql:select * from table where id=3 and 1=2语句可以正常执行,但是无法查询出结果,所以返回数据与原始网页存在差异
如果满足以上三点,则可以判断该URL存在数字型注入。

·字符型注入:输入参数为字符串型时,如姓名、职业、住址等;
测试步骤:

(1) 加单引号:select * from table where name=’admin’’

由于加单引号后变成三个单引号,则无法执行,程序会报错;

(2) 加 ’and 1=1 此时sql 语句为:select * from table where name=’admin’ and 1=1’,也无法进行注入,还需要通过注释符号将其绕过;

Mysql 有三种常用注释符:

--注意,这种注释符后边有一个空格
#通过#进行注释

/* */注释掉符号内的内容

因此,构造语句为:select * from table where name =’admin’ and 1=1—’可成功执行返回结果正确;

(3) 加and 1=2—此时sql语句为:select * from table where name=’admin’ and 1=2 –’则会报错

如果满足以上三点,可以判断该url为字符型注入。
(两者最大的区别:字符型注入一般要使用单引号进行闭合,而数字型注入则不需要)

2.注入位置分类

(1)Get方式注入
get注入方式比较常见,主要是通过url中传输数据到后台,带入到数据库中去执行,可利用联合注入方式直接注入,联合注入后面会具体解释。
(2)Post方式注入
post提交方式主要适用于表单的提交,用于登录框的注入
方法:利用BurpSuite抓包进行重放修改内容进行,和get差别是需要借助抓包工具进行测试,返回结果主要为代码,也可转化为网页显示
(3)HTTP头注入
首先解释一下Header头:

通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机响应消息。 这两种类型的消息有一个起始行,一个或者多个头域,一个只是头域结束的空行和可选的消息体组成。 HTTP的头域包括通用头,请求头,响应头和实体头四个部分

什么是Header头部注入?

header注入,该注入是指利用后端验证客户端信息(比如常用的cookie验证)或者通过header中获取客户端的一些信息(比如User-Agent用户代理等其他header字段信息),因为这些信息在某些地方是会和其他信息一起存储到数据库中,然后再在前台显示出来,又因为后台没有经过相对应的信息处理所以构成了sql注入。
(4)Cookie方式注入
概念:HTTP协议本身是无状态的,什么是无状态呢,即服务器无法判断用户身份,cookie实际上是一小段的文本信息(key-value格式),用于记录用户状态。但是这种方式的前提是:有交互记录,有cookie记录,另外,页面如果有报错信息可以利用报错注入,这种攻击手法后续也会提到。
(5)XFF方式注入
X-Forwarded-For:
简称XFF头,代表了HTTP的请求端真实IP。 是客户端通过HTTP代理或者负载均衡器连接到web服务端获取源IP地址的一个标准(通常一些网站的防注入功能会记录请求端真实IP地址并写入数据库或某文件,通过修改XXF头可以实现伪造IP),一般伪造的都是本地IP127.0.0.1
(6)User-Agent方式注入
UA的基本概念: User Agent中文名为用户代理,简称UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本,CPU类型,浏览器及版本,浏览器渲染引擎,浏览器语言,浏览器插件等。
(7)Referer方式注入
Referer的基本概念: HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器该网页是从哪个页面连接发过来的,服务器因此可以获得一些信息用于处理。

3.结果反馈分类

(1)盲注入:盲注入不会展现任何数据库报错内容,它是依据构造真或假的问题对数据库进行“提问”,注入方式主要有两种:基于布尔值与基于时间。
基于布尔值:
如在MySQL中判断数据名长度的输入为1’ and length(database()) = 10 #,通过相应的正确与否判断数据名的长度是否为10,猜测数据库中数据的具体内容时,可以借助SUBSTR、LIMIT、ASCII等一些特殊的命令及函数进行猜测;
基于时间:
基于时间的SQL盲注入方式通常是在SQL语句中添加延时函数,依据相应时间来判断是否存在SQL注入,常用的延时函数或指令有sleep、repeat等。

总结:盲注入提交SQL命令较多,通常通过手工方式无法完成,借用工具如SQLMAP。
(2)联合查询注入
基本语句select 语句
union[union选项]
select 语句;
所谓联合查询注入即是使用union合并两个或多个SELECT语句的结果集,所以两个及以上的select必须有相同列、且各列的数据类型也都相同。联合查询注入可在链接最后添加order by 9基于随意数字的注入,根据页面的返回结果来判断站点中的字段数目。但是这个前提是页面要有显示位
(3)报错注入
这种方法页面没有显示位,当echo mysql_error();函数输出了错误信息的时候,就可以使用,但是此种方法语句比较复杂
(4)堆查询注入
这种方法可以同时执行多条语句的执行时的注入

SQL注入相关例题

联合注入:

点击维护通知,有显示位,发现有参数id=1,考虑联合查询注入,用sql语句order by 1到9查字段数,发现是4
接着,and 1=2 UNION SELECT 1,2,3,4查看出错的字段,在2,3处,
验证数据库的类型及名称,利用数据库information_schema 的 schemata 、table、column表查表 、列查表进而查看它的值,
最后查数据,两串数据都尝试一下

试了试,还是登不进去,考虑加密,最后终于成功,


总结

这些是最近学习SQL注入整理的笔记,最重要的还是要应用于实际。

本文参考链接:https://baijiahao.baidu.com/s?id=1653173591310148806&wfr=spider&for=pc
https://zhuanlan.zhihu.com/p/376153188

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/121339.html

相关文章

  • 网络安全方面学习笔记(持续更新...)

    摘要:网关一般就是网络交换机如路由器服务器等,网关的地址是具有路由功能的设备的地址,具有路由功能的设备有路由器启用了路由协议的服务器实质上相当于一台路由器代理服务器也相当于一台路由器。表示后面即使执行错误,也不报错。 ...

    VishKozus 评论0 收藏0
  • [理论-学习]Web安全原理剖析-01

    摘要:数据库名的字段名为。例如表示取出第一条记录开始,取出条记录。第二步引用恶意数据开发者默认存入数据库的数据都是安全的,在进行查询时,直接从数据库中取出恶意数据,没有进行进一步的检验的处理。注入攻击输入的参数转为编码进行攻击。 声明: 由于笔者能力有限,难免出现各种错误和漏洞。全文仅作为个...

    CarlBenjamin 评论0 收藏0
  • Mybatis学习笔记(一)——基本的CRUD操作

    摘要:将语句硬编码到代码中,修改语句需要重新编译代码设想使用配置文件配置。从结果集中遍历数据的时候存在硬编码。表示一个拼接符号,会引用注入,所以不建议使用。和表示查询出一条记录进行映射。 MyBatis是什么 mybatis是托管在github上的ORM框架,让程序员将主要精力放在SQL上,通过mybatis提供映射方式,自由灵活(SQL的可定制性较高,半自动化)生成满足需求的SQL语句。m...

    evin2016 评论0 收藏0
  • Laravel 学习笔记之 Query Builder 源码解析(中)

    说明:本篇主要学习数据库连接阶段和编译SQL语句部分相关源码。实际上,上篇已经聊到Query Builder通过连接工厂类ConnectionFactory构造出了MySqlConnection实例(假设驱动driver是mysql),在该MySqlConnection中主要有三件利器:IlluminateDatabaseMysqlConnector;IlluminateDatabaseQuery...

    zhou_you 评论0 收藏0
  • 黑客零基础入门 | 网络安全

    摘要:网站在使用查询数据时,用户输入的信息或提交的参数比如你在使用百度时输入的关键词,登录某些网站时提交的账户密码将会参与到数据查询的过程中,一旦用户提交了有害数据,便有可能对网站运行产生危害。显而易见,黑客与网络安全紧密相关。 ...

    Kyxy 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<