确认并利用 SQL 盲注漏洞

目录

一、相关知识与技能

二、实验内容:

三.原理剖析

四.补充

五.拓展

六.实验总结


一、相关知识与技能

1.sql介绍

SQL (Structured Query Language) 是具有数据操纵和数据定义等多种功能的数据库语言,这种语言具有交互性特点,能为用户提供极大的便利,数据库管理系统应充分利用SQL语言提高计算机应用系统的工作质量与效率。SQL语言不仅能独立应用于终端,还可以作为子语言为其他程序设计提供有效助力,该程序应用中,SQL可与其他程序语言一起优化程序功能,进而为用户提供更多更全面的信息


2.sql分类

SQl注入根据注入效果可以分为:UNION联合注入、报错注入、布尔盲注、时间盲注、堆叠注入、二次注入等,按照提交方式可以分为:GET注入、POST注入、HTTP头注入,以及其他分类。

UNION联合注入:联合注入的前提条件是用户可控参数所在Sql语句为查询语句,且以页面存在回显,如:select * from users where id=”$id”;。此时可以通过更改参数id来实现对数据库的操作。考虑到前提是查询双方具有相同的列,可以使用order by 语句大致判断列数,也可以使用select 1,2,3,4等依次查看。UNION联合注入往往是最实用的,因为判断了回显位后就可以拼接语句union select version()等获取数据库信息,当然如果权限允许也可以在information_schema中查看全部数据库信息。在查询过程中可能会遇到查询结果有多个数据,但页面只显示一段,可以使用concat()、group_concat()等函数。

布尔盲注:与UNION联合注入不同,布尔盲注用于页面无回显信息,但不同的语句会有不同的效果,如:id=1,页面显示登入成功,但当输入id=0(前提是数据库中没有id=0)时,页面显示登入失败或什么都不显示,此时就可以用布尔盲注来判断语句的真假。如id=0’ or length(database())>4 --+ 可以判断数据库的名称的长度,有了长度后就可以逐字符判断,如:id=0’ or substring(database(),1,1)=’s’--+表示判断从数据库名第一个字符开始截取一个字符判断是否是字符s。也可以构造一些特殊语句如:id=0’ord(substring(database(),1,1))=65 --+ ord函数可以将字符转换成ascii码,就可以将65设为变量,使用字典爆破的方法逐一判断,也可以直接爆破数据库名和其他表名、字段名等等。

时间盲注:时间盲注用于当输入不同的语句后页面效果一样的情况,时间盲注多与if(),sleep()函数使用,if(1=1,sleep(1),1)表明如果1=1,Sql查询休眠1秒,否则返回1,可以通过页面响应时间判断语句的正确。其他语句的拼接与布尔盲注一样。

