vlambda博客
学习文章列表

SQL注入攻击-盲注(一)

在学习本章前,建议先对前序章节进行了解,传送门如下:



本章节结合靶场试验来介绍如何在无回显的情况下进行盲注。

 

什么是SQL盲注?
当应用程序具有SQL注入漏洞,但其HTTP响应不包含任何SQL查询的结果或任何数据库错误时,即没有任何回显信息,此时的SQL注入攻击我们就称为SQL盲注。
对于SQL盲注,UNION攻击等许多技术都无效,因为这些技术都依赖于能够在应用程序的响应中看到注入查询结果。
但我们仍然可以利用SQL盲注来访问未经授权的数据,但必须使用不同的技术。
 

盲注的技术手段
根据漏洞的性质和所涉及的数据库,可以利用以下几种技术手段进行SQL盲注:
●通过更改查询的逻辑,根据单个条件的真实性触发应用程序响应中可检测到的差异。这种方法可能涉及将新条件注入某些布尔逻辑,或有条件地触发错误,例如被零除。
●通过有条件地触发查询处理的时间延迟,从而根据应用程序响应所需的时间来推断条件的真实性。
●通过使用OAST技术触发带外网络交互。这种技术非常强大,可以在其他技术不具备的情况下工作。通常,我们可以通过带外通道直接泄露数据,例如将数据放入我们所控制域的DNS查找中。
 

通过条件触发响应来进行盲注
条件触发的意思是我们在原本查询的语句中人为增设一个“与”的条件,通过响应是否异常来判断这条所增设条件的真假。
比如现在有一个使用跟踪cookie的应用程序,对应用程序的请求包括这样cookie标头:
当处理包含cookie的请求时,应用程序会使用如下SQL查询来确定这是否是已知用户:
SQL注入攻击-盲注(一)
这个查询虽然具有SQL注入漏洞,但查询的结果不会返回给用户。
只是根据不同查询结果,应用程序会有不同的行为,如果用户已验证存在,则页面内会显示“欢迎回来”的消息。
虽然没有回显,但这种行为可以被SQL盲注利用,通过有条件地触发不同响应来检索信息。假设我们在前面那个查询语句后分别注入两个包含下面条件的请求:
SQL注入攻击-盲注(一)
第一个会导致查询返回结果为真,因为注入的AND'1'='1条件为真,因此将会显示“欢迎回来”的消息。
而第二个会导致查询返回结果为假,因为注入的条件AND'1'='2是假的,因此不会显示“欢迎回来”的消息。
我们可以通过这种方式,不断地注入单个条件,通过返回真假,来判断所注入条件的真假,从而每次提取以为数据。
例如,现在有一个名为"Users"的表,其中包含"Username""Password",以及一个名为"Administrator"的用户。
我们可以利用条件触发通过发送一系列的输入以一次一个字符地测试,来确定该用户的密码。
为此,我们最先请求:
  
    
    
  
xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1)> 'm
如果返回“欢迎回来”的消息,那么表示我们注入的条件为真,因此密码的第一个字符大于m
接下来,我们继续发送以下请求:
  
    
    
  
xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1)> 't
如果不返回“欢迎回来”的消息,那么表示我们注入的条件为假,因此密码的第一个字符不大于t,结合第一个条件,那么这个字符位于mt之间。
重复上面的判断步骤,直到将范围缩小到1~2个字符,最终我们发送以下请求:
  
    
    
  
xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1)= 's
应用程序返回“欢迎回来”的消息,从而确认密码的第一个字符是s
随后我们可以继续这个过程进一步猜测第二个,第三个……直到确定管理员用户的完整密码。
上面这种方法也称为基于布尔的盲注,当时,在猜测一个字段串每个字段内容前,我们通常先需要判定一下这个字段串的长度,也是利用同样的方法。
 

