如何利用sqlmapapi发起扫描

sqlmap可谓是sql注入探测的神器,但是利用sqlmap测试SQL注入的效率很低,每一个url都需要手动测试。sqlmap的开发者新加了sqlmapapi.py,可以直接通过接口调用来操作,简化了sqlmap命令执行方式。

sqlmap api分为服务端和客户端,sqlmap api有两种模式,一种是基于HTTP协议的接口模式,一种是基于命令行的接口模式。

sqlmap源码下载地址:https://github.com/sqlmapproject/sqlmap/

一、查看帮助

python sqlmapapi.py -h如何利用sqlmapapi发起扫描

二、开启api服务端

无论是基于HTTP协议的接口模式还是基于命令行的接口模式,首先都是需要开启api服务端的。通过输入以下命令即可开启api服务端:python sqlmapapi.py -s

命令成功后,在命令行中会返回一些信息。以下命令大概的意思是api服务端在本地8775端口上运行,admin token为c6bbb0c1f86b7d7bc2ed6ce3e3bbdcb5等

如何利用sqlmapapi发起扫描但是通过上面的这种方式开启api服务端有一个缺点,当服务端和客户端不是一台主机会连接不上,因此如果要解决这个问题,可以通过输入以下命令来开启api服务端:python sqlmapapi.py -s -H “0.0.0.0” -p 8775

命令成功后,远程客户端就可以通过指定远程主机IP和端口来连接到API服务端。

三、基于命令行的接口模式

3.1、开启客户端,发起注入命令

python sqlmapapi.py -c

如果是客户端和服务端不是同一台计算机的话,输入以下命令:

python sqlmapapi.py -c -H “192.168.1.101” -p 8775

3.2、help命令,获取所有命令

help          显示帮助信息
new ARGS 开启一个新的扫描任务
use TASKID 切换
taskid data 获取当前任务返回的数据
log 获取当前任务的扫描日志
status 获取当前任务的扫描状态
option OPTION 获取当前任务的选项
options 获取当前任务的所有配置信息
s较好 停止当前任务
kill 杀死当前任务
list 显示所有任务列表
flush 清空所有任务
exit 退出客户端

如何利用sqlmapapi发起扫描

3.3、检测注入

3.3.1.new命令

new -u “url”

实例:new -u “http://www.baidu.com”

虽然我们仅仅只指定了-u参数,但是从返回的信息中可以看出,输入new命令后,首先先请求了/task/new,来创建一个新的taskid,后又发起了一个请求去开始任务,因此可以发现该模式实质也是基于HTTP协议的。

如何利用sqlmapapi发起扫描

3.3.2. status 命令

获取该任务的扫描状态,若返回内容中的status字段为terminated,说明扫描完成,若返回内容中的status字段为run,说明扫描还在进行中。下图是扫描完成的截图:

如何利用sqlmapapi发起扫描3.3.3. data 命令

获取扫描完成后注入出来的信息,若返回的内容中data字段不为空就说明存在注入。下图是存在SQL注入返回的内容,可以看到返回的内容有数据库类型、payload、注入的参数等等。

如何利用sqlmapapi发起扫描

四、基于HTTP协议的接口模式

简单介绍下sqlmapapi.py的h基于http接口调用模式的主要函数,进入到lib/utils/api.py的server类,可以发现通过向server提交数据进行与服务的交互。 一共分为3种类型。

Users’ methods 用户方法

Admin function 管理函数

sqlmap core interact functions 核心交互函数

可以提交数据的种类如下:

4.1、用户方法

@get(“/task/new”)

@get("/task/new")def task_new():    """    Create a new task    """    taskid = encodeHex(os.urandom(8), binary=False)    remote_addr = request.remote_addr     DataStore.tasks[taskid] = Task(taskid, remote_addr)     logger.debug("Created new task: '%s'" % taskid)    return jsonize({"success": True, "taskid": taskid})

@get(“/task/delete”)

@get("/task/<taskid>/delete")def task_delete(taskid):    """    Delete an existing task    """    if taskid in DataStore.tasks:        DataStore.tasks.pop(taskid)         logger.debug("(%s) Deleted task" % taskid)        return jsonize({"success": True})    else:        response.status = 404        logger.warning("[%s] Non-existing task ID provided to task_delete()" % taskid)        return jsonize({"success": False, "message": "Non-existing task ID"})

4.2、核心交互函数

@get(“/option/list”)

@post(“/option/get”)

@post(“/option/set”)

@post("/option/<taskid>/set")def option_set(taskid):    """    Set value of option(s) for a certain task ID    """     if taskid not in DataStore.tasks:        logger.warning("[%s] Invalid task ID provided to option_set()" % taskid)        return jsonize({"success": False, "message": "Invalid task ID"})     if request.json is None:        logger.warning("[%s] Invalid JSON options provided to option_set()" % taskid)        return jsonize({"success": False, "message": "Invalid JSON options"})     for option, value in request.json.items():        DataStore.tasks[taskid].set_option(option, value)     logger.debug("(%s) Requested to set options" % taskid)    return jsonize({"success": True})

