冰镇可乐 发表于 2018-10-22 13:27:20

sql注入在线检测(sqlmapapi)

  http://blog.csdn.net/yueguanghaidao/article/details/38026431
  之前一搞***的同事问我,sqlmapapi.py是干啥的,我猜很多人都玩过sqlmap,但玩过sqlmapapi的应该比较少,今天就和大家一起看看如何使用以及一些美的地方。
  说白了,sqlmapapi.py就是提供了一个检查sql注入的接口,我们可以直接通过发送http请求扫描sql注入,获取扫描结果等一系列操作。
  下面通过实例演示如何使用:
  一.启动服务器端
http://img.blog.csdn.net/20140722012437718?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVlZ3VhbmdoYWlkYW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
  服务器后端使用的是bottle,一个Python Web微框架。
  二. 我们使用requests这个库发送请求
  1.新建任务
http://img.blog.csdn.net/20140722013216390?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVlZ3VhbmdoYWlkYW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
  2.发送扫描选项,开启扫描
http://img.blog.csdn.net/20140722015116163?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVlZ3VhbmdoYWlkYW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
  注意:那个cd92e4e99406715b就是新建任务返回的taskid
  3.查看扫描状态
http://img.blog.csdn.net/20140722015441880?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVlZ3VhbmdoYWlkYW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
  任务已经结束,可以获取扫描结果了
  4.查看扫描结果
http://img.blog.csdn.net/20140722015739924?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVlZ3VhbmdoYWlkYW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
  我们很明显的看出是存在sql注入的
  嘿嘿,是不是很简单,但很强大啊,其实如果深入源码查看,你会发现也很简单。
  比如说启动一个任务,
   view plaincopy

[*]  def engine_start(self):
[*]  self.process = Popen("python sqlmap.py --pickled-options %s" % base64pickle(self.options),
[*]  shell=True, stdin=PIPE, close_fds=False)
  其它的也是一目了然,
   view plaincopy

[*]  def engine_stop(self):
[*]  if self.process:
[*]  return self.process.terminate()
[*]  else:
[*]  return None
[*]
[*]  def engine_kill(self):
[*]  if self.process:
[*]  return self.process.kill()
[*]  else:
[*]  return None
[*]
[*]  def engine_get_returncode(self):
[*]  if self.process:
[*]  self.process.poll()
[*]  return self.process.returncode
[*]  else:
[*]  return None
[*]
[*]  def engine_has_terminated(self):
[*]  #如何任务没有结束,returncode的返回值为None
[*]  return isinstance(self.engine_get_returncode(), int)
  我们restful api设计也是很有讲究的,一般少用动词,而是通过http的方法代表动作。比如说获取状态,并不是getstatus,而是通过get方法,和status名称就很贴切。
  但有时动词是不可避免的,如何说start,stop等。其实看看新建任务的api设计作者肯定也很纠结,本来如果新建任务有参数的话,直接post方法就可以,压根不需要new这个动词。但由于新建任务不需要任何参数,使用post方法也不太恰当,所以改为get方法了。这也符合上面开启任务使用post,而停止任务使用的是get。
  更多细节问题需要大家去看文档或源码,刚好趁着这个机会好好分析下subprocess模块和bottle框架,后期也会有这方面的分析。

页: [1]
查看完整版本: sql注入在线检测(sqlmapapi)