Rumah >Operasi dan penyelenggaraan >Keselamatan >Cara menggunakan sqlmapapi untuk memulakan imbasan
sqlmap boleh dikatakan sebagai artifak pengesanan suntikan SQL, tetapi kecekapan menggunakan sqlmap untuk menguji suntikan SQL adalah sangat rendah, dan setiap URL perlu diuji secara manual. Pembangun sqlmap telah menambah sqlmapapi.py, yang boleh dikendalikan secara langsung melalui panggilan antara muka, memudahkan pelaksanaan arahan sqlmap.
Sqlmap api dibahagikan kepada pelayan dan klien. Sqlmap api mempunyai dua mod, satu ialah mod antara muka berdasarkan protokol HTTP, dan satu lagi ialah mod antara muka berdasarkan baris arahan.
alamat muat turun kod sumber sqlmap: https://github.com/sqlmapproject/sqlmap/
python sqlmapapi.py -h<.>
2. Mulakan pelayan apiSebelum menggunakan perkhidmatan API, anda perlu memulakan pelayan API terlebih dahulu, sama ada ia berdasarkan protokol HTTP atau mod antara muka berasaskan baris arahan. Untuk memulakan pelayan API, hanya jalankan arahan berikut: python sqlmapapi.py -sSelepas arahan berjaya, beberapa maklumat akan dikembalikan dalam baris arahan. Perintah berikut secara kasar bermakna pelayan api berjalan pada port tempatan 8775, dan token pentadbir ialah c6bbb0c1f86b7d7bc2ed6ce3e3bbdcb5, dsb.Walau bagaimanapun, terdapat kelemahan dalam membuka pelayan api dengan cara di atas. Apabila pelayan dan klien Jika klien bukan hos, ia tidak akan disambungkan, jadi jika anda ingin menyelesaikan masalah ini, anda boleh membuka pelayan api dengan memasukkan arahan berikut: python sqlmapapi.py -s -H " 0.0.0.0" -p 8775
Selepas arahan berjaya, klien jauh boleh menyambung ke pelayan API dengan menyatakan IP dan port hos jauh. 3. Mod antara muka berasaskan baris perintah 3.1 Buka klien dan mulakan arahan suntikanpython sqlmapapi.py -cpython sqlmapapi.py -c -H "192.168.1.101" -p 8775Jika klien dan pelayan tidak berada pada komputer yang sama, masukkan arahan berikut:
3.2. Bantu arahan, dapatkan semua arahan
help 显示帮助信息 new ARGS 开启一个新的扫描任务 use TASKID 切换 taskid data 获取当前任务返回的数据 log 获取当前任务的扫描日志 status 获取当前任务的扫描状态 option OPTION 获取当前任务的选项 options 获取当前任务的所有配置信息 stop 停止当前任务 kill 杀死当前任务 list 显示所有任务列表 flush 清空所有任务 exit 退出客户端
3.3.3.3.3.3.3.1.arahan baharu
baru -u "url"Contoh: new -u "http://www.baidu.com"
Walaupun kami hanya Parameter -u ditentukan, tetapi ia boleh dilihat daripada maklumat yang dikembalikan bahawa selepas memasukkan arahan baru, /task/new mula-mula diminta untuk mencipta taskid baharu, dan kemudian permintaan dimulakan untuk memulakan tugas, jadi ia boleh dapat ditemui Mod ini pada asasnya berdasarkan protokol HTTP.
3.3.2 perintah status
mendapatkan status pengimbasan tugasan jika medan status dalam kandungan yang dikembalikan ditamatkan, Ini bermakna imbasan telah selesai Jika medan status dalam kandungan yang dikembalikan dijalankan, ini bermakna imbasan masih dalam proses. Gambar berikut ialah tangkapan skrin imbasan yang telah selesai:
3.3.3 arahan data
Jika medan data dalam data yang dikembalikan tidak kosong, anda boleh mendapatkan suntikan telah berjaya. Contoh ini menunjukkan kandungan pulangan yang mengandungi suntikan SQL, yang mengandungi maklumat seperti jenis pangkalan data, muatan dan parameter suntikan.4. Mod antara muka berdasarkan protokol HTTP Perkenalkan secara ringkas fungsi utama h berdasarkan mod panggilan antara muka http sqlmapapi.py, masukkan lib/ Kelas pelayan utils/api.py boleh didapati berinteraksi dengan perkhidmatan dengan menyerahkan data kepada pelayan. Terdapat 3 jenis kesemuanya. Kaedah pengguna Kaedah penggunaFungsi pentadbiran Fungsi pengurusanfungsi interaksi teras sqlmap Fungsi interaksi teras
4.1 Kaedah penggunaYa Jenis data yang diserahkan adalah seperti berikut:
@get("/task/new")
rreee@get ("/task/delete")@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})4.2. Fungsi interaktif teras
@get("/option/list")
@post. ("/ option/get")
@get("/scan/status")@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"})</taskid>@post("/scan/start")
@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})</taskid>@get ("/scan/stop")
@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()})</taskid>@get("/scan/kill")
@get("/scan/<taskid>/stop") def scan_stop(taskid): """ Stop 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_stop()" % taskid) return jsonize({"success": False, "message": "Invalid task ID"}) DataStore.tasks[taskid].engine_stop() logger.debug("(%s) Stopped scan" % taskid) return jsonize({"success": True})</taskid>
@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})</taskid>@ get("/scan/data")
@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() })</taskid>@get("/scan/log")@get("/download/") 4.3. Fungsi Pengurusan@get("/admin/list")
@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})</taskid>@get("/admin//flush")
@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)})</token>Analisis dan ekstrak daripada perhubungan panggilan fail sqlmapapi.py. Operasi ini boleh memenuhi sepenuhnya keperluan ujian kami, jadi ia boleh digunakan untuk operasi kelompok.
sqlmapapi.py dengan mudah menyediakan entri permintaan http, tetapi apabila digunakan, anda hanya boleh mendapatkan hasil akhir sama ada untuk menyuntik atau tidak antara muka menjalankan pengimbasan suntikan? Permintaan sedemikian sukar diperoleh dengan sebarang bilangan permintaan. Biar saya kongsikan carta alir yang direkodkan selepas menyisir kod sumber sqlmap. Daripada angka tersebut, anda boleh mencari lokasi khusus permintaan peringkat muatan Jika anda ingin mengetahui jenis permintaan yang dimulakan dan bilangan permintaan, anda hanya perlu menambah kod tersuai di sini.
Atas ialah kandungan terperinci Cara menggunakan sqlmapapi untuk memulakan imbasan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!