@post(“/scan/start”)

@post("/scan/<taskid>/start")def scan_start(taskid):    """    Launch a scan    """     if taskid not in DataStore.tasks:        logger.warning("[%s] Invalid task ID provided to scan_start()" % taskid)        return jsonize({"success": False, "message": "Invalid task ID"})     if request.json is None:        logger.warning("[%s] Invalid JSON options provided to scan_start()" % taskid)        return jsonize({"success": False, "message": "Invalid JSON options"})     # Initialize sqlmap engine's options with user's provided options, if any    for option, value in request.json.items():        DataStore.tasks[taskid].set_option(option, value)     # Launch sqlmap engine in a separate process    DataStore.tasks[taskid].engine_start()     logger.debug("(%s) Started scan" % taskid)    return jsonize({"success": True, "engineid": DataStore.tasks[taskid].engine_get_id()})

@get(“/scan/s较好”)

@get("/scan/<taskid>/s较好")def scan_s较好(taskid):    """    S较好 a scan    """     if (taskid not in DataStore.tasks or DataStore.tasks[taskid].engine_process() is None or DataStore.tasks[taskid].engine_has_terminated()):        logger.warning("[%s] Invalid task ID provided to scan_s较好()" % taskid)        return jsonize({"success": False, "message": "Invalid task ID"})     DataStore.tasks[taskid].engine_s较好()     logger.debug("(%s) S较好ped scan" % taskid)    return jsonize({"success": True})

@get(“/scan/kill”)

@get("/scan/<taskid>/kill")def scan_kill(taskid):    """    Kill a scan    """     if (taskid not in DataStore.tasks or DataStore.tasks[taskid].engine_process() is None or DataStore.tasks[taskid].engine_has_terminated()):        logger.warning("[%s] Invalid task ID provided to scan_kill()" % taskid)        return jsonize({"success": False, "message": "Invalid task ID"})     DataStore.tasks[taskid].engine_kill()     logger.debug("(%s) Killed scan" % taskid)    return jsonize({"success": True})

@get(“/scan/status”)

@get("/scan/<taskid>/status")def scan_status(taskid):    """    Returns status of a scan    """     if taskid not in DataStore.tasks:        logger.warning("[%s] Invalid task ID provided to scan_status()" % taskid)        return jsonize({"success": False, "message": "Invalid task ID"})     if DataStore.tasks[taskid].engine_process() is None:        status = "not running"    else:        status = "terminated" if DataStore.tasks[taskid].engine_has_terminated() is True else "running"     logger.debug("(%s) Retrieved scan status" % taskid)    return jsonize({        "success": True,        "status": status,        "returncode": DataStore.tasks[taskid].engine_get_returncode()    })

@get(“/scan/data”)

@get("/scan/<taskid>/data")def scan_data(taskid):    """    Retrieve the data of a scan    """     json_data_message = list()    json_errors_message = list()     if taskid not in DataStore.tasks:        logger.warning("[%s] Invalid task ID provided to scan_data()" % taskid)        return jsonize({"success": False, "message": "Invalid task ID"})     # Read all data from the IPC database for the taskid    for status, content_type, value in DataStore.current_db.execute("SELECT status, content_type, value FROM data WHERE taskid = ? ORDER BY id ASC", (taskid,)):        json_data_message.append({"status": status, "type": content_type, "value": dejsonize(value)})     # Read all error messages from the IPC database    for error in DataStore.current_db.execute("SELECT error FROM errors WHERE taskid = ? ORDER BY id ASC", (taskid,)):        json_errors_message.append(error)     logger.debug("(%s) Retrieved scan data and error messages" % taskid)    return jsonize({"success": True, "data": json_data_message, "error": json_errors_message})

@get(“/scan/log”)

@get(“/download/”)

4.3、管理函数

@get(“/admin/list”)

@get("/admin/list")@get("/admin/<token>/list")def task_list(token=None):    """    Pull task list    """    tasks = {}     for key in DataStore.tasks:        if is_admin(token) or DataStore.tasks[key].remote_addr == request.remote_addr:            tasks[key] = dejsonize(scan_status(key))["status"]     logger.debug("(%s) Listed task pool (%s)" % (token, "admin" if is_admin(token) else request.remote_addr))    return jsonize({"success": True, "tasks": tasks, "tasks_num": len(tasks)})

