一、命令与代码执行原理
网站在开发时对外部输入的参数未经严格过滤,并使用危险函数导致引入的参数被当作命令或代码执行。
二、系统命令与代码执行的函数
系统命令执行函数:
- assert()
- system()
- passthru()
- exec()
- pcntl_exec()
- shell_exec()
- popen()
- proc_open()
- ``(反单引号)
代码执行函数:
- eval()
- assert()
- call_user_func()
- base64_decode()
- gzinflate()
- gzuncompress()
- gzdecode()
- str_rot()
三、命令执行测试方法
拼接命令:& && | || ;
例:ping 127.0.0.1 & ver
代码层面:
<?php
if(isset($_POST['submit']) && $_POST['ipaddress']!=null){ // 检查是否提交了表单且 'ipaddress' 参数不为空
$ip=$_POST['ipaddress']; // 将 'ipaddress' 参数的值赋给变量 $ip
if(stristr(php_uname('s'), 'windows')){ // 判断操作系统是否为 Windows
$result.=shell_exec('ping '.$ip); // 在 Windows 系统下执行的 ping 命令
}else {
$result.=shell_exec('ping -c 4 '.$ip); // 在非 Windows 系统下执行指定次数的 ping 命令
}
}
?>
例:开发使用eval()函数
代码层面:
<?php
if(isset($_POST['submit']) && $_POST['txt']!= null){ // 检查是否提交了表单且文本输入不为空
if(@!eval($_POST['txt'])){ // 尝试执行用户输入的代码,若执行失败
$html.="<p>你喜欢的字符还挺奇怪的!</p>"; // 输出提示信息
}
}
?>
四、命令执行漏洞经常存在的地方
- 路由器、防火墙、自动化运维平台等一些硬件设备界面,它们通常在网络调试中会留有网络测试窗口。
- 中间件、系统框架等已知漏洞,在百度上都可以搜到以往的命令执行漏洞。
- 只要带参数的地方都可能出现命令执行漏洞。
五、struts2框架命令执行漏洞复现
1、怎么判断网站是否为struts2框架?
参考:红队第2篇:区分Spring与Struts2框架的几种新方法-腾讯云开发者社区-腾讯云 (tencent.com)
扩展名判断:.action .do
报错判断:访问不存在的资源报错判断
抓包判断
2、struts全版本漏洞检测工具探测
工具链接:百度网盘 请输入提取码
六、反序列化漏洞
反序列化漏洞就是将一个对象转化为可以传输的字符串形式(将恶意代码构建的对象转化为字符串的形式),利用反序列化的函数(serialize() 序列化函数)(unserialize() 反序列化函数),转化为原有的对象形式进行注入攻击。
1、序列化漏洞的利用条件
序列化和反序列化的内容是用户可以控制,且后台不正当的使用了PHP中的魔法函数就会导致安全问题
- 序列化内容用户可有控制
- 后台使用了不正当的PHP魔法函数
2、常见的魔法函数
- __construct()当一个对象创建时被调用
- __destruct()当一个对象销毁时被调用
- __sleep() 在对象在被序列化之前运行
- __toString()当一个对象被当作一个字符串使用
- __wakeup将在序列化之后立即被调用