文章目录
- 1、SQL注入原理
- 2、SQL注入的原因
- 3、SQL注入的危害
- 4、SQL注入基础
-
- [4.1 MySQL相关](#4.1 MySQL相关)
- [4.2 SQL注入流程:](#4.2 SQL注入流程:)
- 5、联合注入实例基本步骤
- 6、总结
1、SQL注入原理
SQL注入(Sql Injection)就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
2、SQL注入的原因
- 程序编写者在处理程序和数据库交互时,使用字符串拼接的方式构造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
6、总结
sql注入的基本流程:
- 寻找传参页面;
- 判断是否存在注入点;
- 字符型注入?
- 数字型注入?
- 判断字段的数量;
- 判断字段回显的位置;
- 查找数据库名、表名、字段名、字段内容;
- 登录后台。