标题: CTF Web SQL注入 10000字详解 [打印本页] 作者: 农妇山泉一亩田 时间: 2024-9-3 09:02 标题: CTF Web SQL注入 10000字详解 涉及的数据库知识
union
团结查询:将两条SQL语句的结果一起输出
语法:select语句1 union select语句2
使用条件:前后两个语句的查询结果的字段数相同
order by
结果排序:该函数本来用于将查询结果排序
语法:select * from table_name order by column_name
通过order by遍历字段序号可以得到原有查询语句输出结果有几个字段
database()
输出当前数据库的库名
information_schema
information_schema为体系自带的数据库
里面有一个tables表,该表存放着数据库和数据表的关联,其中table_schema为存储数据库名的字段,table_name为存储表名的字段
select table_name from information_schema.tables where table_schema=database()会输出当前数据库中的所有表名
另有一个columns表,该表存放着数据表和字段的关联,使用该表查询某表中有哪些字段时,需要同时指定是哪个数据的哪个表
select column_name from information_schema.columns where table_name='admin'and table_schema=database()会输出指定命据表中的所有字段名
limit
用于分页
语法:select * from table_name limit n,m;
n表示从第n行开始,m表示取m条数据
--空格解释
碰到引号如 select * from user where id='$id'
可以先将前面的引号闭合,再将背面的引号用 -- qwe解释掉
比方如下的payload
2' union select 1,table_name,3 from information_schema.tables where table_schema=database() -- qwe
复制代码
此处的qwe只是为了演示出–背面的空格,并无现实意义
replace
用于更换字符串
语法:REPLACE (String,from_str,to_str)
将String中所有出现的from_str更换为to_str
into outfile
SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中,常用于创建表的备份复件或者用于对记录进行存档。
在 SELECT 查询语句中使用 INTO OUTFILE 参数可以将查询结果保存到文本文件中。
语法:SELECT ... INTO OUTFILE 'file_name'
如果题目条件允许,可以实行show variables like '%secure_file_priv%'来查看允许导出结果的目录,MySQL服务只允许在这个目录中实行文件的导入和导出操作。
like
LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式
现在,我们希望从上面的 “Persons” 表中选取居住在以 “N” 开始的城市里的人:
我们可以使用下面的 SELECT 语句:
SELECT * FROM Persons
WHERE City LIKE 'N%'
复制代码
提示:% 可用于定义通配符(模式中缺少的字母)
常见通配符:% 表示可有零个或多个恣意字符; _ 表示需要一个恣意字符;
GROUP BY
GROUP BY 语句用于联合聚合函数(如 COUNT()、MAX() 等),根据一个或多个列对结果集进行分组。
GROUP BY 可以共同聚合函数一起使用,通过使用聚合函数,在分组之后可以对组内结果进行计数(COUNT)、求和(SUM),求均匀数(AVG)操作等。
GROUP BY会先按照指定字段的值是否相同来将数据分组
更加具体的介绍可以看下面这篇:
GROUP BY与COUNT用法详解_group by count_鲲鹏之上的博客-CSDN博客
HAVING
HAVING 子句可以筛选通过 GROUP BY 分组且聚合后的各组数据。
聚合函数(avg、sum、max、min、count),不能作为条件放在where之后,但可以放在having之后
GROUP BY、HAVING、WHERE之间的关系
在语句的位置上,where在group by前, having在group by 之后
在实行顺序上,以下面这个SQL语句为例
select city ,count(*) as num from staff where age> 19 group by city having num >= 3;
正常输入可能是 alice,查询为 SELECT * FROM users WHERE username = 'alice'。如果输入是 '; DROP TABLE users; --,那么查询就酿成了 SELECT * FROM users WHERE username = ''; DROP TABLE users; --',这会尝试删除整个 users 表。
搜索型注入
搜索型注入通常出现在搜索功能中,特别是当查询设计成模糊匹配用户输入时。比方:
SELECT * FROM products WHERE name LIKE '%[input]%'
复制代码
这种环境我们仍然可以只闭合前面的引号
Insert/update/delete注入
当页面中存在修改账号信息、注册账号、删除账号等操作时,究竟上就是存在插入、修改数据库数据的操作
insert型注入相关的sql语句形式 INSERT INTO table_name VALUES (值1, 值2,....)或者INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
update型注入相关的sql语句形式: UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
delete型注入相关的sql语句形式:DELETE FROM 表名称 WHERE 列名称 = 值
这些类型的注入点由于没有select语句,以是适合使用
HEADER注入
HEADER注入通过修改请求报文中的请求头部(head)来进行注入。
PHP中通常使用**$_SERVER**数组来网络请求头信息
手动HEAD注入可以使用burpsuite工具进行抓包
Order By注入