攻防世界xctf writeup ics-07


文章目录

      • xctf_writeup_ics-07
        • 审计代码
        • 审计写入文件代码
        • 构造最后的payload
        • 菜刀连接的到webshell

xctf_writeup_ics-07

审计代码

浏览页面 发现了view-source链接 ,接下来审计代码


    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');  //无论page是什么最后都是会定向到flag.php的 这里没有用
    }

    ?>

关键代码

if (isset($_GET[id]) && floatval($_GET[id]) !== '1' && substr($_GET[id], -1) === '9')

***floatval***函数:获取出参数的浮点数形式


$var = '122.34343The';
$float_value_of_var = floatval ($var);
print $float_value_of_var; // 打印出 122.34343
?>

substr函数

substr ( string s t r i n g ‘ , i n t ‘ string` , int ` string,intstart[, int$length] ) : string

$rest = substr("abcdef", -1);    // 返回 "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("
something wae wrong !
"
); if($result){ echo "id: ".$result->id."
"
; echo "name:".$result->user."
"
; $_SESSION['admin'] = True; } ?>

***所以可以构建payload如下:***:

id=1' -- +9

其实只要1和9之间是任何字符都可

mysql_real_escape_string ( string u n e s c a p e d s t r i n g ‘ [ , r e s o u r c e ‘ unescaped_string` [, resource ` unescapedstring[,resourcelink_identifier= NULL ] ) : string

本函数将 unescaped_string 中的特殊字符转义,并计及连接的当前字符集

上面构造了id已经获取了admin权限

审计写入文件代码


     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);
       }
     }
     ?>

此处关键的是如何绕过正则表达式

if(preg_match('/.+\.ph(p[3457]?|t|tml)$/i', $filename)

以上匹配的是:php php3 php4 php5 php7 phpt phptml

绕过方法有:filename.php/.../filename.php/.

原因是:文件名中不允许带有/ 因为/表示目录的分割符 在php中,如果保存的文件中含有/ 会自动省略/后面的内容,/后面的.是为了达到匹配最后一个.的效果,

前者直接在/uploaded/backup/文件下 ,后者则是直接绕过了chdir函数

文件在/uploaded/

构造最后的payload

http://159.138.137.79:56125/uploaded/backup/下可以看到构造的文件

攻防世界xctf writeup ics-07_第1张图片

菜刀连接的到webshell

攻防世界xctf writeup ics-07_第2张图片

你可能感兴趣的:(攻防世界xctf writeup ics-07)