sqlmap源码阅读(一)

本文是作者作为新手对sqlmap源码的初步阅读,主要分析了main.py中的dirtyPatches(), resolveCrossReferences(), checkEnvironment(), setPaths(modulePath()), banner()等函数。内容涉及Python内置函数、编码处理、环境检查等方面,揭示了sqlmap启动时的一些关键操作。" 90265226,7443250,Ubuntu内存模拟持久化内存(DRAM模拟PMEM),"['持久化内存', 'Linux内核', 'Ubuntu']
摘要由CSDN通过智能技术生成

sqlmap源码阅读(一)

本人菜鸟一枚,最近开始阅读sqlmap源码,如有错误,多多指教!

首先一点,在看源码的时候发现很多函数的函数体只有一个pass,有两种可能:
1、父类中声明函数,但不声明实现,由继承的子类进行实现,也就是说这就是一个空方法;

2、这个函数的具体实现不用Python编写,而是由例如C这种高效语法编写,在包中只用一个空方法占位,调用的时候是调用C语言实现的方法,这里定义的函数只是类似于一个接口。Python中有一些需要大量运算的内置函数是用C或者C++写的。
pass

  • 先从sqlmap.py的main函数开始,这一章简单分析一些main函数开始的几个被调用函数

main.py

def main():
    """
    Main function of sqlmap when running from command line.
    """

    try:
        dirtyPatches()
        resolveCrossReferences()
        checkEnvironment() #检测环境
        setPaths(modulePath()) #为一些目录和文件设置了绝对路径
        banner() #打印sqlmap banner信息
        .....
        .....
        (这一章先分析以上几个函数,所以后面代码省略)

dirtyPatches()

patch.py:

def dirtyPatches():
    """
    Place for "dirty" Python related patches
    """

    # accept overly long result lines (e.g. SQLi results in HTTP header responses)
    # 接受过长的结果行(例如HTTP头响应中的SQLi结果)
    _http_client._MAXLINE = 1 * 1024 * 1024

    # prevent double chunked encoding in case of sqlmap chunking (Note: Python3 does it automatically if 'Content-length' is missing)
    # 在sqlmap分块的情况下防止双块编码(注意:如果缺少“Content-length”,Python3会自动执行)
    if six.PY3:#在python3下运行返回true
        if not hasattr(_http_client.HTTPConnection, "__send_output"):
            _http_client.HTTPConnection.__send_output = _http_client.HTTPConnection._send_output

        def _send_output(self, *args, **kwargs):
            if conf.get("chunked") and "encode_chunked" in kwargs:
                kwargs["encode_chunked"] = False
            self.__send_output(*args, **kwargs)

        _http_client.HTTPConnection._send_output = _send_output

    # add support for inet_pton() on Windows OS
    if IS_WIN:
        from thirdparty.wininetpton import win_inet_pton

    # Reference: https://github.com/nodejs/node/issues/12786#issuecomment-298652440
    codecs.register(lambda name: codecs.lookup("utf-8") if name == "cp65001" else None)

    # Reference: http://bugs.python.org/issue17849
    if hasattr(_http_client, "LineAndFileWrapper"):
        def _(self, *args):
            return self._readline()

        _http_client.LineAndFileWrapper._readline = _http_client.LineAndFileWrapper.readline
        _http_client.LineAndFileWrapper.readline = _

    # to prevent too much "guessing" in case of binary data retrieval
    thirdparty.chardet.universaldetector.MINIMUM_THRESHOLD = 0.90

逐一分析这个函数

1. _http_client._MAXLINE = 1 * 1024 * 1024

_http_client是对http包里的client.py文件的别名

import http.client as _http_client

