文章目录
- 前言
- SQL注入是什么?
- SQL注入具体内容
- 一.攻击思路
- 二.万能密码
- 三.注入分类
- 1、参数类型分类
- 2.注入位置分类
- 3.结果反馈分类
- SQL注入相关例题
- 总结
前言
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