一、sql注入介绍
1.sql注入产生原理:在web应用程序从数据库取出相关数据进行显示时,要通过相应的SQL语句进行执行数据查询,如果不对输入语句进行适当的过滤和验证,当攻击者执行恶意的SQL语句时,就可以查询其他的数据。
2.sql注入漏洞的危害:若存在SQL注入漏洞,攻击者可通过此漏洞查询数据库的敏感信息,如管理员的账号密码,或者修改数据库中的数据。
二、实战解析
下面以墨者的SQL手工注入漏洞测试(MySQL数据库)这个靶场来进行讲解。
1、寻找注入点
点击启动靶场后就会出现如下图的界面:
我们sql注入首先第一步就是要找到注入点,与数据库有数据交互的地方就有可能存在漏洞,这个我们可以看url地址是否有参数或者有登录页面也可以。这个界面就是个登录页面,但除此之外下方还有一个平台停机维护的通知链接,这极大可能也是个注入点,咱可以点进去看一看(我第一次还想不到的,直接乱输的账号密码,输入账号密码(这样也会与数据库有数据交互),设置代理用bp进行数据抓包,这样也是一种方法,本文讲的另一种,用新装的hackbar插件来进行,嘿嘿)
进去以后发现url中有id=1,URL中有数据传递(这是首要条件哦),找对地方了,接下来就打开hackbar看看是否存在漏洞,这个是练习的靶场肯定就存在漏洞了,平时不知道存不存在时就需要测试有没有漏洞,下面我就不测啦直接开始。
打开hackbar后将地址复制下来,如下图所示:
2.猜测字段
接下来的话就直接进行sql注入啦。首先猜测有多少个字段,用 order by来猜测,后面的数字就一个一个猜,猜对了页面会显示正常,猜错了页面就显示不正常,如下图:
由图可知,order by 8时页面不能正常显示,5时也不能正常显示,换到order by 4的时候页面正常显示,由此可知,字段就是为4(这里我就不一一演示啦) ,猜出字段后就把参数写完整,如下图所示:
此时我们可以看到页面正常显示,但是我们sql注入呢要找显位,就是找到我们爆破时数据显示出来的位置,这样我们才知道这是我们要的东西,这里的话我们可以将id=1改成id=-1,这样是为了让union前面的语句结果不显示,这样才能显示出union后面语句的结果。操作如下图所示:
由图可知,爆出了2和3的位置,这样我们就可以在2和3这进行数据的查询。
3.收集相关信息
接下来要收集一些相关的数据(一般注入时我们要先猜测数据库的类型然后根据数据库类型选择注入的思路,不同的数据库类型略微不同,这里的话咱已经知道这是mysql了就直接开始了)
- 获取数据库版本:version() ——(这一步作用挺大的,我们知道MYSQL5.0以上的版本带有information_schema,information_schema 存储了所有的库名、表名、列名,当我们不知道有什么数据库时这个就可以从这个下手)
- 数据库用户:user()
- 操作系统:@@version_compile_os
- 数据库名字:database (这一步可为后期猜解指定数据库下的表、列作准备)
首先看数据库版本:
由此可知,数据库版本5,7,22
查看数据库用户:
由图可知用户为root,root用户可进行文件的读写操作、跨库查询等。
查看数据库名字:
由图可知数据库名字为 mozhe_Discuz_StormGroup
4.猜解表名
我们知道mysql的话是统一管理的,最高级数据库用户是root,数据库在最外层,接着到表,再到列,最后是数据。
知道数据库名字后就可以猜解表名:union select 1,table_name,3,4 from information_schema.tables where table_schema='mozhe_Discuz_StormGroup'
这个语句的意思是:在数据库 information_schema.tables表中查找数据库为mozhe_Discuz_StormGroup的表
图中只显示一个表名,我们可以加上group_concat显示出多个(如果有多个的话),防止错过任何有用的信息。
由图可知有两个表:StormGroup_member 和notice,下面我们查询的也要加上group_concat,防止错过任何有用的数据
5.猜解列名
接下来的话我们就是要查询列名:union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='StormGroup_member'
union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='notice'
这个语句的话就改动了一点,我们已经知道了表名,就可以从已知的表名中查找列名
通过查询我们可以知道用户名和密码就在StormGroup_member表里。
6.暴用户名和密码
union select 1,group_concat(name),group_concat(password),4 from StormGroup_member
耶 成功啦
本文就到此结束啦,写得有点啰啰嗦嗦,哈哈哈,写得不好或者有错误的地方大家可以指出来哈