前言
在发现SQL注入的缺陷之后,我们能够如何加以利用呢?这篇文章将向大家介绍SQL注入的攻击技巧,正是时候让我们来感受一下漏洞攻击的乐趣所在。

第三节 利用SQL注入3.1、识别数据库
若意图实施SQL注入攻击,首先需掌握所使用系统的数据库信息,否则将无法成功获取关键数据。
首先从Web应用技术上就给我们提供了判断的线索:
ASP和.NET: SQL
Java:、MySQL
Web容器为我们提供了重要信息,例如,若部署了IIS作为服务器架构,那么后台存储的数据很可能采用SQL数据库;至于那些支持PHP的Linux服务器,它们很可能采用开源数据库,如MySQL等。
基于错误识别数据库
通常,仅需查看一条详尽的错误提示,便可以确定后台所采用的数据库类型。以我们的事例为例,只需在数据库名称周围添加单引号即可进行判断。
[SQL]
SQL语法存在错误;请查阅与您MySQL服务器版本相对应的手册,以获取正确的语法用法;错误出现在第1行,靠近“'”符号。
从错误信息中,我们就可以发现是MySQL。
[SQL]
Microsoft的OLE DB驱动程序在处理ODBC时遇到了错误代码为'80040e14'的问题。
Microsoft ODBC SQL Server驱动程序提示:第1行信息
通过分析上述错误信息,我们可以识别出其属于SQL范畴。若错误信息以“ORA”开头,则可推断数据库类型,这个过程相当直观,原理类似,故无需逐一详述。
基于数字函数推断
这里以我们搭建的环境为例来做推断:
不论其数值如何,基本上都视为正值,即表示为真;具体用法可自行在百度上搜索,此处并无特定语句;在默认情况下,结果为零,即表示为假。
若数据返回正常且未获取到额外信息,则可判断该系统为MySQL数据库。

3.2、UINON语句提取数据
UNION运算符能够将两个或更多查询的输出结果进行整合,其基本语法结构表述如下:
[SQL]
从table-1表中选取列1和列2的数据。
UNION
从table-2表中选取列1和列2的数据。
一旦应用提供了首次查询的结果,我们便能在首次查询结果之后插入一个UNION运算符,进而加入另一个任意查询以获取信息,这难道不是相当简单吗?当然,在运用UNION之前,我们必须确保满足
两个条件:
首先,我需审视第一个条件。那么,如何确定首次查询的列数呢?我们可以尝试使用NULL值,因为NULL可以被转换为任何数据类型,所以第二个条件我们可以暂时忽略。

就是这样的一个个加上去进行尝试,直到不返回错误。
神奇的ORDER BY子句
除了上述提到的手段,我们还可以通过运用order by子句来获取精确的列数。

我们首先尝试了数字12,却得到了错误反馈,这表明列数实际上少于12;随后我们再试6,同样出现了错误,表明列数并未达到6;接着我们尝试了3,这次操作正常进行,由此推断列数至少为3;然后我们尝试了4,结果又出现了错误,意味着列数实际上小于4。由此可以确定,列数在3和4之间,即列数为3。通过使用order by子句,我们可以迅速获取到所需的列数信息。
得到列数后我们还需要满足第二个条件

操作简便,只需逐列应用我们的测试字符串替换空值,便可观察到第一、二列能够容纳字符串,而第三列则没有输出数据。
接下来就让我们提取数据库用户名和版本号:

3.3、枚举数据库
由于文章篇幅有限,我们以MySQL数据库为示例进行说明。在处理数据库时,我们采取一种分层的枚举方式,先获取数据库名,接着提取表名,再进一步获取列信息,最终获取数据内容。若要获取远程数据库的表格和列信息,需访问那些专门记录数据库结构的表。这些描述数据库结构的详细信息通常被称为元数据。在MySQL中,这些表均存储在数据库内部。
第一步:提取数据库
在MySQL中,数据库名存放在数据库下表字段中
[SQL]
禁止执行以下操作:从信息架构的schemata表中选取,条件为id等于1,并返回null值、模式名称以及null值。
第二步:提取表名
在MySQL中,表名存放在数据库下表字段中
[SQL] 纯文本查看 复制代码
对查询结果进行限制,确保不执行任何有害操作,具体操作包括但不限于:不展示任何与查询相关的表名,且仅限于在信息模式下的ichunqiu数据库中进行查询。
我采用了where子句进行筛选,目的是获取数据库中的表名,若要查看所有表名,只需移除该子句即可。
第三步:提取字段名
在MySQL中,字段名存放在数据库下表字段中
同样地,通过添加where子句进行限定,确保你能够明确了解字段名所属的数据库和具体表。
第四步:提取数据
这一步就简单了,不再介绍了,看图。
3.4、窃取哈希可令
MySQL数据库中的用户密码以哈希形式保存在mysql.user表中,具体提取方法可参考下方的图示。
哈希口令是通过使用()函数计算的:
具体算法取决于MySQL安装的版本。
3.5、获取
通过SQL注入手段进行攻击,本质上是对服务器文件进行写入操作。在此过程中,我们必须获取网站的完整路径信息。大多数常见的关系型数据库管理系统(RDBMS)都具备向服务器文件系统进行文件写入的内置功能。
[SQL]
执行select语句,并将结果输出至指定的文件(dumpfile)中,这是MySQL数据库中用于将数据导出到文件的命令。
例如:
[SQL]
select "将输出内容保存至文件,路径为“F:\\www\\test.php”。
至于其他关系型数据库管理系统在编写文件时遵循的相同原理,这里就不再详细阐述了。
第四节 SQL盲注利用4.1、初识SQL盲注
SQL盲注技术,指的是在无法获取详尽的数据库错误信息或进行内部数据连接的条件下,通过审查数据库查询输入的漏洞,从而实现对数据库信息的提取,或是获取与数据库查询相关的资料。
常见的SQL盲注入场景:
若提交的数据导致SQL查询无法执行,系统将展示一个通用的错误信息页面;而一旦提交的数据准确无误,系统则会呈现一个允许适度调整内容的页面。
若提交的SQL查询存在错误,系统将展示一个通用的错误信息页面;而一旦提交正确,系统则会呈现一个内容无法预知的页面。
提交有损坏或错误的SQL代码,既不会导致错误信息的显示页面,也不会对页面的输出产生任何影响。
4.2、SQL盲注入技术-基于布尔
在掌握了SQL的定义及其相关漏洞的注入情形之后,接下来我将带领大家深入探讨如何利用这些漏洞的技术细节。
我们首先提交了错误的SQL语句,目的是为了观察系统资源是否会显示一个通用的错误页面。


