SQLmap简介
sqlmap是一个开源渗透测试工具,可以用来进行自动化检测,利用sql注入漏洞获取数据库服务器的权限。它具有强大的检测引擎,针对各种不同类型的数据库的渗透测试功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接方式操作系统命令。
它支持五种注入模式:
- 基于布尔的盲注,即可以根据返回页面判断条件真假的注入
- 基于报错注入,即页面会返回错误信息,或者把注入的语句结果直接返回在页面中
- 基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行来判断。
- 联合查询注入,可以使用union的情况下的注入。
- 对查询注入,可以同时执行多条语句的执行时的注入。
sqlmap是一个跨屏台的工具,很好用,是sql注入的强大工具。
sqlmap的安装
首先它是基于python的首先需要在电脑中安装好python环境然后到sqlmap官网http://sqlmap.org/下载和python环境相匹配的版本的压缩包,然后解压到python安装的文件下通过命令行启动即可。
sqlmap使用参数详解
在这里我们使用自己虚拟机搭建的sqli-labs靶场作为演示来学习使用sqlmap。
选项
一些参数选项
|
目标
|
使用-d尝试连接
使用-u参数尝试
sqlmap.py -u 选项对于不常使用的网站可以直接使用 -u参数指定url地址探测是否存在注入
也可以直接添加–batch省区询问直接选择默认项
扫描出id存在boolean盲注,并且给出结果mysql版本和服务器类型和php版本
使用-r指定文件从文件中加载目标
sqlmap.py -r 文件路径 使用该命令时必须指明文件的绝对路径,验证过程与-u参数类似,判断可注入的参数,判断那种sql注入进行注入
可以使用-p参数来指定注入点,使用–skip参数来跳过注入点,也可以使用*来表注注入点,星号添加位置是你认为可能存在的注入点
保存为txt用sqlmap跑
获取信息
–current-db获取当前数据库名
–dbs是获取数据库(暴库)
-D指定数据库名 –tables参数是获取数据库中的表(暴表)
-T指定表名 –columns参数是获取数据库表中的字段名(暴字段)
-C指定字段名用,分隔 –dump参数获取字段的值
–start指定开始行 –stop指定结束行指定第几行到第几行的数据
–dump-all获取数据库中所有数据
其他命令
level是测试等级一共有五个级别,级别越高检测内容越多,级别大于等于2时会检测cookie是否含有注入,大于等于3时会检测user-angent和referer是否有注入。推荐使用3
|
–risk=RISK 执行测试的风险(0-3,默认为1)
risk 2:基于事件的测试;risk 3:or语句的测试;risk 4:update的测试
升高风险等级会增加数据被篡改的风险。 常用就是默认1
os是检测数据库版信息的一个命令,但sqlmap默认会自动检测,–os-shell当数据库为mysql、postgresql或sqlserver时可以通过sqlmap执行操作系统命令
当数据库是mysql时满足当前用户为root知道网站根目录sqlmap -u "xxx" --os-shell
会让我们选择网站脚本
接下来让我们判断网站可写目录的方法
|
执行os-shell时sqlmap会向网站根目录写入两个文件tmpblwkd.php和tmpueqch.php。真正的木马文件是前者,如果是非正常退出sqlmap的话,这两个文件不会被删除。只有当我们输入x或q退出时sqlmap才会将该文件自动删除
用来表注注入点:sqlmap可以区分一个url中的参数来进行注入点测试,但在遇到一些做了伪静态的网页就无法自动识别了
类似于/admin/1,sqlmap无法进行注入测试,但实际上可能是/admin.php?id=1 只是把参数隐藏在了url中,对于这样只需要在参数后加上一个星号即可如/admin/1 星号之后众生平等
post数据可以使用–data参数将要提交的数据添加进来就能测试如
|
cookie可以使用–cookie参数来添加参数如
|
-g参数会主动爬取google上搜索结果来进行注入,对带有get参数的url进行挨个测试,前提魔法
超时延迟-timeout 如超时30秒 -timeout 30
注入测试脚本参数-tamper:sqlmap自带一个脚本库,内置的脚本库对payload进行了混淆,可以绕过一些waf在sqlmap的安装目录tamper下,脚本可以自己编写
|
tamper文件夹下个脚本功能
|
–current-user当前数据库使用账户
–mobile模拟手机进行测试 –smart智能判断 –passwords -v1对加密的密码尝试进行哈希对撞 –roles可以查看数据管理员的角色
–is-dba查看是否是管理员权限
–file-read当数据库为mysql、postgresql或sqlserver并且当前用户有权限时可以读取指定文件,可以时文本文件或者二进制文件
如我们读取目标服务器c盘test.txt
sqlmap -u “url” –file-read “文件路径”
–file-write –file-dest上传文件到数据库服务器中
当数据库为mysql、postgresql或sqlserver通过powershell,并且当前用户有权限向任意目录写文件时,可以上传文件到数据库服务器,文件可以是文本,也可以是二进制文件,所以利用文件上传一句话木马或者shell
前提我们必须知道服务器的绝对路径:
|
–proxy挂代理:
- 直接代理可直接在-u之后直接输入–proxy “代理地址:端口”此时就使用代理访问了
- 简介代理:利用burp将sqlmap代理写成监听地址那么sqlmap数据就会通过burp发出这样做可以监听sqlmap发出的请求包能防ip被封。
–dbms 数据库名 指定数据库名称
-level指定等级一般为3
-risk指定风险
必要时需要自己手动写python脚本修改payload语句。
在sqlmap中–tamper参数是用来引入用户自定义的脚本来修改注入时的payload,可以使用tamper来绕过waf,替换被过滤的关键字一下是一个基本的tamper结构
|
需要把他保存为my.py放入sqlmp/tamper路径下,然后使用时加上参数–tamper=my即可
import我们可以使用这个关键字导入sqlmap的内部库,sqlmap为我们提供了很多封装好的函数和数据类型如priority源于sqlmap/lib/core/enums.py里边定义了优先级有一下几个参数:
|
dependencies主要是提示用户这个tamper支持那些数据库
最终要的是tamper函数我们可以把我们想要实现的功能写在这个函数里,这个函数的参数payload就是原始sqlmap的注入payload,我们要实现绕过一般就是要修改这个参数,kwargs是针对http头的修改,如果是修改头部就要使用这个参数。
修改payload示例
|
修改http头实例
|
在实际的渗透中我们要根据实际情况编写修改tamper中的payload。