@get(“/admin//flush”)

@get("/admin/flush")@get("/admin/<token>/flush")def task_flush(token=None):    """    Flush task spool (delete all tasks)    """     for key in list(DataStore.tasks):        if is_admin(token) or DataStore.tasks[key].remote_addr == request.remote_addr:            DataStore.tasks[key].engine_kill()            del DataStore.tasks[key]     logger.debug("(%s) Flushed task pool (%s)" % (token, "admin" if is_admin(token) else request.remote_addr))    return jsonize({"success": True})

从sqlmapapi.py文件分析,提取调用关系。不难发现这些操作可以完全满足我们的测试需求,因此利用这些就可以批量了。

五、利用sqlmapapi发起扫描

sqlmapapi.py很方便的提供了http请求入口,但是使用起来只能得到最终是否注入的结果,每个接口进行注入扫描时具体发起了什么样的请求,多少个请求就难以得到,下面分享一下个人梳理sqlmap源码后记录的流程图。从图中可以定位到具体发起payload级别的请求位置,从而想要获取发起了什么样的请求,多少个请求,只需要在此处增加自定义代码即可。

如何利用sqlmapapi发起扫描

六、sql注入自动化实现流程

如何利用sqlmapapi发起扫描

上述内容就是如何利用sqlmapapi发起扫描,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。

文章标题:如何利用sqlmapapi发起扫描,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/24241

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云认证作者
上一篇 2022年9月10日 下午11:46
下一篇 2022年9月10日 下午11:47

相关推荐

  • QT如何实现将两个时间相加

    标志位 首先介绍实现的这两个函数:void setTreatmentEndtime();//系统时间+我设定的时间=总的需要时间void setRinseTimeStartAndEnd(QString Val);//将分钟转换为标准时分格式,在相加 需要设置的标志位: //mainwindow.hp…

    2022年9月6日
    61200
  • C语言内存分配函数被污染的示例分析

    1、被污染的内存分配 C 语言的内存分配函数包括 malloc()、 kmalloc 、 smalloc()、 xmalloc()、realloc()、 calloc()、 GlobalAlloc()、 HeapAlloc()等等,以 malloc()为例, malloc() 函数的原型为: ext…

    2022年9月20日
    61100
  • windows todesk远程软件安全吗

    todesk远程软件安全吗: 答:todesk远程软件非常安全。 1、客户端与中心服务器和高速通道集群通讯都采用高强度AEAD(Authenticated Encryption with Additional Data) xchacha20-ietf-poly1305算法。 2、在用户完成远程连接后…

    2022年9月20日
    1.2K00
  • cad字体不显示数字怎么解决

    解决方法 1、首先我们打开软件,找到菜单栏上的格式,再找到下拉菜单上的标注样式管理器。 2、然后在跳转出来的对话框中,点击当前使用的标注样式,然后再点击右侧的修改。 3、然后在跳转的新页面里,我们点击文字的选项,在文字高度这一块把高度数值改大一些。 以上就是“cad字体不显示数字怎么解决”这篇文章的…

    2022年9月16日
    74300
  • 知识库软件有哪些

    这里整理了国内外较好用的10款知识库软件,适用对象从团队到个人,他们分别是:1、PingCode Wiki;2、Baklib;3、有道云笔记;4、印象笔记;5、RemNote;6、石墨文档;7、Notion;8、语雀;9、幕布;10、Obsidian。具体功能我们将在文章中介绍。 一、团队知识库软件…

    2022年3月18日
    6.4K00
  • App崩溃的6个常见原因是什么

    人们讨厌应用程序崩溃,尤其是是程序减速或卡死几秒钟这样的现象。根据Dimensional Research的一项调查,61%的用户希望程序在4秒内启动,而49%的用户希望在2秒内响应输入。 如果应用发生崩溃,冻结或报错等现象,53%的用户会将APP卸载。 无论您的对象是消费者还是企业,崩溃问题会令他…

    2022年9月2日
    1.7K00
  • word字体放大快捷键是什么

    word字体放大快捷键 1、 我们只要先按住键盘左下角的“ ctrl ”键。 2、接着按下大键盘右上角的“ 】 ”按键。 3、连续点击,就可以将word文档字体无限放大了。 4、同理,按住“ ctrl ”再点击“ 【 ”就能无限缩小字体。 到此,关于“word字体放大快捷键是什么”的学习就结束了,希…

    2022年9月18日
    1.2K00
  • windows ecshop模板如何修改

    ecshop模板修改方法: 1、首先我们下载一个模板,将他放入软件目录下的“themes”文件夹。 2、接着打开ecshop,点击“模板管理”下的“模板选择” 3、然后点击下方你要更换的模板。(建议备份当前模板) 4、网站会弹出提示,如图所示,点击“确定” 5、修改完成后去到网站,就可以发现模板已经…

    2022年9月22日
    49300
  • windows deepin没有无线网络怎么解决

    解决方法: 方法一: 1、可以尝试先切换回windows系统,然后下载驱动人生。 2、然后在windows系统下更新自己的无线网卡驱动,更新后再切换回deepin系统看看能否显示。 方法二: 1、如果windows修复无效,那么回到deepin,打开“深度终端” 2、在其中输入“lspci | gr…

    2022年9月21日
    94200
  • git如何删除某个分支

    git删除某个分支的方法:1、利用“git branch –delete dev”命令删除本地分支;2、利用“git push origin –delete branch”命令删除远程分支;3、利用“git branch –delete –remote…

    2022年6月29日
    22.7K00
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部