返回顶部
首页 > 资讯 > 精选 >SQL注入语义分析库libinjection怎么使用
  • 583
分享到

SQL注入语义分析库libinjection怎么使用

2023-07-05 16:07:49 583人浏览 薄情痞子
摘要

本文小编为大家详细介绍“sql注入语义分析库libinjection怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“SQL注入语义分析库libinjection怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习

本文小编为大家详细介绍“sql注入语义分析库libinjection怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“SQL注入语义分析库libinjection怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

    SQL注入语义分析库libinjection

    什么是libinjection

    libinjection是一款用于防御SQL注入攻击的开源软件库。它是由C语言编写的,可以嵌入到任何WEB应用程序中,并可以较为准确地检测和防止恶意SQL注入语句。libinjection采用了基于正则表达式的技术来识别和拦截SQL注入攻击,同时其开放源代码的特点也使得其具备了较高的可定制性和扩展性。

    libinjection是一个基于C语言的SQLi词法解析分析器,它可以通过对不同语句进行词法分析和语法分析来实现对SQL语句以及html语句的解析。

    在此之前,市场上绝大多数的WAF都是基于正则匹配(Regex)的,很多的WAF(防火墙)以及NGWAF(下一代防火墙)出于性能方面的考虑,都会选择使用这个库来代替常规的正则表达式。

    ModSecurity,它是Apache和Nginx的流行WAF。ModSecurity捆绑了libinjection,mod_security从2.7.4版本开始就支持libinjection(dectectSQLi-v2.7.4、detectXSS-v2.8.0)。

    libinjection和正则表达式

    libinjection和正则表达式都是非常有效的防御SQL注入攻击的技术,但两者之间有一些差异和优劣。

    libinjection
    libinjection是一个专门用于检测SQL注入攻击的库,其使用了一个基于机器学习算法来分析请求中的SQL语句。与正则表达式相比,它有以下优点:

    • 更准确:libinjection使用机器学习算法分析SQL语句,因此可以更准确地检测SQL注入攻击,同时减少误报率。

    • 更容易维护:libinjection的规则库相对较小,易于维护。

    • 更快:libinjection的性能要比正则表达式好,响应时间更短。

    正则表达式
    正则表达式是一种常见的用于检测和防御各种Web应用程序攻击(包括SQL注入攻击)的技术。与libinjection相比,它有以下优点:

    更通用:正则表达式不仅可用于检测SQL注入攻击,而且还可用于检测其他类型的Web应用程序攻击。更灵活:正则表达式可以使用各种模式和操作符,从而可以灵活地处理各种复杂情况。更可配置性:正则表达式的规则库可以根据实际情况进行定制和配置。

    总体而言,libinjection可能比正则表达式更准确,更容易维护,并具有更快的性能,但正则表达式更通用,更灵活,具有更高的可配置性。因此,为了获得最佳的安全性能,您可能需要考虑同时使用这两种技术。

    modsecurity 如何使用libinjection

    下面是使用libinjection和ModSecurity进行SQL注入检测和预防的步骤:

    安装ModSecurity
    安装并配置ModSecurity,使其可以与您的Web服务器一起使用。

    安装libinjection
    安装libinjection并将其与ModSecurity集成。如果您使用的是Debian或ubuntu,可以使用以下命令进行安装:

    sudo apt-get install libinjection-dev

    在ModSecurity中使用libinjection
    将ModSecurity配置为使用libinjection来检测SQL注入攻击。以下是一个示例ModSecurity规则,可用于检测SQL注入攻击:

    SecRule ARGS "@detectSQLi" \    "id:1,\    phase:2,\    t:none,\    t:lowercase,\    t:replaceComments,\    t:compressWhitespace,\    ctl:auditLogParts=+E,\    ctl:debugLogParts=+E,\    ctl:requestBodyProcessor=XML,\    ctl:ruleEngine=on,\    ctl:auditEngine=on,\    ctl:ruleRemoveByTag=abcd \    ctl:ruleRemoveById=1 \    libinjection_check"SecRule &TX:INJECTION @eq 1 \    "id:2,\    phase:2,\    t:none,\    ctl:auditLogParts=+E,\    ctl:debugLogParts=+E,\    ctl:requestBodyProcessor=XML,\    ctl:ruleEngine=on,\    ctl:auditEngine=On,\    ctl:ruleRemoveByTag=abcd \    ctl:ruleRemoveById=2 \    block"

    这个规则中包含了两个SecRule。第一个将对输入请求进行规范化和过滤,然后使用libinjection检测SQL注入攻击。第二个SecRule将根据检测结果来做出相应的动作,例如阻止访问请求或将其记录在日志中。

    ModSecurity只用了libinjection防御sql注入吗?

    ModSecurity不仅使用了libinjection,还使用了正则表达式等多种技术来进行SQL注入攻击防御。实际上,在ModSecurity中使用正则表达式是非常常见的一种方法,因为这种方法可以用于检测和阻止各种类型的Web应用程序攻击,包括SQL注入攻击。

    以下是一个示例ModSecurity规则,使用正则表达式检测SQL注入攻击:

    SecRule ARGS "@detectSQLi" \    "id:1,\    phase:2,\    t:none,\    t:lowercase,\    t:replaceComments,\    t:compressWhitespace,\    ctl:auditLogParts=+E,\    ctl:debugLogParts=+E,\    ctl:requestBodyProcessor=XML,\    ctl:ruleEngine=on,\    ctl:auditEngine=on,\    ctl:ruleRemoveByTag=abcd \    ctl:ruleRemoveById=1 \    libinjection_check"SecRule &TX:INJECTION @eq 1 \    "id:2,\    phase:2,\    t:none,\    ctl:auditLogParts=+E,\    ctl:debugLogParts=+E,\    ctl:requestBodyProcessor=XML,\    ctl:ruleEngine=on,\    ctl:auditEngine=On,\    ctl:ruleRemoveByTag=abcd \    ctl:ruleRemoveById=2 \    block"

    虽然语义分析引擎能够更准确地识别和阻止恶意流量,但是正则表达式仍然是一种非常重要的检测方式,可以用来完成一些特定的任务。

    例如,对于某些规则化的数据格式,如邮件地址、电话号码和身份证号码等,使用正则表达式可以快速、准确地进行匹配判断。此外,正则表达式还可以用来检测各种类型的注入攻击(如SQL注入和XSS攻击)等漏洞利用行为。

    因此,在实际的安全防御中,WAF通常会同时采用多种技术手段,包括语义分析引擎和正则表达式等,以提高其检测能力,并最大程度地保护Web应用程序免受攻击威胁。

    WAF研发领域,语义分析相对于正则表达式先进性的研究

    多年以来,WAF对攻击的检测,通常使用正则表达式,典型的如ModSecurity。作为老牌的WAF,其拥有庞大的正则规则库。其检测率高,但也正因为规则数量庞大,正则逐一匹配,此过程速度慢,性能低。

    对于同步检测的WAF产品,部署并对网站提供防护后,会带来不小的访问性能影响。

    新兴的WAF产品,渐有使用语义分析引擎取代正则表达式检测。
    其优势究竟何在,性能又能提升多少?

    WAF研发领域,语义分析相对于正则表达式先进性的研究

    libinjection架构和使用

    SQL注入语义分析库libinjection怎么使用

    官方使用示例

    #include <stdio.h>#include <string.h>#include "libinjection.h"int main(int arGC, const char* argv[]){    char fingerprint[8];    const char* input;    size_t slen;    int issqli;    if (argc < 2) {        fprintf(stderr, "Usage: %s inputstring\n", argv[0]);        return -1;    }    input = argv[1];    slen = strlen(input);    issqli = libinjection_sqli(input, slen, fingerprint);    if (issqli) {        printf("sqli with fingerprint of '%s'\n", fingerprint);    } else {        printf("not sqli\n");    }    return issqli;}

    具体的检查sql注入实现为 libinjection_is_sqli

    int libinjection_is_sqli(struct libinjection_sqli_state * sql_state){    const char *s = sql_state->s;    size_t slen = sql_state->slen;        if (slen == 0) {        return FALSE;    }        libinjection_sqli_fingerprint(sql_state, FLAG_QUOTE_NONE | FLAG_SQL_ANSI);    if (sql_state->lookup(sql_state, LOOKUP_FINGERPRINT,                          sql_state->fingerprint, strlen(sql_state->fingerprint))) {        return TRUE;    } else if (reparse_as_mysql(sql_state)) {        libinjection_sqli_fingerprint(sql_state, FLAG_QUOTE_NONE | FLAG_SQL_Mysql);        if (sql_state->lookup(sql_state, LOOKUP_FINGERPRINT,                              sql_state->fingerprint, strlen(sql_state->fingerprint))) {            return TRUE;        }    }        if (memchr(s, CHAR_SINGLE, slen)) {        libinjection_sqli_fingerprint(sql_state, FLAG_QUOTE_SINGLE | FLAG_SQL_ANSI);        if (sql_state->lookup(sql_state, LOOKUP_FINGERPRINT,                              sql_state->fingerprint, strlen(sql_state->fingerprint))) {            return TRUE;        } else if (reparse_as_mysql(sql_state)) {            libinjection_sqli_fingerprint(sql_state, FLAG_QUOTE_SINGLE | FLAG_SQL_MYSQL);            if (sql_state->lookup(sql_state, LOOKUP_FINGERPRINT,                                  sql_state->fingerprint, strlen(sql_state->fingerprint))) {                return TRUE;            }        }    }        if (memchr(s, CHAR_DOUBLE, slen)) {        libinjection_sqli_fingerprint(sql_state, FLAG_QUOTE_DOUBLE | FLAG_SQL_MYSQL);        if (sql_state->lookup(sql_state, LOOKUP_FINGERPRINT,                              sql_state->fingerprint, strlen(sql_state->fingerprint))) {            return TRUE;        }    }        return FALSE;}

    这段代码是用于检测 SQL 注入攻击的,通过调用 libinjection 库对输入的 SQL 查询语句进行指纹识别,并判断是否存在于已知的 SQL 注入指纹库中。

    • 首先获取输入字符串 s 和其长度 slen。如果输入字符串长度为0,则直接返回 FALSE,不需要进行检测。

    • 接着,对输入的 SQL 查询语句进行指纹识别,并标记 FLAG_QUOTE_NONE 和 FLAG_SQL_ANSI 标志位。然后通过 sql_state->lookup 函数查找该指纹是否已经存在于数据库中,如果存在则返回 TRUE。

    “test input as-is” 的意思是对输入的 SQL 语句进行原样测试,即不进行任何转义或处理。这相当于将输入的 SQL 语句作为一个整体进行指纹识别,并标记 FLAG_QUOTE_NONE 和 FLAG_SQL_ANSI 标志位,在已知的 SQL 注入指纹库中查找是否存在相同的指纹。如果存在,则说明该输入可能是 SQL 注入攻击,否则继续进行其他检测。通常情况下,如果输入字符串包含单引号或双引号字符或者 SQL 关键字,就需要进行进一步的检测和处理。

    • 如果该指纹不存在于数据库中,则尝试将查询语句解析为 MySQL 语法,通过 reparse_as_mysql 函数进行转换。如果转换成功,则再次调用 libinjection_sqli_fingerprint 函数对转换后的 SQL 查询语句进行指纹识别,并标记 FLAG_QUOTE_NONE 和 FLAG_SQL_MYSQL 标志位。最后再次通过 sql_state->lookup 函数查找该指纹是否存在于数据库中,如果存在则返回 TRUE。

    • 接下来,如果输入的字符串中包含单引号字符,则调用 libinjection_sqli_fingerprint 函数对 SQL 查询语句进行指纹识别,并标记 FLAG_QUOTE_SINGLE 和 FLAG_SQL_ANSI 标志位。然后通过 sql_state->lookup 函数查找该指纹是否已经存在于数据库中,如果存在则返回 TRUE。

    • 如果该指纹不存在于数据库中,则尝试将查询语句解析为 MySQL 语法,通过 reparse_as_mysql 函数进行转换。如果转换成功,则再次调用 libinjection_sqli_fingerprint 函数对转换后的 SQL 查询语句进行指纹识别,并标记 FLAG_QUOTE_SINGLE 和 FLAG_SQL_MYSQL 标志位。最后再次通过 sql_state->lookup 函数查找该指纹是否存在于数据库中,如果存在则返回 TRUE。

    • 最后,如果输入的字符串中包含双引号字符,则调用 libinjection_sqli_fingerprint 函数对 SQL 查询语句进行指纹识别,并标记 FLAG_QUOTE_DOUBLE 和 FLAG_SQL_MYSQL 标志位。然后通过 sql_state->lookup 函数查找该指纹是否已经存在于数据库中,如果存在则返回 TRUE。

    • 如果输入字符串没有被识别为 SQL 注入攻击,则最后返回 FALSE。

    总结,这段代码是用于检测 SQL 注入攻击,通过指纹识别技术来进行检测和防御。同时支持 ANSI SQL 和 MySQL 两种语法,并能够检测包含单引号和双引号字符以及 SQL 关键字的字符串。

    例如,输入常用的SQL注入的检测语句 :&rsquo; and 1=1
    libinjection会将其转换为s&1,其中单引号依据定义被转换为s,and被转换为&,数字被转换为1。

    libinjection在转换完后,通过二分查找算法对内置的特征进行匹配,匹配到则将SQL注入识别特征复制进fingerprint变量并返回。

    转换 搜索关键字: sql_keyWords ,在文件libinjection_sqli_data.h 中~!

    在libinjection中,将SQL关键字转换为单个字母时使用的字符集通常是a-z或A-Z。这意味着只有26个不同的字母可以用来表示所有的SQL关键字。

    为了解决这个问题**,libinjection使用了一些技巧来扩展字母表的大小。其中一个技巧是引入数字后缀。例如,对于两个关键字SELECT和SET,它们都会被转换为字母s。为了避免冲突,第二个关键字SET会被转换为字母s2。**

    另一个技巧是使用大写字母表示特殊的关键字。例如,LIMIT和OFFSET是MySQL和postgresql中常用的关键字,它们被分别映射为L和O。这样做的好处是,即使一个关键字被映射为小写字母,仍然可以通过使用大写字母来表示其他特殊关键字,以避免冲突。

    需要注意的是,虽然仅有26个字母可以用来表示所有的SQL关键字,但由于上面提到的技巧,libinjection能够支持更多的关键字,并确保每个关键字都使用唯一的单个字母来表示。

    读到这里,这篇“SQL注入语义分析库libinjection怎么使用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

    --结束END--

    本文标题: SQL注入语义分析库libinjection怎么使用

    本文链接: https://lsjlt.com/news/353515.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • SQL注入语义分析库libinjection怎么使用
      本文小编为大家详细介绍“SQL注入语义分析库libinjection怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“SQL注入语义分析库libinjection怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习...
      99+
      2023-07-05
    • 使用PDO防sql注入的原理分析
      前言 本文使用pdo的预处理方式可以避免sql注入。下面话不多说了,来一起看看详细的介绍吧 在php手册中'PDO--预处理语句与存储过程'下的说明: 很多更成熟的数据库都支持预处理语句的概念。什么是...
      99+
      2024-04-02
    • 数据库中sql注入的示例分析
      这篇文章将为大家详细讲解有关数据库中sql注入的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先可能大家都会问什么是sqlSql是数据库的一种类型,是用来存储网...
      99+
      2024-04-02
    • 数据库之SQL注入的示例分析
      小编给大家分享一下数据库之SQL注入的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、产生SQL注入原因开发代码的时候没有全面考虑到网络安全性,特别是在...
      99+
      2023-06-20
    • sql注入怎么插入语句
      sql注入中插入语句的语法格式为:Insert into 表名(字段1,字段2,字段3,...)values (值1,值2,值3...);示例://插入一个user用户表,字段有id、name,值为1和linInsert into 'use...
      99+
      2024-04-02
    • sql注入工具怎么使用
      首先需要说明的是,SQL注入是一种非法的攻击手段,使用SQL注入工具进行攻击是违法的行为,不应该进行。下面仅仅是为了提供知识参考,不...
      99+
      2023-05-15
      sql注入工具 sql
    • sql插入语句怎么使用
      本篇内容介绍了“sql插入语句怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
      99+
      2023-02-13
      sql
    • SQL注入全过程的深入分析是怎样的
      这篇文章将为大家详细讲解有关SQL注入全过程的深入分析是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。分析了SQL注入全过程,具体如下:初步注入--绕...
      99+
      2024-04-02
    • 使用MyBatis时怎么防止SQL注入
      要防止SQL注入攻击,可以采取以下几种方式: 使用预编译语句:在MyBatis中,使用#{}来代替直接拼接参数值,这样可以自动为...
      99+
      2024-05-08
      MyBatis
    • sql注入语句有三种分别是什么
      这篇文章主要介绍sql注入语句有三种分别是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!sql注入语句有三种,分别是:1、数字型注入点,语句如“select * fro...
      99+
      2024-04-02
    • MyBatis的SQL语句性能分析工具怎么使用
      MyBatis的SQL语句性能分析工具可以帮助开发人员查看和分析SQL语句的性能,以找出潜在的性能问题并进行优化。要使用MyBati...
      99+
      2024-05-08
      MyBatis SQL
    • 深入解析SQL的定义和使用范围
      SQL的定义及应用领域详解摘要:本文旨在介绍 SQL(Structured Query Language)的定义及其在不同应用领域中的具体应用。首先,我们将简要介绍 SQL 的定义和历史背景。接着,我们将深入探讨 SQL 在数据管理、数据分...
      99+
      2023-12-28
      SQL 定义 应用 领域
    • 分页参数怎么防止SQL注入
      分页参数防止SQL注入的方法:对任何输入信息都必须进行参数过滤,php实例:$this->load->library ( 'pagination' );$config ['base_url'] = site_url () . '/guest...
      99+
      2024-04-02
    • 怎么使用SQL语句插入数据
      这篇文章主要介绍怎么使用SQL语句插入数据,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!使用SQL语句操作数据表单击phpMyAdmin主界面中的超链接,打开SQL语句编辑区,输入完...
      99+
      2024-04-02
    • 怎么用PL/SQL分析数据库日志
      在 PL/SQL 中分析数据库日志可以通过以下步骤实现: 创建一个存储过程或函数来读取数据库日志文件。可以使用 UTL_FILE...
      99+
      2024-05-08
      PL/SQL
    • 怎么使用prepared statement解决SQL注入问题
      使用prepared statement可以有效地防止SQL注入问题。下面是使用prepared statement的一般步骤:1....
      99+
      2023-08-08
      SQL
    • HTML基本语法和语义使用实例分析
      本文小编为大家详细介绍“HTML基本语法和语义使用实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“HTML基本语法和语义使用实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新...
      99+
      2024-04-02
    • 常用的攻击手段SQL注入的示例分析
      这篇文章主要介绍常用的攻击手段SQL注入的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、概述1. 攻击原理SQL注入是较常见的网络攻击方式之一,主要针对WEB应用,利用程序员编写代码的疏忽,对于连接数据库...
      99+
      2023-06-27
    • HTML5数据库的SQL语句怎么使用
      这篇文章主要介绍“HTML5数据库的SQL语句怎么使用”,在日常操作中,相信很多人在HTML5数据库的SQL语句怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”HTML...
      99+
      2024-04-02
    • 数据库sql create table语句怎么使用
      CREATE TABLE是用于在数据库中创建一个新表的SQL语句。 基本语法如下: CREATE TABLE 表名 ( 列名1 数据...
      99+
      2024-04-09
      数据库
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作