Pickachu第四弹:SQL注入

本文详细介绍了多种类型的SQL注入攻击,包括数字型、字符型、搜索型、宽字节等,并提供了手工测试流程和报错利用方法。通过案例分析,展示了如何通过注入payload来获取数据库信息,同时强调了安全防护的重要性。
摘要由CSDN通过智能技术生成

本实验仅适用于学习和测试 ,严禁违法操作 ! ! !

目录

一、数字型注入(post)

二、字符型输入(get)

三、搜索型注入

四、xx型注入

五、“insert/update”注入

六、“delete”型注入

七、“http header”注入

八、盲注(base on boolian)

九、盲注(base on time)

十、宽字节注入

十一、手工测试流程

十二、报错利用流程


一、数字型注入(post)

看到输入点后,我们想象一下它在数据库中是怎样操作的,select 字段1,字段2 from 表名 where id=1

1.选择1后,返回id=1的用户及邮箱,url中无id值

2.抓包并发送到重发器中

3.改包,看能否把1 or 1=1当作逻辑去执行,遍历所有id信息。因此,id=1是存在sql注入的,并且是数字型的sql注入,我们可以自己拼接一些sql进去,然后让数据库来执行它,得到一些我们预期的结果。

二、字符型输入(get)

想象一下它在数据库中是怎样操作的,select 字段1,字段2 from 表名 where username=’kobe’( username也不一定就叫username,假设字段是叫username)

1.输入kobe' or 1=1 #遍历数据库

三、搜索型注入

猜想后台是不是用了数据库中搜索的方式去进行查询,我们需要构造对应的闭合。核心思想:猜测后台用的什么类型去构造闭合,只要把闭合构造出来,后端如果没有做处理的话,就能用拼接的方式去进行相关payload测试。

1.查看源码的闭合情况

  

2.构造语句’%xx%' or 1=1#%’,输入语句xx%' or 1=1#,遍历数据库信息

四、xx型注入

1.查看源码,用()来拼接字符,开发人员在拼sql的时候有可能用各种方式来拼变量,核心点是去构造合法的闭合

2.构造语句('xxx') or 1=1#'),输入语句xxx') or 1=1#,遍历数据库信息

五、“insert/update”注入

1.insert

Insert注入,前端注册的信息最终会被后台通过insert这个操作插入到数据库中,它在接收前端注册数据时,没有做防sql注入处理,导致前端的输入可以直接拼接到后端的insert相关操作中去,然后就形成insert类的sql注入。我们在用户中输入一个单引号和密码,提交后返回错误信息,意味着我们提交的内容在后台参与了sql的拼接,所以导致了一个明显的mysql语法报错。在数据库中正常应该这样写insert into member(username,pw,sex,phonenum,email,address) values(‘xiaoming’,1111,1,2,3,4);我们可以在’’中输入payload,通过or来进行闭合。

(1)点击注册,输入构造的Payload语句: xiaohuang'  or updatexml(1,concat(0x7e,database()),0)  or '当这个整体插入进去后,sql语句在执行时会用or这个逻辑运算去对第一个插入的值进行运算,运算的过程当中会去执行updatexml,就会把database()执行的结果显示出来

2.update

(1)登录后修改信息,输入构造的Payload语句: xiaohuang' or updatexml(1,concat(0x7e,version()),0) or '显然是通过update去操作后台数据库把相关的内容更新为我们要的内容,这个地方就存在update注入

六、“delete”型注入

没对传进来的id进行处理,导致DEL注入

1.删除一个留言并抓包,发送到重发器

2.改包,并编译成url形式(id为数字,数字型不需要’闭合)

1 or updatexml(1,concat(0x7e,database()),0)

3.发送后返回报错信息

七、“http header”注入

有时候,后台开发人员为了验证客户端头信息(比如常用的cookie验证),或者通过http header头信息获取客户端的一些信息,比如useragent、accept字段等等,会对客户端的http header信息进行获取并使用SQL进行处理,如果此时没有足够的安全考虑则可能会导致基于http header的sql注入漏洞 。

记录了ip地址、user agent、http accept、本次链接的tcp端口,一看这个功能,我们就知道后端应该对http头中的数据进行了获取,是不是也进行了相关数据库的操作呢,我们可以在这个点去测试一下,一般来说,像这种获取http头数据的地方,都有可能会出现http头注入的问题。

方法一:

1.登陆后抓包

2.将User-Agent删掉,自己构造一个,先发送一个’,看后台会不会报错,报了一个mysql的语法错误,这样就可以看出来这个地方是存在sql注入漏洞的,它将’放到sql中执行了,一般它获取到UA后有可能会insert到数据库中,构造payload并发送

3.收到返回结果

方法二:修改cookie