我们能控制页面的输出结果吗?
显然可以
[SQL]
id=1 and 1=1 True
id=1 and 1=2 False
怎么利用?
在介绍利用技巧之前我们先来介绍一个重要的SQL函数
[SQL] 纯文本查看 复制代码
SUBSTRING(str,pos,len)
当未提供len参数时,函数将根据字符串str从指定位置pos起始提取一段文本。若提供了len参数,则将返回长度为len的子串,同样从pos位置开始提取。遵循SQL标准语法,pos也可取负值。若如此,子串的起始位置将定位至从字符串末尾往回数pos个字符的位置,而非从pos个字符处开始。负的值可用于为pos在此函数中的任何形式的。
举例利用-获取数据的用户名
[SQL]
身份标识为1且用户名的首字符为字母'a'。
通过运用SUBSTRING()函数获取用户名的首位字符,判断其是否为字母a,若相符,页面将显示True,若不符,则显示False。

[SQL]
该ID等于1,且用户名的首字符为字母r。
若返回值为真,即页面显示正常,这表明用户名的首个字符为字母“r”。
这也就是基于布尔的SQL盲注入技术
4.3、SQL盲注入技术-基于时间
与基于布尔逻辑的SQL盲注技术实质上并无太大差别,它的工作原理是:当某个条件成立时,会使得系统响应暂时中断数秒,而若条件不成立,则不会引发任何暂停。
废话不多说看技巧利用。
[SQL]
禁止执行包含特定条件的查询语句,若用户名前四位为“root”,则执行延时操作,否则返回数字1,其余字段留空。
请注意应用union的限定条件,这一点之前已有说明。依照相同的原则,在提取用户名的前四个字符进行比对时,若判断准确,则将延迟时间设为4秒;若判断有误,则直接返回1。

4.4、我们的好朋友-
使用自动化注入获取用户名事例:

在MySQL中执行用户名的提取并执行比较时,系统默认不区分字母的大小写,因此我们将用户名中的大写字母去除。这一操作涉及的代码相对简单,故此处不予详细说明。
[]
import requests
def attack():
输出指令:“发起进攻”
该URL地址为http://www.isbase.com/sqlbool.php。
user标识为:“系统用户:”
zimu1 = range(33,65)
zimu2 = range(91,128)
zimu = zimu1 + zimu2
for l in range(1,16):
for i in zimu:
payload设定为"且用户名中从第l个字符开始取出的一个字符等于字符" + chr(i) + "所代表的字符"。
payload的值被设定为包含一个字符串,该字符串由数字'1'与payload本身拼接而成。
执行请求操作,获取指定URL的数据,其中携带了参数payload,结果赋值给变量r。
wenben = r.text
文本经过编码处理,转换成了“utf-8”格式。
result = wenben.find("jim")
if(result != -1):
user = user + chr(i)
print user
若当前模块直接被运行,而非作为其他模块的一部分被导入。
输出作者信息:作者名为zusheng。
输出文本:“bbs:ichunqiu.com”
attack()
print '[+]ok'
结束语
感激各位的厚爱,撰写的过程让我颇为自得,尽管如此,作品仍存瑕疵,期待未来能贡献更多优质内容。另外,尚有一篇高级篇目待续。请继续支持,我将竭尽全力提供更加详尽、深入的佳作。技术能力有限,若文中存在疏漏,敬请指正,不胜感激。
在此衷心感谢各位的厚爱,同时,我想对之前所存在的不足之处进行一番梳理。由于内容篇幅较长,虽然横向覆盖面足够,但深度和细节方面却有所欠缺。因此,我决定将这篇教程分为三个层次进行阐述,旨在兼顾深度与广度。尽管我并非技术领域的专家,如果在文中发现任何错误,还请不吝指正,我会及时进行修正。
最终,为了表达对读者的感激之情,我打算将我积累的网络安全与渗透测试相关实用资料无私分享,以此作为对每位读者的感谢,希望这些资料能对大家有所帮助。
干货主要有:
①2000多本网安必看电子书(主流和经典的书籍应该都有了)
②PHP标准库资料(最全中文版)
③项目源码(四五十个有趣且经典的练手项目及源码)
网络安全基础知识入门教程、Linux系统运维技能、网页安全防护以及渗透测试技巧的视频内容(特别适合初学者学习使用)。
⑤ 网络安全学习路线图(告别不入流的学习)
⑥ 渗透测试工具大全
2021年网络安全、Web安全及渗透测试工程师面试必备的全面指南
由于内容篇幅所限,相关资料均存于我的私人文档中,如需查阅,请关注我:通过私信回复“资料”即可获得网络安全面试所需资料、源码、学习笔记以及视频教程等内容。
最后,感谢您的关注和阅读!
扫一扫在手机端查看
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。


客服1