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

浙公网安备 33010602011771号