精华内容
下载资源
问答
  • SQL注入漏洞扫描检测

    2018-12-20 10:27:44
    有SQL注入检测的全套代码和论文介绍,C#,Web应用漏洞检测技术,是一种针对web应用的积极防御技术。该技术在应用尚未遭受攻击前,模拟黑客攻击的方式目标系统进行各种探测,发现系统潜在的漏洞。由于web应用工作在...
  • SQL注入漏洞给相应检测及防御技术进行研究,通过本地创建的实验环境,将Pubs数据库作为案例和多种渗透方法实现SQL注入实验。以SQL注入攻击特点为基础,提出四种具体防御措施。实验表示,此防御措施Web应用系统能够...
  • 编写一个简单的多线程爬虫,用于网站地址进行爬取,编写一个简单的sql注入工具,用于网站地址进行sql注入检测。 1.2 实验知识点 多线程的使用 网站爬虫的基本知识 SQL注入的基本原理 SQL检测工具编写,...

    一、实验介绍

    扫描器需要实现功能的思维导图:
    在这里插入图片描述

    1.1 实验内容

    编写一个简单的多线程爬虫,用于对网站地址进行爬取,编写一个简单的sql注入工具,用于对网站地址进行sql注入的检测。

    1.2 实验知识点

    • 多线程的使用
    • 网站爬虫的基本知识
    • SQL注入的基本原理
    • SQL检测工具编写,多参数URL的sql注入检测
    • 正则表达式的基本知识

    1.3 实验环境

    • Python 2.7
    • Win10
    • PyCharm

    二、实验原理

    简单的扫描器雏形编写,爬虫+sql判断程序,后续优化以此雏形为基础。

    2.1 爬虫编写思路

    爬虫的作用是收集网站的链接,我们需要记录一下已经爬取的链接和待爬取的链接,并且去重复,去重复使用python的 set() 就可以解决,大概流程是:

    1. 输入url
    2. 下载解析出url
    3. url去重,判断是否为本站
    4. 加入到待爬去列表
    5. 重复循环即可

    2.2 SQL判断思路

    • 通过在url 后面加上 AND %d=%d 或者 OR NOT (%d>%d)
    • %d后门的数字是随机可变的
    • 然后搜索网页中特殊关键词,比如:
    mysql中是 SQL syntax.*MySQL
    Microsoft SQL Server是 Warning.*mssql_
    Microsoft Access 是 Microsoft Access Driver
    Oracle 是 Oracle error
    IBM DB2 是 DB2 SQL error
    SQLite 是 SQLite.Exception 等等....
    
    • 通过这些关键词就可以判断出所用的数据库
    • 我们还要判断一下waf之类的东西,有这种东西就直接停止
    • 简单的方法就是用特定的url访问,如果出现了像 ip banned ,firewall之类的关键词,可以判断出是waf了
    • 具体的正则表达式是 (?i)(\A|\b)IP\b.*\b(banned|blocked|bl(a|o)ck\s?list|firewall)
    • 当然我们只是简单的来判断是否有注入,用这个思路写个脚本,非常简单

    三、开发准备

    在线环境已经安装好了这些库,如果不是用的在线环境,请先安装这些库

    pip install requests
    pip install beautifulsoup4
    

    requests是一个友好可靠的网络访问库,beautifulsoup4是用于解析html标签的库。 同时创建个wgdscan文件夹,里面的目录结构如下:

    /wgd.py //项目启动主文件
    /lib/core //核心文件存放目录
    /lib/core/config.py //配置文件
    /script //插件存放
    /exp //exp和poc存放
    

    四、实验步骤

    4.1 sql检测脚本编写

    用一个字典存储数据库特征:

    DBMS_ERRORS = { # regular expressions used for DBMS recognition based on error message response
    "MySQL": (r"SQL syntax.*MySQL", r"Warning.*mysql_.*", r"valid MySQL result", r"MySqlClient\."),
    "PostgreSQL": (r"PostgreSQL.*ERROR", r"Warning.*\Wpg_.*", r"valid PostgreSQL result", r"Npgsql\."),
    "Microsoft SQL Server": (r"Driver.* SQL[\-\_\ ]*Server", r"OLE DB.* SQL Server", r"(\W|\A)SQL Server.*Driver", r"Warning.*mssql_.*", r"(\W|\A)SQL Server.*[0-9a-fA-F]{8}", r"(?s)Exception.*\WSystem\.Data\.SqlClient\.", r"(?s)Exception.*\WRoadhouse\.Cms\."),
    "Microsoft Access": (r"Microsoft Access Driver", r"JET Database Engine", r"Access Database Engine"),
    "Oracle": (r"\bORA-[0-9][0-9][0-9][0-9]", r"Oracle error", r"Oracle.*Driver", r"Warning.*\Woci_.*", r"Warning.*\Wora_.*"),
    "IBM DB2": (r"CLI Driver.*DB2", r"DB2 SQL error", r"\bdb2_\w+\("),
    "SQLite": (r"SQLite/JDBCDriver", r"SQLite.Exception", r"System.Data.SQLite.SQLiteException", r"Warning.*sqlite_.*", r"Warning.*SQLite3::", r"\[SQLITE_ERROR\]"),
    "Sybase": (r"(?i)Warning.*sybase.*", r"Sybase message", r"Sybase.*Server message.*"),
    }
    

    通过正则,如果发现我们的正则语句,就可以判断出是哪个数据库了。

    for (dbms, regex) in ((dbms, regex) for dbms in DBMS_ERRORS for regex in DBMS_ERRORS[dbms]):
        if(re.search(regex,_content)):
            return True
    

    这个是我们的测试语句[payload]。

    BOOLEAN_TESTS = (" AND %d=%d", " OR NOT (%d=%d)")
    

    用报错语句返回正确的内容和错误的内容进行对比。

    for test_payload in BOOLEAN_TESTS:
        #正确的网页
        RANDINT = random.randint(1, 255)
        _url = url + test_payload%(RANDINT,RANDINT)
        content["true"] = Downloader.get(_url)
        _url = url + test_payload%(RANDINT,RANDINT+1)
        content["false"] = Downloader.get(_url)
        if content["origin"]==content["true"]!=content["false"]:
            return "sql fonud: %"%url
    

    这一句:

    content["origin"]==content["true"]!=content["false"]
    

    意思就是当原始的网页等于正确的网页不等于错误的网页内容时就可以判定这个地址存在注入漏洞。

    完整代码:

    import re,random
    from lib.core import Download
    def sqlcheck(url):
        if(not url.find("?")):
            return False
        Downloader = Download.Downloader()
        BOOLEAN_TESTS = (" AND %d=%d", " OR NOT (%d=%d)")
        DBMS_ERRORS = {# regular expressions used for DBMS recognition based on error message response
        "MySQL": (r"SQL syntax.*MySQL", r"Warning.*mysql_.*", r"valid MySQL result", r"MySqlClient\."),
        "PostgreSQL": (r"PostgreSQL.*ERROR", r"Warning.*\Wpg_.*", r"valid PostgreSQL result", r"Npgsql\."),
        "Microsoft SQL Server": (r"Driver.* SQL[\-\_\ ]*Server", r"OLE DB.* SQL Server", r"(\W|\A)SQL Server.*Driver", r"Warning.*mssql_.*", r"(\W|\A)SQL Server.*[0-9a-fA-F]{8}", r"(?s)Exception.*\WSystem\.Data\.SqlClient\.", r"(?s)Exception.*\WRoadhouse\.Cms\."),
        "Microsoft Access": (r"Microsoft Access Driver", r"JET Database Engine", r"Access Database Engine"),
        "Oracle": (r"\bORA-[0-9][0-9][0-9][0-9]", r"Oracle error", r"Oracle.*Driver", r"Warning.*\Woci_.*", r"Warning.*\Wora_.*"),
        "IBM DB2": (r"CLI Driver.*DB2", r"DB2 SQL error", r"\bdb2_\w+\("),
        "SQLite": (r"SQLite/JDBCDriver", r"SQLite.Exception", r"System.Data.SQLite.SQLiteException", r"Warning.*sqlite_.*", r"Warning.*SQLite3::", r"\[SQLITE_ERROR\]"),
        "Sybase": (r"(?i)Warning.*sybase.*", r"Sybase message", r"Sybase.*Server message.*"),
    }
        _url = url + "%29%28%22%27"
        _content = Downloader.get(_url)
        for (dbms, regex) in ((dbms, regex) for dbms in DBMS_ERRORS for regex in DBMS_ERRORS[dbms]):
            if(re.search(regex,_content)):
                return True
        content = {}
        content["origin"] = Downloader.get(_url)
        for test_payload in BOOLEAN_TESTS:
            RANDINT = random.randint(1, 255)
            _url = url + test_payload%(RANDINT,RANDINT)
            content["true"] = Downloader.get(_url)
            _url = url + test_payload%(RANDINT,RANDINT+1)
            content["false"] = Downloader.get(_url)
            if content["origin"]==content["true"]!=content["false"]:
                return "sql fonud: %"%url
    

    我们在/script目录中创建这个文件,命名为sqlcheck.py。 暂时我们可以把他作为一个模块单独的进行调用,等以后写完插件系统后可由插件系统自动的调用这些模块。

    有些url地址是我们不需要测试的,比如.html结尾的地址,我们可以过滤掉他们,这里我直接find("?")查找?来判断url是否符合我们的标准。

    4.2 爬虫的编写

    爬虫的思路我们上面已经讲过了,先完成url的管理,我们单独将他作为一个类 文件保存在lib/core/UrlManager.py

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    
    class UrlManager(object):
        def __init__(self):
            self.new_urls = set()
            self.old_urls = set()
    
        def add_new_url(self, url):
            if url is None:
                return
            if url not in self.new_urls and url not in self.old_urls:
                self.new_urls.add(url)
    
        def add_new_urls(self, urls):
            if urls is None or len(urls) == 0:
                return
            for url in urls:
                self.add_new_url(url)
    
        def has_new_url(self):
            return len(self.new_urls) != 0
    
        def get_new_url(self):
            new_url = self.new_urls.pop()
            self.old_urls.add(new_url)
            return new_url
    

    同时为了方便,我们也可以将下载功能单独的作为一个类使用,文件保存在lib/core/Downloader.py简单写一下get/post方法即可。

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    import requests
    
    
    class Downloader(object):
        def get(self, url):
            r = requests.get(url, timeout=10)
            if r.status_code != 200:
                return None
            _str = r.text
            return _str
    
        def post(self, url, data):
            r = requests.post(url, data)
            _str = r.text
            return _str
    
        def download(self, url, htmls):
            if url is None:
                return None
            _str = {}
            _str["url"] = url
            try:
                r = requests.get(url, timeout=10)
                if r.status_code != 200:
                    return None
                _str["html"] = r.text
            except Exception as e:
                return None
            htmls.append(_str)
    

    特别说明下,因为我们爬虫会是多线程的,所以类中有个download方法是专门为多线程下载用的。

    lib/core/Spider.py 创建爬虫。

    爬虫代码如下:

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    
    from lib.core import Download,UrlManager
    import threading
    from urlparse import urljoin
    from bs4 import BeautifulSoup
    from script import sqlcheck
    
    class SpiderMain(object):
        def __init__(self,root,threadNum):
            self.urls = UrlManager.UrlManager()
            self.download = Download.Downloader()
            self.root = root
            self.threadNum = threadNum
    
        def _judge(self, domain, url):
            if (url.find(domain) != -1):
                return True
            else:
                return False
    
        def _parse(self,page_url,content):
            if content is None:
                return
            soup = BeautifulSoup(content, 'html.parser')
            _news = self._get_new_urls(page_url,soup)
            return _news
    
        def _get_new_urls(self, page_url,soup):
            new_urls = set()
            links = soup.find_all('a')
            for link in links:
                new_url = link.get('href')
                new_full_url = urljoin(page_url, new_url)
                if(self._judge(self.root,new_full_url)):
                    new_urls.add(new_full_url)
            return new_urls
    
        def craw(self):
            self.urls.add_new_url(self.root)
            while self.urls.has_new_url():
                _content = []
                th = []
                for i in list(range(self.threadNum)):
                    if self.urls.has_new_url() is False:
                        break
                    new_url = self.urls.get_new_url()
                    ##sql check
                    try:
                        if(sqlcheck.sqlcheck(new_url)):
                            print("url:%s sqlcheck is valueable"%new_url)
                    except:
                        pass
                    print("craw:" + new_url)
                    t = threading.Thread(target=self.download.download,args=(new_url,_content))
                    t.start()
                    th.append(t)
                for t in th:
                    t.join()
                for _str in _content:
                    if _str is None:
                        continue
                    new_urls = self._parse(new_url,_str["html"])
                    self.urls.add_new_urls(new_urls)
    

    爬虫通过调用craw()方法传入一个网址进行爬行,然后采用多线程的方法下载待爬行的网站,下载后的源码用_parse方法调用BeautifulSoup进行解析,之后将解析出的url列表丢入url管理器中,这样循环,最后只要爬完了网页,爬虫就会停止 我们使用了threading库,进行多线程编写,本项目中,可以自定义需要开启的线程数,线程开启后,每个线程会得到一个url进行下载,然后线程会阻塞,阻塞完毕后线程放行,继续运行。
    在这里插入图片描述

    4.3 爬虫和SQL检查的结合

    lib/core/Spider.py文件引用一下from script import sqlcheck 等下节我们开发出了插件系统后,就不需要这样引用了,爬虫会自动调用,但这节课为了测试,我们还是引用一下。在craw()方法中,取出新url地方调用一下。

    ##sql check
    try:
        if(sqlcheck.sqlcheck(new_url)):
            print("url:%s sqlcheck is valueable"%new_url)
    except:
        pass
    

    try检测可能出现的异常,绕过它,在文件wgdscan.py中,我们可以进行测试了。

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    '''
    Name:wgdScan
    Author:wanggangdan
    Copyright (c) 2019
    '''
    import sys
    from lib.core.Spider import SpiderMain
    
    def main():
        root = "https://www.shiyanlou.com/"
        threadNum = 10
        #spider
        wgd = SpiderMain(root,threadNum)
        wgd.craw()
    
    if __name__ == '__main__':
        main()
    

    很重要的一点!为了使得libscript 文件夹中的.py文件可以被认作是模块,请在 lib lib/corescript 文件夹中创建 __init__.py 文件(init 前后是两个 _ 下划线),文件中什么都不需要加。

    五、总结及回顾

    • SQL注入检测通过一些payload使页面报错,判断原始网页,正确网页,错误网页即可检测出是否存在SQL注入漏洞
    • 通过匹配出sql报错出来的信息,可以正则判断出所用的数据库
    • 扫描器目前是通过一个爬虫扫描来进行漏洞检测,以后会从各个方面进行检测

    GitHub源码地址:https://github.com/ldz0/Python-wgdscan/tree/master/(一)网站爬虫开发以及SQL注入检测插件/wgdscan

    实验来自实验楼

    展开全文
  • 漏洞检测~SQL注入

    千次阅读 2017-12-06 20:01:08
    SQL注入主要存在于动态网站的web应用中,攻击者将恶意的sql语句插入到表单的输入域或网页请求的字符串中,提交给web服务器,如果应用程序没有用户的输入进行检查和过滤,则会执行恶意的SQL语句,即SQL注入产生。...

    注:转载请注明出自:https://blog.csdn.net/qq_36711453/article/details/78734503

    漏洞成因:

    SQL注入主要存在于动态网站的web应用中,攻击者将恶意的sql语句插入到表单的输入域或网页请求的字符串中,提交给web服务器,如果应用程序没有对用户的输入进行检查和过滤,则会执行恶意的SQL语句,即SQL注入产生。

    简而言之:SQL注入由于应用程序没有对用户的输入进行安全性检查和过滤造成的。

    SQL注入攻击一般流程:

    (1)探测SQL注入点:常见方法在参数传递的地方输入参数,并添加”“‘、”and 1=1“、”and 1=2“、"or 1 = 1"、"or 1=2", 若浏览器返回错误信息,则说明未对输入做处理;若”and 1=2 “和"and 1=1"结果不同,则说明对输入进行了处理。

    (2)判断数据库类型:常见的两种数据库SQL Server 和 Access。可以利用系统变量、系统表、等区分

    (3)Access 数据库;探测数据库表名、列名、字段值来判断数据库信息,了解数据库模式,采用方法是不合法的查询得到结果。

    (4)SQL Server 数据库:首先判断是否支持多句查询、子查询,是否存在数据库用户并判断其权限。

    (5)提升权限:确定数据库信息并获得相关权限后,进行攻击。

    攻击方式:

    (1)重言式攻击:攻击者在条件语句中注入代码,是的条件语句的结果始终为真,攻击后果取决于得到的结果在程序中的作用。

    (2)非法或者逻辑错误查询攻击:该攻击意图是识别可攻击的参数、分析数据库的关系结构、提取数据等。

    (3)联合查询:构造Union查询,将注入的查询语句插入到正常的SQL语句中。

    (4)附带查询攻击:该攻击的意图是提取、增加和修改数据库中的数据,实施拒绝服务攻击和远程命令执行。

    (5)利用存储过程攻击:存储过程也可能存在安全问题,攻击者利用存储过程对数据库进行攻击。目的扩大权限,实施服务器拒绝服务攻击和远程命令执行。

    (6)推断攻击:意图是识别可注入的参数,提取数据,识别数据库策略。

    (7)替换编码攻击:为了躲避编码安全性检测系统的检测。

    检测步骤:

    (1)获取被检测网站的网页

    采用网络爬虫工具,自动获取被测服务器上的网页,并进行相关处理。例如:去除广告、导航、重复等干扰信息,分析网页Frame帧结构等

    (2)提取网页中的注入点

    根据网页的HTML源码,提取"<form>"、"<a>"等元素的属性及子元素,进行规范化处理,滤除重复后加入URL列表

    (3)根据注入点构建测试用例

    使用编程语言和数据库中的注释符、连接符、界定符、等素材构件测试用例,建立基于字符串、数值、注释符等内容的测试用例

    (4)分析WEB服务器的响应信息

    通过注入点向服务器提交测试用例后,对服务器的响应信息进行分析。包括对错误信息、异常信息、异常内容与原始内容、响应延时等分析。

    (5)建立SQL注入漏洞检测的判定规则

    注入测试用例后引起的数据库出错,响应信息中包含了出错类型及代码信息 ;注入测试后服务器运行正常,响应信息与原始信息的相同;服务器的响应时间受影响,和原始响应延时不同; 注入无效请求后,服务器响应总是处在某个固定状态,则可能存在盲注的可能; 若疑似存在漏洞,则待详细分析。

    SQL注入防范:

    (1)参数化语句:用过将查询语句参数化,来防范SQL注入

    (2)输入验证:通过白名单和黑名单的验证对用户的输入进行验证

    (3)输出编码:对程序各个模块之间或者各个部分之间传递的数据进行编码处理

    (4)规范化:拒绝所有不符合规范的输入和对输入编码进行解码分析是常见的两种规范化处理方法

    (5)避免SQL注入漏洞的程序设计:使用存储过程、处理敏感数据等

    (6) 安全的编码规范:根据OWASP提供的安全编码规范进行相关编码

    展开全文
  • pikachu-SQL注入漏洞

    2021-02-02 15:21:07
    数据库注入漏洞,主要是开发人员在构建代码的时候,没有用户输入的值的边界进行安全的考虑,导致攻击者可以通过合法的输入点提交一些精心构造的语句,从而欺骗后台数据库进行执行,导致数据库信息泄漏的一种...
        

    一、SQL Inject 漏洞原理概述

    1.1 什么是数据库注入漏洞

        数据库注入漏洞,主要是开发人员在构建代码的时候,没有对用户输入的值的边界进行安全的考虑,导致攻击者可以通过合法的输入点提交一些精心构造的语句,从而欺骗后台数据库对其进行执行,导致数据库信息泄漏的一种漏洞。

    1.2 SQL Inject漏洞的攻击流程

    (1)第一步:注入点检测

        自动方式:使用web漏洞扫描工具,自动进行注入点发现

        手动方式:手工构造SQL Inject测试语句进行注入点发现

    (2)第二步:信息获取-通过注入点取期望得到的数据

        环境信息:数据库的类型、版本,操作系统的版本,用户信息等;

        数据库信息:数据库名称,表,字段,字段内容(加密内容的破解)

    (3)第三步:获取权限

        获取操作系统的权限,通过数据库执行shell,上传木马程序。

    1.3注入点类型及常见注入类型讲解

    (1)数字型:user_id=$id

    (2)字符型:user_id='$id'

    (3)搜索型:text LIKE '%{$_GET['search']}%'"

    1.4 演示:SQL Inject-数字型注入

    1、来到pikachu平台数字型注入(post)模块,先测试一下页面的功能,我们在下拉框内选择1,点击查询。

    2、我们猜想整个页面的逻辑是什么样的?

    3、我们可以通过PHP Study 打开我们的数据库终端。执行命令:show databases;

    显示我们所有的数据库。

    4、在数据库命令行工具内执行:show tables;查看pikachu数据库内的所有表

    5、在命令内执行:select username,email from member where id=1; 查询id=1的用户名和对应的邮箱。

    6、通过上边在命令行里边的一同操作,我们猜想:如果系统后台正如我们所想象一样,将获取的id的值直接拼接到查询语句后边而不加处理,那么我们是不是可以通过抓包、数据重放的方式获取所有的用户名和对应的邮箱?下边我们先去看一下后台代码。

    7、我们先打开burp suite,然后选择一次id值,查询。将抓到的数据包发送到重放模块。

    1.5 演示:SQL Inject-字符型注入

    1、来到pikachu平台字符型注入(get)模块,我们先看一下整个模块的功能。

    2、现在我们猜想一下后台的处理逻辑。

    3、现在我们构造闭合语句

    lucy' or 1=1-- '

    首先在lucy后边加一个单引号进行闭合,然后加上or 1=1,后边的单引号我们用注释符—注释掉。

    4、将构造语句复制到查询框,点击查询。就会拿到我们所有的信息。

    5、最后我们来看一下代码

    1.6 演示:SQL Inject-搜索型注入

    1、我们先来看源码

    2、将构造语句填入搜索框

    1.7 演示:SQL Inject-xx型注入

    1、我们来看源码:

    2、将构造的源码输入到查询框

    1.8 总结

        到现在为止,可能会有人疑问,我们做的演示都是在知道源码的情况下构造语句,那么在真实的环境里我们是不知道源码的,那么我们该如何构造语句呢?

    1. 第一种是我们可以根据报错的办法,例如:lucy',如果这个时候报错,说明存在单引号包裹;
    2. 第二种是我们可以利用and or 等,判定我们的构造语句是否参与了运算。
    3. 总之,还是要有经验,这个是一个积累的过程~~大家加油!

    二、注入方式get&post的区别

    GET方式中使用URL提交注入数据;

    POST方式中使用抓包工具修改POST数据部分提交注入。

    不管是GET还是POST,都有可能出现SQL注入漏洞,本质上是一样的!

    三、SQL Inject漏洞手工测试

    3.1 基于union联合查询的信息获取(select)

    1、我们使用pikachu的字符型注入模块。

    首先使用构造语句:lucy' order by [number]判断表存在几列。

    2、然后使用union关键字查询信息

    说明:user() database() 都是SQL语句里边的函数,具体的讲解可以参考我的关于sqli-libs 的博客。在这里我就不多说了。

    3.2基于报错的信息获取(select/delete/update/insert)

    由于我在我关于sqli-labs的博客中对报错查询做了详细的讲解。这里只是粗略的讲一下,如想深层次了解,请移步我的关于sqli-labs的博客。

    在MYSQL中使用一些指定的函数来制造报错,从而从报错信息中获取设定的信息。常用的报错函数有:

    updatexml():对XML文档数据进行查询和修改的XPATH函数

    extractvalue():对XML文档数据进行查询的XPATH函数

    floor():用来取整的函数

        注意:select/insert/update/delete都可以使用报错来获取信息。

        条件:后台没有屏蔽数据库的报错,在语法发生错误时会输出在前端。

    我们同样利用字符型注入(get)来进行演示

    (1)、select 语句:

    (2)、insert 语句

    构造语句:xxx' or updatexml(1,concat(0x7e,database()),0) or '

    (3)、update 语句:

    和insert是一模一样的,大家可以试一下。

    (4)、delete语句:

    构造闭合语句:1 or updatexml(1,concat(0x7e,database()),0)

    3.3操作系统权限获取

    这里我们讲"一句话木马"这个概念

    1、一句话木马是一种短小而精悍的木马客户端,隐蔽性好,且功能强大

    2、我们可以通过SQL注入漏洞写入恶意代码

    例如我们结合into outfile向后台写入:select 1,2 into outfile "/var/www/html/1.txt"

    3、写入的前提条件:

        (1)需要知道远程目录,我们作为测试者是一开始是不知道的

        (2)需要走远程目录有写入的权限

        (3)需要数据库开启了secure_file_priv

    4、请看到这里的童鞋移步我的关于sqli-labs的博客,对于一句话配合中国菜刀工具控制操作系统有着详细的介绍。

    四、SQL注入漏洞-盲注

    在有些情况下,后台使用了错误消息屏蔽的方法(例如@)屏蔽了报错,那么此时无法再根据报错信息进行注入的判断。

    这种情况下的注入,称为"盲注"。

    4.1(boolian base)类型的盲注

    我们直接来看构造语句:

    kobe' and ascii(substr(database(),1,1))>113--

    布尔类型的回显结果只有两种,正确还是错误。

    我们首先用substr()函数取出database()的第一个字母,然后进行ascii编码,最后采用二分法判断,知道找到一个值可以使之输出正确的结果,得到第一个字母到底是什么,然后取出database()里边的第二个字母,以此类推……

    4.2(time base)类型的盲注

    布尔盲注还有正确和错误两种情况输出,但是在时间盲注类型下,就一种输出,无论正确与否,都是一种输出。

    我们直接来看构造语句:

        kobe ' and if((substr(database(),1,1))='p',sleep(5),null)--

        这个构造语句的作用是,首先判断数据库的第一个字母是不是p,如果是就延迟5秒,表现出来就是网页一直显示在等待加载的状态,五秒后在返回结果页面,如果不是,就立即返回结果页面。

    五、基于 http header的注入

    有些时候,后台开发人员为了验证客户端头信息(比如常用的cookie验证)或者通过http header头信息获取客户端的一些信息,比如useragent、accept字段等。然后会客户端的http header信息进行获取并且用SQL进行处理,如果此时没有足够的安全考虑则可能会导致基于http header的SQL Inject漏洞。

    下面就这个场景下的SQL注入做演示。

    1、我们来到pikachu的"http header"注入模块,打开burp suite抓包工具,开启浏览器代理,执行下图中的操作。

    2、打开burp suite,将截取到的数据包发送到重放模块。

    3、构造报错注入语句:firefox' or updatexml(1,concat(0x7e,database()),0) or '

    4、除了在user agent处存在注入点,我们还猜想系统是否会对http header当中的cookie进行分析,验证用户名和密码。

    5、我们执行上图的操作后,会在右侧的输出栏的底部发现报错,说明我们的猜想是正确的。我们同样构造注入语句:admin ' and updatexml(1,concat(0x7e,database()),0)—

    六、SQL注入表列名猜解-暴力破解在SQLI上的应用

    当我们没有权限读information_schema这个数据库的时候,或者我们面对的数据库不是MySQL的时候,那么我该如何获得列名和表名?

    这个时候我们考虑采用暴力破解的方式。

    首先我们得有一个构造好的语句:kobe' and exists(select * from aa)#

    这个语句的作用是,aa作为变量,用exists()函数判断我们要查询的数据库是否存在,若存在就会返回一个正确的结果。

    1、我们利用pikachu字符注入模块,开启burp suite,然后将构造好的语句输入。

    2、来到burp suite将抓到的数据发送到暴力破解模块。

    3、执行破解后,我们来看结果

    七、使用SQL-map进行SQL Inject漏洞测试

    1、我们利用布尔类型的盲注模块做演示:在模块里边的查询框内随便输入一个值,点击查询。

    2、打开sqlmap工具

    -D pikachu -T users –columns查询users表内的字段

    -D pikachu -T users -C username,password –dump查询字段内容

    这里就不展示了。

    八、SQL注入漏洞常见的防控措施

    1、代码层面

    (1)对输入进行严格的转义和过滤

    (2)使用预处理和参数化(Parameterized)

    实例:

    2、网络层面

    (1)通过WAF设备启用防SQL注入策略(类似的防护系统)

    (2)云端防护(360网站卫士,阿里云盾等等)

    展开全文
  • DVWA之命令注入漏洞

    千次阅读 2018-07-17 16:01:50
    命令注入 简介: 命令注入是一种攻击,其目标是通过易受攻击的应用程序在主机操作系统上执行任意命令。...web服务器没有用户提交的参数进行有效的检测过滤 操作系统允许一条语句在使用连接符...

    命令注入

    简介:

    命令注入是一种攻击,其目标是通过易受攻击的应用程序在主机操作系统上执行任意命令。当应用程序将不安全的用户提供的数据(表单、Cookie、HTTP表头等)传递给系统shell时,可能会产生命令注入漏洞。在进行攻击时,攻击者提供的操作系统命令通常以易受攻击的应用程序的权限执行。

    产生原因:

    • web服务器没有对用户提交的参数进行有效的检测过滤
    • 操作系统允许一条语句在使用连接符和管道符后执行多条命令

     

    Low级别

    • 登陆DVWA平台,选择Low级别然后进入Command Injection模块。
    • 通过页面我们可以看出这是让你输入一个IP地址然后对其进行Ping测试,因此我们先只输入一个地址观察一下。

    这里我们可以看到在下方返回了对127.0.0.1进行Ping检测的内容,因此我们可以猜测这里有一个可以执行系统命令的函数,则这里可能存在命令注入漏洞,且执行的命令为Ping 输入的内容。

    • 然后我们进行测试,我们利用windows命令的连接符&&进行测试。这里我们输入127.0.0.1&&dir 

    可以看见这里不仅仅返回了127.0.0.1的Ping检测信息,还返回了刚刚拼接dir命令的结果即当前目录下的文件和子目录的信息。然后我们就可以通过拼接其他命令进行攻击,达到我们的目的。

    • 然后我们查看一下Low级别的代码
    ​<?php 
    
    if( isset( $_POST[ 'Submit' ]  ) ) { 
        // Get input 
        $target = $_REQUEST[ 'ip' ]; 
    
        // Determine OS and execute the ping command. 
        if( stristr( php_uname( 's' ), 'Windows NT' ) ) { 
            // Windows 
            $cmd = shell_exec( 'ping  ' . $target ); 
        } 
        else { 
            // *nix 
            $cmd = shell_exec( 'ping  -c 4 ' . $target ); 
        } 
    
        // Feedback for the end user 
        echo "<pre>{$cmd}</pre>"; 
    } 
    
    ?> ​

    这里我们可以看到代码果然如我们之前猜测的一样,将我们输入的值直接拼接到ping 命令后面。

    在这里运用了两个函数stristr(string,search,before_search)和php_uname(mode)函数,第一个函数的作用是搜索字符串在另一字符串中的第一次出现。before_search为可选参数默认值为 "false" 的布尔值。如果设置为 "true",它将返回 search 参数第一次出现之前的字符串部分。该函数的返回值为返回字符串的剩余部分(从匹配点),如果未找到所搜索的字符串,则返回 FALSE。

    第二个函数的作用是返回运行php的操作系统的相关描述,参数mode可取值

    ”a” (此为默认,包含序列”s n r v m”里的所有模式)

    ”s ”(返回操作系统名称)

    ”n”(返回主机名)

    ”r”(返回版本名称)

    ”v”(返回版本信息)             

     ”m”(返回机器类型)

    因此这段代码的含义为判断该操作系统为哪种操作系统并按操作系统的不同执行其对应的Ping命令。

    Medium级别

    • 我们同样先试一下Low级别的做法,输入127.0.0.1&&dir进行测试,发现失败了。
    • 不过windows下的管道符或者连接符不只有&&,还有以下几种:

    command1&command2         无论command1是否执行成功都要执行command2

    command1&&command2      只有command1执行成功后才执行command2

    command1||command2         只有command1执行失败后才执行command2

    command1|command2          将command1的执行结果传递给command2

    • 既然用&&连接测试失败了,我们试一下利用&进行连接,我们输入127.0.0.1进行测试,发现下方成功显示出了命令结果,则表示注入成功。
    • 那么我们来看一下代码是什么导致了这个结果。
    <?php 
    
    if( isset( $_POST[ 'Submit' ]  ) ) { 
        // Get input 
        $target = $_REQUEST[ 'ip' ]; 
    
        // Set blacklist 
        $substitutions = array( 
            '&&' => '', 
            ';'  => '', 
        ); 
    
        // Remove any of the charactars in the array (blacklist). 
        $target = str_replace( array_keys( $substitutions ), $substitutions, $target ); 
    
        // Determine OS and execute the ping command. 
        if( stristr( php_uname( 's' ), 'Windows NT' ) ) { 
            // Windows 
            $cmd = shell_exec( 'ping  ' . $target ); 
        } 
        else { 
            // *nix 
            $cmd = shell_exec( 'ping  -c 4 ' . $target ); 
        } 
    
        // Feedback for the end user 
        echo "<pre>{$cmd}</pre>"; 
    } 
    
    ?> 

    这里我们可以看见先对于Low级别而言这里多了一些代码,这段代码的作用就是对输入的字符进行判断若出现‘&&’或‘;’字符则用‘’代替。这样就在一定程度上隔绝了用此类连接符连接的命令注入。这是明显的黑名单做法,可还是不能有效的阻挡命令注入。

    High级别

    我们在依次使用不同的连接符或管道符进行测试,我们发现只有管道符 ‘|’ 对命令进行连接才能实现测试。通过刚刚Medium级别,我们同样猜测这里应该同样的采用了黑名单的做法,不过相对于Medium级别的扩大了黑名单的内容。接下来我们看一下High级别的代码。

    
    <?php 
    
    if( isset( $_POST[ 'Submit' ]  ) ) { 
        // Get input 
        $target = trim($_REQUEST[ 'ip' ]); 
    
        // Set blacklist 
        $substitutions = array( 
            '&'  => '', 
            ';'  => '', 
            '| ' => '', 
            '-'  => '', 
            '$'  => '', 
            '('  => '', 
            ')'  => '', 
            '`'  => '', 
            '||' => '', 
        ); 
    
        // Remove any of the charactars in the array (blacklist). 
        $target = str_replace( array_keys( $substitutions ), $substitutions, $target ); 
    
        // Determine OS and execute the ping command. 
        if( stristr( php_uname( 's' ), 'Windows NT' ) ) { 
            // Windows 
            $cmd = shell_exec( 'ping  ' . $target ); 
        } 
        else { 
            // *nix 
            $cmd = shell_exec( 'ping  -c 4 ' . $target ); 
        } 
    
        // Feedback for the end user 
        echo "<pre>{$cmd}</pre>"; 
    } 
    
    ?> 

    果然如同Medium级别一样采用的是黑名单方法,并扩大了限制的字符,在一定程度上限制了命令注入,但并没有起到实际作用。

    Impossible级别

    我们在依次进行输入,发现任何连接符和管道符都实现不了命令注入。并下面提示

    ERROR: You have entered an invalid IP.

    跟之前几个级别提示的

    Ping 请求找不到主机 127.0.0.1dir。请检查该名称,然后重试。

    这些无法判断服务器是怎样处理输入的数据,所以这里我们就直接看一下代码。

    ?php 
    
    if( isset( $_POST[ 'Submit' ]  ) ) { 
        // Check Anti-CSRF token 
        checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); 
    
        // Get input 
        $target = $_REQUEST[ 'ip' ]; 
        $target = stripslashes( $target ); 
    
        // Split the IP into 4 octects 
        $octet = explode( ".", $target ); 
    
        // Check IF each octet is an integer 
        if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) { 
            // If all 4 octets are int's put the IP back together. 
            $target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3]; 
    
            // Determine OS and execute the ping command. 
            if( stristr( php_uname( 's' ), 'Windows NT' ) ) { 
                // Windows 
                $cmd = shell_exec( 'ping  ' . $target ); 
            } 
            else { 
                // *nix 
                $cmd = shell_exec( 'ping  -c 4 ' . $target ); 
            } 
    
            // Feedback for the end user 
            echo "<pre>{$cmd}</pre>"; 
        } 
        else { 
            // Ops. Let the user name theres a mistake 
            echo '<pre>ERROR: You have entered an invalid IP.</pre>'; 
        } 
    } 
    
    // Generate Anti-CSRF token 
    generateSessionToken(); 
    
    ?> 

    我们发现这里还添加了token参数的检验,杜绝了CSRF漏洞的利用,并且这里我们发现在代码中,其限制了输入数据的格式,也就是说这里采用了白名单的做法,只有输入的格式跟白名单的一样才能通过验证,其他的都不行。这样就基本上杜绝了命令注入。

    展开全文
  • a)、自动的客户端脚本分析器,允许Ajax和Web 2.0应用程序进行安全性测试 b)、业内最先进且深入的SQL 注入和跨站脚本测试 c)、高级渗透测试工具,例如HTTP Editor 和HTTP Fuzzer d)、可视化宏记录器帮助您轻松测试...
  • 是一个英文版的网络安全扫描工具,Web开发人员可以利用这个软件来检测自己开发的漏洞,英文不好的开发人员请从网站搜索它的相关操作文档,它具有以下功能: ◆AcuSensor 技术 ◆自动的客户端脚本分析器,允许 Ajax...
  • 对于绝大部分的web应用攻击都是没什么特定目标的大范围漏洞...SQL注入漏洞,SQL注入依然活跃,安全监控公司的研究显示,SQL注入攻击长期以来一直都是最普遍的web攻击方式,占该公司客户报告事件的55%,不能心存侥...
  • Web漏洞扫描器-AWVS

    2020-04-21 22:02:25
    漏洞扫描是指基于漏洞数据库,通过扫描等手段指定的远程或者本地计算机系统的安全脆弱性进行检测,发现课利用楼梯的一种安全检测(渗透挂机)行为。 二、WEB漏洞扫描器 针对于Web应用程序所开发的漏洞扫描器,例如...
  • 漏洞扫描是指基于漏洞数据库,通过扫描等手段指定的远程或者本地计算机系统的安全脆弱性进行检测,发现可利用漏洞的一种安全检测(渗透攻击)行为。 Web漏洞扫描器: 针对于Web应用程序所开发的漏洞扫描器,例如...
  • SQL注入状态扫描技术不同于传统的针对错误反馈判断是否存在注入漏洞的方式,而采用状态检测来判断。所谓状态检测,即:针对某一链接输入不同的参数,通过网站反馈的结果使用向量比较算法进行比对判断,从而确定该...
  • 2) 自动的客户端脚本分析器,允许 Ajax 和 Web 2.0 应用程序进行安全性测试。 3) 业内最先进且深入的 SQL 注入和跨站脚本测试。 4) 高级渗透测试工具,例如 HTTP Editor 和 HTTP Fuzzer。 5) 可视化宏记录器...
  • 不同于传统的针对错误反馈判断是否存在注入漏洞的方式,而采用状态检测来判断。所谓状态检测,即:针 某一链接输入不同的参数,通过网站反馈的结果使用向量比较算法进行比对判断,从而确定该链接是否 为注入点...
  • 面对Web网站存在的种种安全漏洞问题,文章通过大量SQL注入攻击报文的攻击特征进行总结分析,结合SQL注入攻击的攻击特征和攻击原理,提出了一种基于通用规则的SQL注入攻击检测与防御的方法,并利用SQL注入检测工具...
  • 不同于传统的针对错误反馈判断是否存在注入漏洞的方式,而采用状态检测来判断。所谓状态检测,即:针对某一链接输入不同的参数,通过网站反馈的结果使用向量比较算法进行比对判断,从而确定该链接是否为注入点,此...
  • 什么是SQL注入?...广泛性:任何一个基于SQL语言的数据库都可能被攻击,很多开发人员在编写Web应用程序时未输入参数、Web表单、cookie等接受到的值进行规范性验证和检测,通常会出现SQL注入漏洞 隐蔽性:SQL
  • a)、自动的客户端脚本分析器,允许Ajax和Web 2.0应用程序进行安全性测试 b)、业内最先进且深入的SQL 注入和跨站脚本测试 c)、高级渗透测试工具,例如HTTP Editor 和HTTP Fuzzer d)、可视化宏记录器帮助您轻松测试...
  • 文章设计了基于语义分析的SQL注入行为检测方案,能够攻击行为从语义的角度进行检测。该方案包括数据预处理,抽象语法树,语义分析等功能模块,针对漏洞相关语言的编译器,通过攻击者输入的内容串进行语法语义检查来...
  • 使用Python开发,客户端通过scapy采集本机的HTTP流量,转发到服务器,由服务器对漏洞检测任务进行统一管理,分配给Slave节点执行。 Client 客户端,在setting.ini中进行HTTP流量采集和服务器地址的相关配置后,运行...
  • 不同于传统的针对错误反馈判断是否存在注入漏洞的方式,而采用状态检测来判断。所谓状态检测,即:针对某一链接输入不同的参数,通过网站反馈的结果使用向量比较算法进行比对判断,从而确定该链接是否 为注入点,...
  • XFF,是X-Forwarded-for的缩写,XFF注入是SQL注入的一种,该注入原理是通过修改X-Forwarded-for头带入系统的dns进行sql注入,从而得到网站的数据库内容。 漏洞前提:HTTP Header中存在X-Forwarded-for参数的调用...
  • 跨站脚本是一种常见的针对Web应用程序安全的漏洞攻击方式。恶意用户利用漏洞将恶意脚本注入网页之中,当用户浏览该网页时,便会触发脚本,导致攻击行为产生。为此,针对各种变形跨站脚本攻击难以检测问题,一种...
  • 漏洞的形成的根本原因是程序没有用户输入的反序列化字符串进行检测,导致反序列化过程可以被恶意控制,进而造成代码执行、getshell等一系列不可控的后果。反序列化漏洞并不是PHP特有,也存在于Java、Python等语言...
  • 所谓的SQL注入测试就是通过利用目标网站的某个页面缺少用户传递参数控制或者控制的不够好的情况下出现的漏洞,从而达到获取、修改、删除数据,甚至控制数据库服务器、Web服务器的目的的测试方法。Pangolin能够...
  • 对象1....???...???CTF反序列化小真题-无类执行-实例安装使用postman用burp写数据提交2....原理:未用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行 SQL注入,目录遍历等不可控后果
  • 漏洞笔记

    2021-03-02 16:15:24
    常见漏洞学习笔记 1越权漏洞 ...检测 抓去a用户功能链接,然后登录b用户对此链接进行访问 抓去a用户功能链接,修改id为b的id,查看是否能看b的相关数据 ...对注入进行测试, 单引号,双引号–>报错
  • 所谓的SQL注入测试就是通过利用目标网站的某个页面缺少用户传递参数控制或者控制的不够好的情况下出现的漏洞,从而达到获取、修改、删除数据,甚至控制数据库服务器、Web服务器的目的的测试方法。Pangolin能够通过...
  • 在今年的黑帽大会上 James Kettle 讲解了《Server-Side Template Injection: RCE for the modern webapp》,从服务端模板注入的形成到检测,再到...一、模板注入与常见Web注入 就注入类型的漏洞来说,常见 Web...
  • 哈喽大家好,近期我们Sine安全客户平台进行渗透测试的时候,发现有一些命令执行的漏洞测试语句和函数,导致服务器被提权被入侵,上一节提到XSS跨站脚本攻击检测方法,本章来总和一下脚本执行命令的详细检测手段,以及绕...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 187
精华内容 74
关键字:

对web注入漏洞进行检测