一文了解pikachu的SQL注入

本文详细介绍了在Pikachu靶场中遇到的各种SQL注入方式,包括数字型注入、字符型注入、搜索型注入、XX型注入、INSERT/UPDATE注入、DELETE注入、HTTPHeader注入以及两种盲注技术。通过实例展示了如何利用注入点进行测试和利用,强调了理解SQL语句和尝试不同注入方法的重要性。
摘要由CSDN通过智能技术生成

前言:

本文章主要讲解关于pikachu的注入方式。

目录

前言:

一、数字型注入(post)

二、字符型注入(get)

三、搜索型注入

四、xx型注入

五、"insert/update"注入

六、"delete"注入

七、"http header"注入

八、盲注(base on boolian)

九、盲注(base on time)

十、宽字节注入


一、数字型注入(post)

        首先进入靶场

这里界面很简单,我们勾选复选框任意数值点查询用Brupsuite尝试抓包 

 因为POST型会把传参放在请求正文里,所以我们一眼就可以看见当前使用的是id进行传参,由于提示该题为数字型,所以我们可以使用and1=1,and1=2进行测试是否注入

 当and1=1时

当and1=2时

 这时候知道已经注入成功了,就可以使用union联合查询了,是不是非常简单,既然注入成功了,就是老一套的order by爆裂,然后联合查询union select看回显位,version()看版本,database()看数据库,爆数据了,这里就不再演示了。

二、字符型注入(get)

 进入字符型注入还是老规矩,既然是字符那肯定闭合是必不可少的,所以首先我们测闭合,先尝试输入单引号'测试闭合,然后点击查询

 

 这里提示我们语法有错误,通过url可以得知这个是GET型并且通过name传参的,我们可以尝试着在后面输入 -- a完成闭合,看看是否注入成功,由于我们并不知道该数据库里面究竟有什么username,为了方便测试,我们直接在里面输入order by 5来判断是否注入成功

 

 这里显示找不到5列,这里比较幸运一次就尝试成功了,一般碰到字符型,刚接触的话就多多尝试,这里url里面的+号在url里面代表的空格的意思

三、搜索型注入

 这里还是尝试输入单引号'测试一下闭合

 

 这里看着跟上一关好像是一样的,都是GET型通过name进行传参的,我们直接把上一关的传参拿来用一下好了,直接复制在url里面输入

 这里居然轻松注入了,我也是没有想到

四、xx型注入

 这里还是一样的框,既然是xx型,就说明字符型和数字型猜一猜,我们直接老规矩输入单引号'查找闭合

 

 语法错了提示很多很乱,但是多了个)是什么意思呢?不知道?我也不知道,反正多试试就知道了,我们尝试在单引号后面加上括号呢

 

 这次显示的居然少了很多,那我们尝试这用')注入一次试试呢

 注入成功,没什么难度

五、"insert/update"注入

 到了这关就比较有意思了,因为之前在sqli靶机的时候,没有打过这一关,所以我也是一头雾水,也是查询了一下资料,恍然大悟,其实SQL注入就是一定一定要对SQL语句有很深刻的了解,你才能懂原理是什么,通过什么方式注入的,等你知道了之后你会发现真的挺有趣的。这里上来肯定都是对着这个登录界面一顿操作,这边我建议你先试一遍,然后再看答案。不过想必大家都是试过了不懂了才来查阅资料的,那我就废话不多说了,首先右上角有个小小的tips,大家都是知道的。

这里告诉我们注册账号试一试,说明本道题演示的注入地方是在注册里面,我们直接进入注册界面

 

 这里一共有6个框框,题目提示了这是一个insert方式的注入,那我们要弄明白这道题的话,我们首先就得知道SQL语句中,insert的语法,再Mysql中,插入数据最常见的语句就是:

insert into 表名 values(1,1,1,1),这里为了方便数据我用1来代替

这里没看懂的,我建议重新看一看SQL语句,我们都知道再Mysql数据中values里面的值有INT,VARCHAR等类型对吧,那么上面的注册信息,很明显我们能看到前3个,用户,密码,性别里面的值怎么说也是要字符的吧,字符是不是就得用到VARCHAR类型呢。

那么我们是不是可以猜测到这道题背后的SQL语句是

insert into 表名 values('1','1','1',1,'1','1')也就是

insert into 表名 values('$_用户','$_密码','$_性别',$_手机,'$_地址','$_住址')

这样的结构呢,因为手机号码的话大概率可能是个INT类型。这里没看懂的,我还是建议重新看看SQL语句,不然还是理解不了。

那么通过这个猜测我们是不是可以理解,每个框里输入的值,都对应的插入对应的占位里了呢。

既然我们明白了当前我们输入的数据在后端是以什么样形式进行存储的,我们就可以尝试着去构造闭合,这里办法其实有很多种,我使用的是'#'号闭合,'#'号在Mysql里面代表这注释的作用,比方说我们在第一个用户框里输'#'号,那是不是就是下面这样的效果,这里我们加的参数我用红色标识出来更方便理解