_MAXLINE是读取客户端http请求时的最大行长度限制,原本是65536,这里设置为1024*1024=1048576(为什么这多行?

# maximal line length when calling readline().
#调用readline()时的最大行长度
_MAXLINE = 65536

检查版本是不是py3,是的话做相应设置,不是的话按py2执行

if six.PY3

检查HTTPConnection有没有叫做__send_output的属性,没有就设置一下

if not hasattr(_http_client.HTTPConnection, "__send_output"):
    _http_client.HTTPConnection.__send_output = _http_client.HTTPConnection._send_output

分析hasattr函数和_send_output函数
builtins.py:

def hasattr(*args, **kwargs): # real signature unknown
    """
    Return whether the object has an attribute with the given name.
    返回对象是否具有具有给定名称的属性。
    This is done by calling getattr(obj, name) and catching AttributeError.
    这是通过调用getattr(obj, name)和捕获AttributeError来完成的。
    """
    pass

client.py:

    def _send_output(self, message_body=None, encode_chunked=False):
        """Send the currently buffered request and clear the buffer.
        发送当前缓冲的请求并清除缓冲区。
        Appends an extra \\r\\n to the buffer.
        向缓冲区追加一个额外的\\r\ n
        A message_body may be specified, to be appended to the request.
        可以指定message_body,将其附加到请求中
        """
        #给缓冲区添加一个元组
        self._buffer.extend((b"", b""))
        #拼接起来传给msg
        msg = b"\r\n".join(self._buffer)
        #清空缓冲区
        del self._buffer[:]
        #send方法是把msg发送给服务器
        self.send(msg)

        if message_body is not None:
       		 .......(由于前面是无参调用,所以message_body=None,因此下面的代码我就省略了)

这里有个疑问,_send_output函数没有返回值,那他怎么会放在赋值语句_http_client.HTTPConnection.__send_output = _http_client.HTTPConnection._send_output的右边的?

解答:这里涉及到调用函数时带括号与不带括号的区别,带括号是调用函数体,需要执行这个函数,不带括号,只是调用这个函数对象,不需要执行。按上面的具体情况就是,把HTTPConnection的__send_output变成_send_output函数,执行前者就相当于执行后者。

回到dirtPatches:

def _send_output(self, *args, **kwargs):
            if conf.get("chunked") and "encode_chunked" in kwargs:
                kwargs["encode_chunked"] = False
            self.__send_output(*args, **kwargs)

        _http_client.HTTPConnection._send_output = _send_output

这里又把HTTPConnection的_send_output函数更新了,这就是当py版本是3而不是2时,对函数进行调整。

    # 在Windows操作系统上添加对inet_pton()的支持
    if IS_WIN:
        from thirdparty.wininetpton import win_inet_pton

    # Reference: https://github.com/nodejs/node/issue
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SQL注入1 简介 许多现实中对于网站的攻击往往是由于网站没有及时更新或者对于用户的输入没有进行检查。从缓冲区溢出说起,这样一种针对系统脆弱性的威胁,最根本的问题还是在于对于用户的输入没有进行检查。作为主要威胁之一的SQL注入带来了人们对于其应用和数据库的担忧。这个问题的出现有十年的时间了,但是现在仍旧在许多网站中出现。SQL注入就像许多当前主要的的web应用安全攻击问题也被划归在了对于用户输入的检查上。 正文 许多web开发者并不知道SQL语句能够被自定义(handle)并且假定SQL语句是一个让人信任的命令。这就让SQL语句能够绕过访问控制机制(access control),因此跳过标准的授权和认证检查。甚至有些时候SQL语句能够允许使用服务器操作系统上的命令行的权限。 直接的SQL注入命令是一种方法,它被攻击者构造或者是修改现成的SQL命令来暴露出隐藏的数据或者是覆盖掉有价值的数据,甚至在服务器上执行危险地系统指令 入门 结构化的语言是数据库的标准声明语言。这让(语言)变的更加简洁并且更易于使用。SQL起源于70年代的IBM实验室。SQL被用来让应用程序与数据库之间进行通信。 SQL使用如下的4种语言来对数据库进行操作 SELECT -从数据库中获得一条记录 INSERT-向数据库中插入一条记录 DELETE-从数据库中删除一条记录 UPDATE-从数据库中更新或者改变当前记录 当用户提交的语句被用作数据库的查询语句时SQL就能够发生。比如当用户被网站认证授权,用户发送一个带有”用户名”和”密码”的信息,用户名/密码就与存放在数据库中的内容进行核对。如果相同的话用户就被允许登录,否则用户登录失败。以下是一个在后台进行登录的例子。 代码 SELECT * FROM user WHERE username='$username' AND password='$password' 这个语句简单地指明了从user的表中查询用户名和username相等的,并且密码和password相等的。所以,如果用户发送用户名为”admin”,并且密码为”12345″,那么SQL语句被创建如下: SELECT * FROM user WHERE username='admin' AND password ='12345' 注入 那么,如果用户输入’ or ’1′=’1,第一个引号会终止输入的字符串,剩下的会被当做SQL语句,并且在SQL语句中1=1恒为真,这就能够让我们绕过注册机制 SELECT * FROM user WHERE username=’admin’ AND password =”or ’1′=’1′ -TRUE 上述是一个SQL注入的简单地例子,然而在实际过程中,SQL注入比这要复杂的多。在我们的渗透测试中,大多数时候我们有一个非常紧凑的计划表,所以这个时候我们需要一个自动化的攻击来为我们进行注入攻击。 SQLMAP就是一能够利用(系统)脆弱性的工具。它是开源的,并经常被用来在Python写的脆弱的DBMS上进行入侵的渗透测试。它能够检测并利用SQL上的漏洞,让我们举例在操作系统和数据库上使用sqlmap.py。 一步一步 我将尽可能地以最简洁的方式展示出来。 最常见的检测SQL注入的方法是通过在输入处添加一个单引号(')并且期待(系统)返回一个错误,有些应用程序并不会返回错误。这个时候我们就会利用true/false语句来检查是否这个应用程序会受到SQL注入的攻击。 为了随机的找到还有SQL注入的脆弱性的网站,你能够使用如下格式的语句利用google dork:inurl:news.php id =1?将会出现一堆google dork的数据并且为你过滤你搜索得到的结果提供了可能。那么让那个我们开始吧。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值