报错注入:报错注入可用于Sql语句执行错误后页面会显示错误信息的情况,报错注入的前提条件是后端脚本中有mysql_error等报错函数。常见的报错方法有extractvalue()函数、updatexml()函数、floor型报错、整数溢出报错、几何函数报错等。在Mysql5.1.5版本以上,可以使用XPATH报错(extractvalue函数、updatexml函数),这两个函数用与查询修改xml文档,extractvalue()函数的使用extractvalue(xml文档,文档路径),文档路径的格式是/xx/xx/xx,若格式错误,会显示错误路径。如:id=0’or (select extractvalue(1,concat(‘!’,database()))) --+会显示(!数据库名)路径错误。floor型注入一般要与rand函数、group by一起使用。group by用于给查询数据分组,分组依据为by后面的语句,先创建虚拟表,然后在查询数据时,从数据库中取出数据,看在虚拟表中是否有同样的记录, 如果有,就在相应字段加一,如果没有就直接插入新记录。rand函数用于生成随机数,rand(0)表明生成一个0-1的随机数,但rand()确实是随机数,rand(0)生成的是有规律的随机数,floor函数用于向下取整,所以floor(rand(0)*2)只返回0或1,且为011011011…。查询中如果使用rand()的话,该值会被计算多次,也就是在使用group by 的时候,floor(rand(0)*2)会被执行一次,如果虚拟表中不存在记录,把数据插入虚拟表中时会再被执行一次。分析语句:select count(*) group by floor(rand(0)*2),查询前会建立虚拟表,取第一条记录,执行floor(rand(0*)2),发现结果是0(第一次计算),查询虚拟表,发现0的键值不存在,就会往虚拟表插入新的数据,则floor(rand(0)2)会被再计算一遍,结果为1(第二次计算),插入虚拟表,这时第一条记录查询完毕,查询第二条记录,再次计算floor(rand(0)*2),发现结果为1(第三次计算),查询虚拟表,发现1的键值存在(上图),所以floor(rand(0)*2)不会被计算第二次,直接count(*)+1,第二条记录查询完毕,查询第三条记录,再次计算floor(rand(0)2),发现结果为0(第四次计算),查询虚拟表,发现0的键值不存在,则虚拟表尝试插入一条新的数据,在插入数据时floor(rand(0)2)被再次计算,结果为1(第五次计算),然而1这个主键已经存在于虚拟表中,而新计算的值也为1(应为主键键值必须唯一),所以插入时直接报错了,于是在注入时就可以构造语句0' or (select count(*) from users group by concat(database(),floor(rand(0)*2)))--+爆出数据库信息。在版本号为5.5.47和5.7.17之间,Mysql有一些几何函数如geometrycollection(),multipoint(),polygon(),multipolygon(),linestring(),multilinestring(),这些函数对参数要求是形如(1 2,3 3,2 2 1)这样几何数据,如果不满足要求,则会报错,就可以构造语句:id = 1 and GeometryCollection((select from (select from(select database())a)b))获取数据库信息。根据官方文档说明,只有版本号大于5.5时整数溢出才会报错,在注入过程中不可能输入这么大的数,一般采用按位取反如:~0就表示最大整数值,~0+1就会产生报错信息。Sql语句执行成功的返回值为0,进行逻辑非运算后为1,这个值是可以参与运算的,我们就可以构造语句:id=0’or (select(~0+!(select * from (select database())a))) --+,此方式只适用于Mysql版本号小于5.5.53。整数溢出报错的另一种方式是利用exp函数,exp函数返回e的指定次幂,利用语句:(select exp(~(select * from (select database())a))) --+同样可以完成整数溢出报错。

堆叠注入:在SQL语句中,;代表一个语句的结束,如果在注入过程中注入;+语句,就可以执行构造的语句,堆叠注入的危害巨大,用户可以构造任何合法语句,包括但不限与删除数据,但一般服务器都会限制一次只能执行一条SQl语句。

二次注入:二次注入一般用于可以注册信息的场景,其原理是后端代码对用户上传的参数做了过滤,但是未对从数据库传出的数据进行过滤。分析语句:$username=addslashes($_GET[‘username’]);insert into users(‘username’,’password’) values $username,代码对username参数进行了过滤,也就是对‘进行了转义,如输入test’,实际SQL语句为test\‘,但如果从数据库中取出数据时未再次转义,就可以产生注入点。输入参数test’union select 1,2,version() --+,再从数据库中查询,语句变为:select * from user where username=’test’union select 1,2,version() --+’就可以获取数据库信息。

GET注入:提交数据的方式是 GET , 注入点的位置在 GET 参数部分,可以在url中看到参数名称,但url有长度限制,所以一般参数不能过长。

POST注入:使用 POST 方式提交数据,注入点位置在 POST 数据部分,多见于表单。

HTTP头注入:常见的HTTP头注入有COOKIE、HTTP_CLIENT_IP、HTTP_X_FORWARDED_FOR、HTTP_X_FORWARDED、HTTP_X_CLUSTER_CLIENT_IP、HTTP_FORWARDED_FOR、HTTP_FORWARDED、REMOTE_ADDR、User-agent、Referer。后端脚本从客户端发起的请求中获取cookie信息,并用于SQL语句中,如$_COOKIE函数。用burp suite抓包,修改cookie的值为1’union select 1,version(),3 --+,用于SQL语句中变为select * from user where id=’1’union select 1,version(),3 --+’,所以,从本质上来讲,Cookie注入与传统的SQL注入并无不同,两者都是针对数据库的注入,只是表现形式上略有不同罢了。HTTP_X_FORWARDED_FOR的注入也叫XFF注入,服务器端从HTTP_X_FORWARDED_FOR中获取参数(IP),并带入SQL语句中,可以通过burp suite抓包修改HTTP_X_FORWARDED_FOR头,构造目标SQL语句,其他的头注入也类似,关键在于后端脚本有无获取头信息并利用头信息的参数。