Cookie的信息是用来跟踪会话的,后台会获取cookie信息,虽然cookie就是后端发下来的,但是在页面之间进行跳转的时候,客户端会去获取前端的cookie进行相关的验证,如果获取到cookie后把cookie输入到数据库中进行拼接相关的操作,也有可能产生sql注入的漏洞,我们把cookie进行相关的测试。这是一个登录的cookie,我们在用户名后添加一个’,提交后报语法错误,这个地方存在sql注入漏洞

收到返回结果

八、盲注(base on boolian)

有些情况下,后台使用了错误消息屏蔽方法屏蔽了报错,此时无法再根据报错信息来进行注入判断,这种情况下的注入,称为“盲注”。

基于boolean的盲注主要表现症状:

  1. 没有报错信息
  2. 不管是正确的输入,还是错误的输入,都只显示两种情况(我们可以认为是0或者1)
  3. 在正确的输入下,输入and 1=1/and 1=2会返回正确的显示,错误的输入下会返回另外的页面

1.输入’或kobe’ or 1=1# 显示您输入的用户不存在

2.输入kobe’ and 1=1# 返回结果,and 1=1#已经被数据库执行了

3.输入kobe’ and 1=2# 显示您输入的用户不存在,这里已经把输入的语句放到sql中进行运算,因此存在sql注入漏洞,但是提示信息很少,只有正确信息和用户不存在

4.猜测数据库名第一个字符:kobe’ and ascii(substr(database(),1,1))=113#,(对database()数据库进行取值,从第一个字符开始取,取一个值)返回用户名不存在

5.前面的条件和后面的条件进行一个逻辑and比较,已经确认kobe这个字符串是存在的,如果后面的表达式也为真,返回的就是kobe的结果,如何后面的表达式为假,就会返回用户名不存在。

输入kobe' and ascii(substr(database(),1,1))=112#,(将取值转换为ASCII码并比较,可以通过返回的结果知道payload打出来的字符串是什么,可以一步一步把后端想要的数据拎出来)返回结果。select length(database())=7;可以猜测数据库名长度。

九、盲注(base on time)

如果说基于boolean的盲注在页面上还可以看到0 or 1的回显的话,那么基于time的盲注完全就什么也看不到了。但是还有一个条件,就是“时间”,通过特定的输入,判断后台执行的时间,从而确认注入。

1.先输入一个’,没有报错,在输入kobe,也没有报错,输入kobe’ and 1=1#判断后端有没有执行这个逻辑,也没有报错。F12打开控制台,重新载入,输入Payload:kobe' and sleep(5)#,让它暂停五秒后再执行。在mysql中有一个sleep()函数,它会把这个动作暂停指定的时间之后再执行。如何这个地方存在拼sql的情况,那么它就会把and sleep(5)#这个语句去执行,那后端就会暂停5秒之后再返回数据到前端。通过这个现象我们就可以确认,这个地方是存在sql注入的,并且是基于时间的盲注。

2.输入kobe' and if((substr(database(),1,1))= 'p',sleep(5) ,null)#通过单引号把前面的单引号闭合掉,用if做了一个判断,通过database()把数据库的名称取出来,通过substr()把数据库名称里的第一个字符取出来,去跟’p’做一个比较,’p’就是我们猜测的点,当第一个字符等于p,就会暂停5秒钟,如果不等于p,就等于null,等于假,就不会暂停5秒钟。

十、宽字节注入

当后端对用户的输入做了转义时,比如利用addslashes()或mysql_escape_string()函数。此时输入id=1’其中的单引号会被转义而变成id=1\',这样就使得单引号无法闭合数据库中的语句,一般情况下是很难绕过的。但是有两种情况可以通过宽字节注入绕过。第一种情况是当数据库的编码为GBK时,注入格式为id=1%df',因为反斜杠\的编码为%5c,所以参数传到后端经过转义后就会变成id=1%df%5c',其中GBK会将%df%5c编码成一个繁体字,这样反斜杠就失去了转义的效果,使得单引号逃逸出来闭合了语句。第二种情况是,若后端的代码中有转换字符编码的函数,道理其实一样,就是将用户输入的参数用宽字节去解释了,从而使单引号逃逸。

1.抓包并发送到重发器

2.改包并发送

十一、手工测试流程

1.输入单引号:’  判断是否存在注入点,如果返回错误,则是字符型SQL注入(把前端的输入当作数据库的一部分去执行,存在注入漏洞/点)

2.做一个测试,输入kobe’ or 1=1#,发现可以遍历数据库数据,

3.确认主查询有几个字段,输入kobe’ order by 3进行尝试,发现报错,输入2返回正确信息,因此有两列

4.union联合查询基础信息:数据库名称

输入语句:kobe’ union select database(),user()#

5.输入Payload进行测试

十二、报错利用流程

1.输入单引号:’  判断是否存在注入点,返回错误值,符合用报错来获取信息的条件

2.输入Payload进行测试

免责声明:由于传播或利用此文所提供的信息、技术或方法而造成的任何直接或间接的后果及损失,均由使用者本人负责, 文章作者不为此承担任何责任。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值