SQL注入原理 主要是攻击者,利用被攻击页面的一些漏洞(通常都是程序员粗心大意造成的),改变数据库执行的SQL语句,从而达到获取“非授权信息”的目的。
sql 注入的基本步骤
判断是什么类型注入,有没过滤了关键字,可否绕过
获取数据库用户,版本,当前连接的数据库等信息
获取某个数据库表的信息
获取列信息
最后就获取数据了
判断sql注入
显错和基于错误的盲注:
单引号,(如果页面返回错误,则存在 Sql 注入。 原因是无论字符型还是整型都会因为单引号个数不匹配而报错。 如果未报错,不代表不存在 Sql 注入,因为有可能页面对单引号做了过滤,或者是双引号)
and 1=1 和and 1=2,(and 1=1 返回了数据,而and 1=2没有,因为1=1是一个为真的条件,前面的结果是true,true and true 所以没有任何问题,第二个 1=2 是个假条件, true and false还是false,所以并没有数据返回。错误即为数字型)
and ‘1’=’1 和 and ‘1’=’2字符型
双引号,
判断基于时间的盲注:在上面的基础上,加个sleep函数 ,如sleep(5) (函数不同数据库有所不同)例子: ' and sleep(5) " and sleep(5)
绕过登录
注释 select * from users where username='123' or 1=1 #' and password='123' or 1=1 #'
select * from users where username='123' or 1=1
判断字段数
用union联合查询
order by查询
查询库名
版本大于5.0的mysql的information_schema库中存储着mysql的所有数据库和表结构信息,所以可以利用information_schema库快速注入。
通过下面的语句可以判断数据库版本
and ord(mid(version(),1,1))>51
51是ASCII码3 正确则>4.0 错误则<4.0,当版本大于3.0时才能使用union方法;
ord()是mysql的函数用于获取二进制码;
mid()是mysql的函数用于截位操作;
version()是mysql的函数用于获取当前数据库的版本;
database()查询得到数据库名
mysql的数据库information_schema,他是系统数据库,安装完就有,记录是当前数据库的数据库,表,列,用户权限等信息,下面说一下常用的几个表
SCHEMATA表:储存mysql所有数据库的基本信息,包括数据库名,编码类型路径等,show databases的结果取之此表。
TABLES表:储存mysql中的表信息,(当然也有数据库名这一列,这样才能找到哪个数据库有哪些表嘛)包括这个表是基本表还是系统表,数据库的引擎是什么,表有多少行,创建时间,最后更新时间等。show tables from schemaname的结果取之此表
COLUMNS表:提供了表中的列信息,(当然也有数据库名和表名称这两列)详细表述了某张表的所有列以及每个列的信息,包括该列是那个表中的第几列,列的数据类型,列的编码类型,列的权限,猎德注释等。是show columns from schemaname.tablename的结果取之此表。
网友评论