本文共 1872 字,大约阅读时间需要 6 分钟。
1、本题题目告诉我们这是一个单引号注入的关卡。先输入一个正常的值和一个包含单引号的值看有什么区别。
(这里是利用了题目之便,正常来说在不知道注入类型的情况下要将所有可能的注入类型都试一遍,如单引号、双引号、斜杠等等。) 2、可以看到出现了报错语句,根据语句分析得知是 1 后面的单引号引起的报错(分析方法:将报错的查询部分最外层的单引号去掉,如本关卡可还原为 ‘1’’ LIMIT 0,1,很明显多了一个单引号),我们分析得出原语句类型为(只是类型):select * from table_name where id = '$id' limit 0,1
3、既然分析出语句类型,我们就可以看到,当我们在 id’ 后输入任意语句都将被插入到查询语句中进行执行。那么我们进行一个小小的验证试验。
4、这里利用了mysql中的order by语句。Order by 语句后面跟一个数的时候表示对该列数据进行排序,也就是说现在查询语句变成了:select * from table_name where id = '$id' order by 3 --+ ' limit 0,1
我们利用 --+ (其中 – 为注释符,+ 表示空格)将后面的语句进行了注释,使其无法发挥作用,这样我们就可以得到不止一个返回结果了。与此同时我们还发现我们的自定义语句起到了作用,当 order by 4 时界面返回了错误,说明表中不存在第四列数据,即该表只有三列数据。
5、在得知该表只有三列数据后我们就要思考一个问题,显示界面只有两个数据,而表中共有三列数据,那么究竟是哪两列数据被显示了出来?为此我们要进行探测。我们首先找到一个没有数据回显的id,这说明id=0时,表中不存在数据,接着我们利用 union 语句将1,2,3拼接在该表末尾。(UNION 操作符用于合并两个或多个 SELECT 语句的结果集。请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。)
6、由上述探测我们可以得出表中第2、3列数据被回显的结论。接下来就是获取我们想要的信息时间了。 (1)先利用group_concat()函数将当前数据库中表信息回显出来(Group_concat 主要将属于同一类的元素归类,通常以group by为分类依据,若group by不存在,则所有数据归为一行)?id=0' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+(2)查看上图中users表中列信息。
?id=0' union select 1,group_concat(column_name),3 from information_schema.columns where table_name="users" --+(3)将username列和password列中信息回显。(0x3a 表示冒号)
?id=0' union select 1,group_concat(username,0x3a,password),3 from users --+
附:Information_schema
(1)Schemata 表:提供当前mysql实例中所有数据库信息,show databases结果来源
(2)Tables 表:提供了关于数据库中表的信息,详细说明某个表属于哪个schema,表类型,表引擎,创建时间等信息。 是show tables from schemaname结果来源。
(3)Columns 表:提供了表中列的信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果来源。
(4)Statistics表:提供关于表索引的信息。Show index from schemaname.tablename 结果来源。
(5)user_privileges表:给出了关于全程权限的信息。
SQL注入漏洞大致原理为,后台查询语句未对传入数据进行检验过滤,造成传入数据对原查询语句进行修改,从而导致数据库信息通过各种可返回信息(如回显)被攻击者获取。因此,后台查询语句对传入数据的过滤至关重要。
转载地址:http://gcuzi.baihongyu.com/