一, 第一次见面
1. 初识
http://localhost/Less-1/
提示输入 id, 因此访问 http://localhost/Less-1/?id=1
可以继续测试 id=2.3.4 等的情况, 会输出不同的用户名和密码
2. 进一步了解
每一次都会有不同的账号密码出来, 当然肯定不能这样简单的访问.
既然题目说了存在单引号的错误, 那就来试一下 http://localhost/Less-1/?id='
没毛病报错了, 说明单引号会被算入 sql 语句中
假设一下, 这个 sql 语句是这样构造的:
$sql = "SELECT * FROM USER WHERE `id` ='$_GET["id"]' LIMIT 0,1;
如果我们的假设成立, 那只要将单引号补全, 然后就可以在后面添加自己的查找条件了, 试一下.
只返回一条数据, 很气人, 可能只显示查询结果的第一条数据.
尝试一下永真式, 1=1,'1'='1'等.
关键的步骤是我们闭合自带的单引号并且在后面添加自己的语句, 注释掉后面没用的语句.
对于注释我们使用
1. 编码过的 #也就是 #, 因为 #在 html 中是锚的意思, 可以理解为标签, 所以不会自动编码, 需要手动编码
2.-- 与空格, 但是空格在 url 中会被屏蔽, 所以使用 + 代替, 也就是 --+ 或者 --
二, 动点小心思
1. 我们想要一次性取出多个用户名和密码
所以构造 http://localhost/Less-1/?id=1' or id=2 --+
但是我们发现只会返回一个用户名, 所以我们猜测这里只会返回搜索到的所有结果的第一条 (后来通过查看源码可以知道, 真的是这样)
那么我们想, 如果第一个结果数据为空, 那么是不是就可以返回我们想要的第二条数据.
所以构造 http://localhost/Less-1/?id=-1' or id=2 --+
果真返回了第二条数据.
如何查看这个 user 表中有几列呢? 不知道列名.
我们通过排序, 按照某一列排序, 如果报错说明没有这一列
http://localhost/Less-1//?id=1' order by 4 #
当按第四列排序时候出错, 所以只有三列
可以看到只有第 2 列和第 3 列的结果显示在页面上, 我们只有 2,3 可以用, 接下来我们就利用 2,3 来查询数据库的信息
但是我们需要一次性获取多个用户名和密码, 那么久用到了 group_concat 函数, 该函数返回一个字符串结果, 该结果由分组中的值连接组合而成.
意思就是说, 一次只返回一个字符串的话, 我们可以用这个函数把很多个结果合并成一个字符串一次性输出
构造 http://localhost/Less-1/?id=-1' union select 1,group_concat(char(32),username,char(32)),group_concat(char(32),password,char(32)) from users --+
成功一次性返回所有的用户名和密码.
3. 有点太好奇
我们还是不满足, 我们还想知道这个数据库名, 用户名, 数据库版本信息, 那怎么办?
concat_ws(): 从数据库里取 N 个字段, 然后组合到一起用符号分割显示, 第一个参数剩余参数间的分隔符
char(): 将十进制 ASCII 码转化成字符
user(): 返回当前数据库连接使用的用户
database(): 返回当前数据库连接使用的数据库
version(): 返回当前数据库的版本
虽然不太会 sql 语句, 但是看他列出的几个重要函数, 大体的意思也就有了, 看样子想要通过 concat_ws() 函数一次性取出多个数据然后合并成一条数据传出来破解对传出数据条数的限制. 要获取的重要数据有数据库用户名, 数据库名, 数据库版本...
构建 http://localhost/Less-1/?id=-1' union select 1,2,(concat_ws(char(32,58,32),user(),database(),version())) #
数据库的一些基本信息就出来了, 用户 root, 数据库名 security.
三, 不知羞耻, 竟想看穿所有?
我们满足吗?
不满足!!
我们想要知道所有的信息, 所有的库名, 表名, 列名等等...
先来学习一下
首先说一下 mysql 的数据库 information_schema, 他是系统数据库, 安装完就有, 记录是当前数据库的数据库, 表, 列, 用户权限等信息, 下面说一下常用的几个表:
SCHEMATA 表: 储存 mysql 所有数据库的基本信息, 包括数据库名, 编码类型路径等, show databases 的结果取之此表.
TABLES 表
来源: https://www.cnblogs.com/Mountain2/p/8878000.html