SQL注入基础

SQL注入的原理和分类:

  SQL注入就是指web应用程序对用户输入数据的合法性没有判断,前端传入后端的参数是攻击者可控的,并且参数带入数据库查询。攻击者可以构造不同的SQL语句来实现对数据库的操作。

  SQL注入按照请求方式分类可以分为字符型注入、数字型注入搜索型注入,按照提交方式分类可以分为GET型注入、POST型注入、Cookie型注入HTTP请求头注入,按照执行效果分类可以分为大致分为联合查询注入、报错型注入、盲注(bool、时间)、堆查询注入……

  一次完整的SQL查询过程应该为:1、用户向前端输入参数。2、前端按照用户提交的参数对数据库中的数据进行查询3、数据库返回查询结果。4、后台数据处理给前端,返回给用户

 

注入点的判断:

  假如一个SQL查询语句为:  $query = "select * from users where id = $_GET['id']";

  正常用户提交的数据应该为id=1,但是攻击者提交的参数将构造成新的SQL语句。

  当传入的参数为id=1'时,数据库执行的代码如下所示:

  select * from users where id = 1'  这时候的语句不符合数据库的语法规范,所以返回给用户的信息是报错。

  当传入的参数为id=1 and 1=1时,数据库执行的代码如下:

  select * from users where id = 1 and 1=1  因为id=1为真且1=1为真,所以页面返回的结果与id=1返回的结果是相同的。

  攻击者根据上面的返回结果已经知道了网站中存在SQL注入,接下来将进一步拼接SQL语句连接数据库,爆出自己想要的数据。

 

 

SQL注入之前首先需要知道的知识点:

  MySQL中的几种注释:

  1、"#"(url编码为%23)

  2、"--"(--后面要跟上一个或多个空格,在url中常使用"--+"来当做注释使用)

  3、"/*……*/"(在绕过WAF等网站的安全机制时,常使用/**/来代替空格)

  4、"/*!……*/"(内敛注释,其注释的内容将会被执行)

  注:"#"在URL中会被认为是锚点,想要使用需要进行编码。

    "+"在URL中会被认为是空格

 

SQL注入中经常使用的函数:

  user():当前连接数据库的用户。

  database():当前连接的数据库名称

  version():当前数据库的版本信息

  @@datadir:数据库文件存放的目录

  .@@version_compile_os:当前使用的操作系统

 

连接字符串的函数:

  concat(str1,str2……):没有分隔符的连接字符串。

  concat_ws(separator,str1,str2……):该函数第一个参数是其他参数的分隔符,分隔符在连接字符串之间加入。

  group_concat(str1,str2……):将多行查询的结果以逗号为分隔符连接成为一行结果。

 

INFORMATION_SCHEMA库:

   在MySQL5.0版本之后,MySQL默认在数据库中存放一个名为“information_schema”的数据库,在这个数据库中我们需要记住三个表:SCHEMATA、TABLES、COLUNMNS

  SCHEMATA表存储该用户创建的所有数据库的库名,该表中记录数据库的字段名为SCHEMATA_NAME

  查询所有数据库名:select SCHEMA_NAME from INFORMATION_SCEMA.SCHEMATA

  TABLES表中存储该用户创建的所有数据库的库名和表名,该表中记录数据库名的字段名为TABLE_SCHEMA,记录表名的字段名为TABLE_NAME

  查询指定数据库(test)中所有的表名:select TABLE_NAME from INFROMATION_SHEMA.TABLES where TABLE_SCHEMA='test'

  COLUMNS表中存储该用户创建的所有数据库的库名、表名和字段名,该表中记录数据库名的字段名为TABLE_SCHEMA,记录表名的字段名为TABLE_NAME,记录字段名的字段名为COLUMN_NAME

  查询指定数据库(test)中指定数据表(admin)的所有字段名:select COLUMN_NAME from INFORMATION_SCHEMATA.COLUMNS where TABLE_SCHEMA='test' and TABLE_NAME='admin

 

posted @ 2020-04-10 22:16  屈大帅  阅读(182)  评论(0)    收藏  举报