二、实验内容

登陆DVWA靶机,进入SQLInjection(Blind)盲注页面:

http://192.168.123.129/dvwa/vulnerabilities/sqli blind/)

1. 这个表单和上面的 sql 注入表单(SQL Injection)一模一样,输入1可以查看id为1的用户信息。

2.现在输入 1' 看看会不会像 sql 注入(SQL Injection)一样报错。

3.再输入 1'' 看一下。

4. 输入一个结果总是为假的参数试一下:输入 1’and‘1'='2。

1’and‘1'='2

5. 接着构造一个始终为真的参数:1' and '1'='1。

1' and '1'='1

6. 需要知道数据库的用户名,首先尝试一下这个语句:

1' and 1=char_length(current_user())and '1'='1

1' and 1=char_length(current_user())and '1'='1

7.找到 burp 中的这个请求,并发送到 Intruder 模块。

8.通过添加攻击参数来构造有效载荷。

9. 转到有效载荷(Payloads)内容,将有效载荷类型(Payload type)设置为 Numbers。

10. 将数值内容设置为 1-15,步数为 1。

11. 接着转到 Intruder 的 Options 选项卡,清除 Grep 匹配

(Grep-Match)列表,添加自己想要的回显字段,来快速查看攻击结果。

12.开始攻击(Start attack)按钮。

13.现在我们来猜解一下用户名的每个字符是什么。先猜测第一个,我们输入:1'and current_user LIKE’a%

14.%是 sql 语句中的通配符,它可以匹配任何字符串。我们这个语的意思是猜测第一个字母是不是同样的,我们把该请求发送到intruder 模块,将a设置为改变参数

15.我们的载荷列表是a-z,1-9,所合。 sl语中 select查不区分小写,所以省略了大写字母。

16.从结果中我们发现第一个字母是 d

17.下面继续猜测第二个字符,将输入参数改为1'and current_user LIKE ’da%

1'and current_user LIKE ’da%

18.现在我们的目标是d后面的字符。

19.开始攻击!可以从结果中看到第二个字符是 v

20.下面继续猜解后面的字符。在结果中你可能会发现%的结果总为 true,这是因为%是通配符

它可以和任意一个字符匹配到

最后我们测试出来的结果是 dvwa@%,最后一个%匹配的是空字符,所以用户名是 dvwa@

21.为了验证结果,我们把 like替换为=,提交

1'and current user0='dvwa@%

1'and current user0='dvwa@%

观察结果

结果显示我们找到了正确的用户名!


三.原理剖析

  在服务器端,sql 注入和 sql盲注是同类型的,都是为对输入内容不检测或查不充分导致
脏数据进入了数据库中。在基于错误的sql注入中,我们用服务器的错误显信息来查询表名、列名字而在 sql盲注中,我们需要通过一些问题语问数据库结果对错,例如用户名是否开头是 a?否有用户aa头?所以sql盲注一般花费的时间较多。
我们通过观察对错结果回显可以判断是否存在 sql盲注,接着可以判断想知道的内容的长度,然后判断每一个字符。这种方法显示是最有用的


四.补充

  Sql盲注攻击可以通过查找 DBMS、使用的版本信息。接使用特定于供应商的命来看用户是否具有管理权限来继续进行。如果是管理权限,就可以提取所有用户名和密码,激活远程连接,以及其
他许多事情。可以尝试的另一件事是使用工具自动化这种类型的攻击,例如 SQLMap,我们将在下一个教程中介绍它。


五.拓展

  还有一种盲注方法,名为 sql时间盲注。这种攻击中,我们不会知道命令是否被执行,只能通过一个 sleep0函数来观察回显时间,如果使用 sleep 函数后,返回变慢了。那么就说明请求被响应。这种攻击更加缓慢,所以一般通过 sqlminja 或者 sqlmap 这种自动化工具来实现。