insert into 表名 values('$_用户#','$_密码','$_性别',$_手机,'$_地址','$_住址')

这里是不是'#'号后面的都被我注释掉了呢

那么想要这个语句没有出现语法错误我们是不是该输入正确的SQL语句呢

insert into 表名 values('$_用户')#','$_密码','$_性别',$_手机,'$_地址','$_住址')

这里看不懂的话还是建议多看看SQL语句,你就懂了

这里我们尝试下思路是否正确,我们将')#输进去测试一下

 

 Column count doesn't match value count at row 1,这里翻译一下表示该错误的意思是传入表的字段数和values值的个数不一样

正常我们输入单引号测试闭合时提示的界面是这样的

 

 提示语法错误,说明我们使用')#的思路是正确的

由于我们知道这道题提示的总是错误的信息,除了错误的信息,其它的都是正常显示,那么这里就要用到报错注入了,通过报错信息注入子查询来获取我们要的数据,然后values的语句结构我们要输入第二个传参时需要用到,号,这里逗号是关键,比如

insert into 表名 values('$_用户',())#','$_密码','$_性别',$_手机,'$_地址','$_住址')

这里是我在用户框里输入的语句:a',(updatexml(0x7e,concat(0x7e,version()),0x7e)))#

这里子查询要用()括起来,知道为什么的小伙伴可以在评论区说哦

到这里我们输入的语句在后端就是

insert into 表名 values('a',(updatexml(0x7e,concat(0x7e,version()),0x7e)))#','$_密码','$_性别',$_手机,'$_地址','$_住址')

由于第二个密码框是必选项,可能这是个JS语法不能为空,我也没有继续研究,反正已经被我们给注释掉了并不重要,我们随便输入任意值就行了,就像这样

 点击提交

 得到了版本号,注入成功。这里看不懂的建议好好看看SQL报错注入的原理,这里就不多解释了,这里思路很重要,当然这道题不止我这一种办法,尝试这用or也是可以实现的,还是那句话,多多练习,多多尝试,经验都是试出来的

六、"delete"注入

 这里delete注入,顾名思义,从删除中找注入点

这里也提示删除留言存在注入点,那我们不多说直接上手

 

 这里随便输入点击提交

 提交完成点删除,这里我们要用到我们的老伙伴了Brupsuite抓包

 点击删除我们通过抓包知道GET型id传参,那么要知道什么delete注入,还是那句话,先弄明白delete在Mysql数据库中,是什么样的语句,在Mysql里面delete语句如下

delete from 表名 where 条件=什么

没毛病吧。那么我们是不是可以猜测这道题背后的数据库语句是这样的呢

delete from 表名 where id=68,(因为我抓到的包id是68)

是不是我们可以判断传参id=68时,我们留言列表里的123将会被删除,那么如果此时我们通过or语句将id不等于68,那么是不是在Mysql里面,当第一条语句没有执行成功时,会执行另一条语句呢,这里我们尝试在url里面将id=0 or version()小试一下,看看有没有回显信息

 这里显示没有version这一列,那我们尝试用order by 5试试呢

 这里显示语法错误,那会不会是用报错注入呢?尝试用报错注入试试id=0 or updatexml(0x7e,concat(0x7e,database()),0x7e)

http://127.0.0.1/pikachu/vul/sqli/sqli_del.php?id=%200%20or%20updatexml(0x7e,concat(0x7e,version()),0x7e)

 得到版本号了,这里主要是为了演示注入思路,还是要多尝试,这里没看懂的还是一样回去看看什么是报错注入

七、"http header"注入

 http头注入我们先看一下提示

账号密码都告诉我们了这不登录进去看看?当然这里老朋友先抓个包

 

 进入发现我的浏览器和操作系统,IP端口等都被获取了,这是通过什么方式获取的呢?我们看刚刚老朋友抓的包和里面告诉我们的有哪些相似之处,首先我们一眼望去就得知

可能是通过这两个传参获取的数据

那么我们做这道题的时候首先就要知道什么是User-Agent

User-Agent 即用户代理,简称“UA”,它是一个特殊字符串头。网站服务器通过识别 “UA”来确定用户所使用的操作系统版本、CPU 类型、浏览器版本等信息。而网站服务器则通过判断 UA 来给客户端发送不同的页面。

那么这里我们是不是可以先尝试在User-Agent修改数据传参来验证我们的猜测呢,还是老方法单引号测闭合

 

 

 

 

 通过这个页面我们猜测可能也是insert插入闭合,在User-Agent后面输入

'or updatexml(0x7e,concat(0x7e,version()),0x7e) or '

注:此处需要修改每个post和get包的user agent来保证最后输出的user agent的参数为你输入的参数

 

 

 

 得到版本号,注入成功

八、盲注(base on boolian)

九、盲注(base on time)

十、宽字节注入

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值