场景试验:
https://portswigger.net/web-security/sql-injection/blind/lab-conditional-responses
场景说明:
这个场景包含SQL注入漏洞,这个应用程序使用跟踪cookie进行分析,并执行包含提交cookie值的SQL查询。这个应用不返回SQL查询结果,也不显示错误信息,但如果查询返回成功的话,会在页面中包含“欢迎回来”的消息。
这个数据库包含一个users的表,其中包含名为usernamepassword的列,我们需要利用SQL盲注漏洞找出管理员用户的密码。
试验目的:
要完成这个试验,需要以管理员身份登录。
攻击过程:
点击页面中产品类别,可以发现在首页会出现"Welcome back"
SQL注入攻击-盲注(一)
通过抓取响应包,检索这个关键字,也能查到
SQL注入攻击-盲注(一)
接下来我们可以将这个关键字铆钉为判断依据,只要能够出现"Welcome"则说明条件为真。
 
在Burp Suite中将前面这个请求包发送给Repeater,因为攻击尝试过程比较繁琐,因此不再用阻断模式每次进行刷新
SQL注入攻击-盲注(一)
 
构造Payload判定注入点是否存在,根据试验提示,注入点在cookie后面
  
    
    
  
'AND '1'='1
SQL注入攻击-盲注(一)

发现响应为真
SQL注入攻击-盲注(一)
将注入Payload更改成
  
    
    
  
' AND '1'='2
SQL注入攻击-盲注(一)
会发现响应为假,响应包没包含"Welcome"关键字
SQL注入攻击-盲注(一)
后续我们都通过上面两张响应来判定我们注入条件的真假。
 
判定是否存在"users"表
' AND (SELECT 'a' FROM users LIMIT 1)='a
响应为真,说明users表存在。 

判定是否存在"administrator"用户
' AND (SELECT 'a' FROM users WHERE username='administrator')='a
响应为真,说明当前用户存在。
 
猜测administrator的密码长度,在猜测每个字符之前,我们先要把密码长度确定下来,可以通过下面的注入语句,可以采用二分法来缩小范围
' AND (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>10)='a
响应为真,说明密码长度是大于10的,我们继续将密码长度调整到20
' AND (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>20)='a
这时发现响应为假了,说明密码长度在10和20之间,继续调整数值到15……最终通过二分法可以确定密码长度为20。
 
接下来就是猜测每一位密码了,注入语句的基本格式如下
  
    
    
  
' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='administrator')='a
SUBSRING 这部分的意思就是从passoword的第一位开始取,取1位,如果我们要取第二位的话,括号内就是 (password,2,1) ,同时将取出来的与后面的字符进行比较。
这里只是与'a'进行了比较,但我们要与26个大小写字母、数字、特殊字符每个都要比较,而且要对比20位,工作量很大,通过手动的方式几乎不可能完成。
因此我们要利用BurpSuite的自动化工具来完成,将上面的这个请求发送到"Intruder"
SQL注入攻击-盲注(一)
 
消除所有变量
SQL注入攻击-盲注(一)
 
将a设置为自动变量
SQL注入攻击-盲注(一)
 
设置变量自动攻击范围
SQL注入攻击-盲注(一)
 
同时需要设置从响应包中抓取关键字来判断条件为真
SQL注入攻击-盲注(一)
 
随后开始自动攻击
SQL注入攻击-盲注(一)
 
从攻击结果中,获取第一位的密码为"n"
SQL注入攻击-盲注(一)
 
修改注入语句,直到获取全部20位密码
  
    
    
  
' AND (SELECT SUBSTRING(password,2,1) FROM users WHERE username='administrator')='a ' AND (SELECT SUBSTRING(password,3,1) FROM users WHERE username='administrator')='a ……
 
利用获取的密码用administrator登录,即可完成本次试验。
 

:上面这种方法需要设置20次范围攻击,操作上有个优化更简便的方法,就是将攻击方式修改成"Cluster bomb",前面SUBSTRING内的数字也设置成变量
SQL注入攻击-盲注(一)
 
随后在Payload设置的地方,就会有两个变量设置的地方,将第一个变量的设置范围调整为1至20,其他不用改变,随后进行攻击即可
SQL注入攻击-盲注(一)
 
攻击结果如下,一次就可以把所有位密码都爆破出来
 
/



/ /
/ /