可以查看下面这些链接学习更多 sql盲注的知识:

1.https://www.owasp.org/index.php/Blind SQL Injection
2.https://www.exploit-db.com/papers/13696/3. https://www.sans.org/reading-room/whitepapers/securecode/sql-injection-modes-attack-defence-matters-23
4.https://www.owasp.org/index.php/Blind SOL Injection


六.实验总结

1.SQL注入是一种常见的安全漏洞,通过该漏洞,攻击者可以通过正常的输入渠道执行恶意的SQL语句,从而获取、修改或删除数据库中的数据。
2.SOL注入可以分为两种类型:基于错误的注入和基于盲目的注入。基于错误的注入是指攻击者可以利用数据库错误消信来获取数据,而基于盲目的注入则是攻击者无法直接看到结果的注入。
3.在实验中,我使用了一些常用的SQL注入技术,如单引号闭合和UNION注入。在单引号闭合中,攻击者试图通过添加单引号来绕过输入验证。在UNION注入中,攻击者试图通过在SQL查询中添加UNION子句来获取其他表中的数据。
4.为了防止SQL注入攻击,我学到了以下一些防御措施:

使用参数化查询或预编译语句,可以将用户输入作为参数传递给SQL查询,而不是直接将用户输入拼接到SQL语句中

对用户输入进行输入验证和过滤,以确保输入的数据是合法的,并且没有恶意代码

限制数据库用户的权限,确保数据库用户只能执行必要的操作,并且不具有删除或修改数据库结构的权限

定期更新和修补数据库系统和应用程序中的安全漏洞

总的来说,SQL注入是一种严重的安全威胁,攻击者可以利用它来获取敏感信息、修改数据或破坏数据库。因此,加强对SQL注入漏洞的防范和修复是至关重要的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 要利用Wireshark追踪TCP流并提取SQL盲注信息,可以按照以下步骤: 1. 打开Wireshark,并开始捕获网络流量。 2. 使用过滤器过滤TCP流,以便只看到与SQL有关的流量。 3. 找到与SQL查询相关的数据包,并分析它们的内容。 4. 查找可能的SQL注入漏洞,比如错误消息或非预期的响应。 5. 手动尝试进行盲注攻击,并观察响应。 6. 如果成功进行了盲注攻击,则可以从响应中提取有用的信息,比如数据库架构或表名称。 需要注意的是,这只是基本步骤,并且在实际操作中可能会有一些变化。同时,在进行任何形式的网络攻击之前,请务必确保已经获得适当的授权。 ### 回答2: 使用Wireshark追踪TCP流后,可以通过以下步骤提取SQL盲注信息: 1. 打开Wireshark并开始抓取网络流量数据。 2. 使用过滤器来聚焦于特定的TCP流量,例如:`tcp.stream eq <stream number>`(stream number为TCP流的编号)。 3. 在Wireshark的窗口中选择相应的TCP流,右击并选择"Follow",然后选择"TCP Stream"。 4. 在弹出的对话框中,可以看到TCP流量的详细信息,包括请求和响应数据。 5. 在请求数据中,查找可能包含SQL注入的参数。常见的目标参数可能是URL参数或POST请求数据。 6. 检查请求数据中的参数值是否可被注入。如果参数值是通过用户输入传递的,且未进行合适的过滤和转义,那么很可能存在SQL注入的风险。 7. 在响应数据中,查找可能存在注入漏洞的迹象。通常,响应数据中会包含数据库错误信息或其他异常信息,这些信息可能会透露数据库的结构和查询结果。 8. 分析响应数据中的异常信息,尝试构造其他SQL语句进行进一步的注入测试。 9. 根据注入漏洞的特性和目标系统的不同,进一步测试可能包括盲注时间延迟测试或基于错误注入的测试等。 10. 根据分析结果,确认是否存在SQL注入漏洞并进行进一步的利用与测试。 总结来说,利用Wireshark追踪TCP流后提取SQL注入信息的关键是查看请求和响应数据中的参数值以及与数据库交互的异常信息,通过分析这些数据来确认是否存在SQL注入漏洞并进行进一步的利用和测试。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

计算机网络技术2班-伍烽燕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值