我的编程空间,编程开发者的网络收藏夹
学习永远不晚

一文了解pikachu的SQL注入

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

一文了解pikachu的SQL注入

前言:

本文章主要讲解关于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)

十、宽字节注入

来源地址:https://blog.csdn.net/allintao/article/details/129288675

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

一文了解pikachu的SQL注入

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

一文讲解Node+mysql对SQL注入

?SQL注入攻击 是很古老的攻击方式了,自从 web2.0 诞生后就有 SQL注入攻击。它通常出现在 输入框 、文本域 等前端组件中。在输入的内容里加入 SQL语句 ,并一同传给后台。
2022-11-22

一文搞懂SQL注入攻击

目录1. 前言2. SQL注入简介(1)SQL语言(2)SQL注入3. SQL注入步骤(1)发现漏洞(2)信息收集(3)攻击Web系统(猜解用户名和密码)(4)获取管理员权限4. 防范SQL注入(1)使用参数化查询或存储过程(2)用户输入检
2023-04-19

SQL注入报错注入函数图文详解

目录前言常用报错函数用法详解updateXML()函数实例extractvalue()函数floor()函数exp()函数12种报错注入函数总结前言报错注入的前提是当语句发生错误时,错误信息被输出到前端。其漏洞原因是由于开发人员在开发程序
2022-07-08

一文搞懂Java JDBC中的SQL注入问题

在用户输入的数据中有SQL关键字或语法,并且关键字或语法参与了SQL语句的编译,导致SQL语句编译后的条件为true,一直得到正确的结果,这种现象就是SQL注入,这篇文章主要介绍了一文搞懂Java JDBC中的SQL注入问题,需要的朋友可以参考下
2022-11-13

一文详解嵌入式SQL

目录嵌入式SQL概述使用嵌入式SQL的注意事项区分SQL语句与主语言语句数据库工作单元和程序工作单元之间的通信协调两种不同的处理方式嵌入式SQL程序的组成程序首都程序体在嵌入式SQL中使用游标检索多个元组游标定义语句游标打开语句游标推进语句
2023-01-17

一文带你深入了解Node.js(图文详解)

本篇文章通过超多代码和图解来带大家深入解析Node.js,主要内容包括模块化处理、包的基本应用、Express、跨域、操作Mysql数据库等,希望对大家有所帮助!
2023-05-14

编程热搜

目录