联合查询输入
联合查询注入 来自:sechub
1.判断注入点
我们可能存在SQL注入变量的后边添加以下payload:
- and 1=1 / and 1=2 回显页面不同(整型判断)
- 单引号判断’显示数据库错误信息或者页面回显不同(整型,字符串类型判断)
- \ (转义符)
- -1 / +1 回显下一个或上一个页面 (整型判断)
注:加号’+’在URL中有特殊含义,因此在需要对其进行URL编码为%2b
2.判断是整型注入还是字符型注入
数字型与字符型的最大区别在于:
数字类型不需要引号闭合,而字符类型需要使用引号闭合。
数字型:
select * from table where id = 1; |
字符型:
select * from table where username = 'admin'; |
3.根据不同的分类进行注入
根据SQL注入语法分类:
- UNION query SQL injection(可联合查询注入)
- Error-based SQL injection(报错型注入)
- Boolean-based blind SQL injection(基于布尔型注入)
- Time-based blind SQL injection(基于时间延迟注入)
- Stacked queries SQL injection(可多语句查询注入)
3.1 MySQL中UNION使用规则
UNION的作用时间俩个或多个select语句查询结果合并起来
- UNION必须由俩条或俩条以上的select语句组成,语句之间用UNION分隔
- UNION中的每个查询的列数必须相同
- UNION会从查询结果集中自动去除重复行
3.2 判断查询列数
order by 函数是对MySQL中查询结果按照制定字段名进行排序,除了指定字段名还可以指定字段的栏位进行排序,第一个查询字段位1,第二个位2,以此类推,我们可以通过二分猜解列数。
例:
order by 1
order by 20
order by 10
3.3 获取所有数据库名
group_concat()一次性显示:
select group_concat(SCHEMA_NAME) from information_schema.SCHEMATA |
limit逐一显示:
select count(SCHEMA_NAME) FROM information_schema.schemata #查询数据库个数 |
3.4 获取数据库(test)所有表名
group_concat()一次性显示:
select group_concat(TABLE_NAME) from information_schema.TABLES where table_schema='test'; |
limi 逐一显示
select count(TABLE_NAME) from information_schema.TABLES where table_schema='test'; |
4.联合查询
前提条件:页面上有显示位
什么是显示位?
在一个网站的正常页面,服务端执行SQL语句查询数据库中的数据,客户端将数据展示在页面中,这个展示数据的位置就叫显示位
5.过程
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 You_zip!