本实验仅适用于学习和测试 ,严禁违法操作 ! ! !
目录
一、数字型注入(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的盲注主要表现症状:
- 没有报错信息
- 不管是正确的输入,还是错误的输入,都只显示两种情况(我们可以认为是0或者1)
- 在正确的输入下,输入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进行测试
免责声明:由于传播或利用此文所提供的信息、技术或方法而造成的任何直接或间接的后果及损失,均由使用者本人负责, 文章作者不为此承担任何责任。